Выполните план по снижению веса на 99,9% для настольных приложений, созданных с использованием веб-технологий

Electron - популярная среда выполнения, которая позволяет создавать кроссплатформенные настольные приложения с использованием веб-технологий. Привлекательность огромна: разработчик программного обеспечения, который уже знает HTML, JavaScript и CSS, может использовать эти знания и превратить свой веб-сайт в настоящее приложение, которое работает на всех настольных компьютерах ПК и Mac. Некоторые из наиболее широко используемых приложений, созданных с помощью Electron, - это настольный клиент Slack, Microsoft Visual Studio Code и редактор Atom.

Обратной стороной подхода Electron является то, что каждое приложение поставляется с копией двух крупных программных фреймворков, Node.js и Chromium. Последний технически является движком веб-браузера, но по мере расширения веб-платформы скромный браузер превратился в обширный программный уровень, достаточно большой, чтобы быть собственной операционной системой. Брет Виктор посчитал и насчитал 25 миллионов строк кода в Chromium! (По оценкам, в Windows 10 содержится от 27 до 50 миллионов строк кода.)

Итак, каждое приложение Electron, по сути, несет в себе операционную систему. Приложение «Hello World» для Electron весит 115 МБ. Этот код существует как на диске, так и в памяти: при запуске приложения Electron оно должно загрузить эти библиотеки в ОЗУ. Поскольку приложения Electron упаковываются отдельно, каждое приложение загружает отдельную копию библиотек (даже если библиотеки имеют одну и ту же версию, операционная система этого не знает).

Эти накладные расходы на самом деле не проблема для больших приложений, таких как Visual Studio Code. Это действительно проблема для небольших приложений, которые хотели бы использовать модель Electron. Многие разработчики сейчас используют Electron для создания настольных утилит и даже виджетов строки меню (те маленькие всплывающие меню, которые находятся в правом верхнем углу строки меню Mac). У обычного пользователя настольного компьютера может быть открыто с десяток утилит. Если у каждого из них есть копия всего стека Electron в памяти, он тратит больше гигабайта практически бесплатно. Объемы памяти в последние годы не сильно увеличились (дорогие MacBook по-прежнему имеют 8 ГБ), так что это не кажется устойчивым направлением.

Как похудеть на 99,9% за полдень

Для небольших приложений был бы другой способ. Вместо того, чтобы связывать веб-среду выполнения с каждым приложением, они могли бы использовать предоставляемую системой веб-среду выполнения. И в macOS, и в Windows есть современный движок браузера (WebKit на Mac, Edge в Windows). Этот движок обычно уже загружен в память. Используя предоставляемую системой среду выполнения, приложения в стиле Electron могут стать намного тоньше как с точки зрения занимаемого места на диске, так и с точки зрения использования оперативной памяти.

Я только что выпустил первую версию среды выполнения под названием Electrino, которая делает именно это. Его цель - быть API-совместимым с Electron (то есть вы можете просто скопировать файлы своего приложения JavaScript, использующего Electron, в двоичный файл Electrino, и он будет работать).

На скриншоте вверху этой страницы вы можете увидеть сравнение идентичных приложений «Hello World» между Electron и Electrino: размер последнего составляет всего 167 КБ. Это всего 0,1% от размера приложения Electron (приложение Electrino почти в тысячу раз меньше!).

Это сравнение сопровождается огромной оговоркой. Electrino - это просто доказательство правильности концепции. Он реализует именно те API, которые необходимы для запуска Hello World, и ничего больше. (Сам веб-браузер, конечно, полностью функционален; отсутствующие API-интерфейсы относятся к Electron, которые позволяют связать веб-приложение с миром рабочего стола.)

По мере добавления новых API размер Electrino неизбежно будет расти ... Однако я вижу стратегию, которая сводила бы размер создаваемых приложений к минимуму. Поскольку Electrino настолько прост, можно создать инструмент сборки, включающий только код для тех API, которые фактически используются встроенным приложением JavaScript. (Потребность в таком инструменте определенно не является немедленной - в среднесрочной перспективе можно добавить множество API-интерфейсов, не увеличивая двоичный файл Electrino более чем на несколько мегабайт.)

Следующие шаги

Пока что Electrino подходит только для запуска веб-приложений, которые не взаимодействуют с остальной частью операционной системы (из-за отсутствия реализаций API). Чтобы перейти к чему-то действительно полезному, я считаю, что лучшим способом было бы проанализировать реальные небольшие приложения на основе Electron и реализовать только те API, которые им нужны.

Итак, есть ли кто-нибудь с небольшим приложением для Mac на основе Electron, которого вы хотели бы посадить на диету Electrino? Напишите мне, и посмотрим, сможем ли мы заставить его работать!