NW.js_mod
Экспериментальная, более компактная модификация браузерного движка NW.js с применением патчей и утилит ungoogled chromium, агрессивной оптимизацией по разеру и удалением ненужных компонентов на сколько это возможно.
Появлению данной модификации предшествовало несколько факторов.
Во-первых в связи с многими проблемами старой версии движка в проекте CircuitJS1 Desktop Mod необходимо было пересадить проект на куда более новую его версию, но при этом постараться, чтоб весь проект с движком не весил аж полгига, как это уже возможно с новой версией оригинального NW.js. В истории NW.js уже был известен способ его сжатия с помощью UPX, чем я в начале создания своей десктопной версии симулятора электронных цепей и пользовался, однако заметил, что приложение перестает запускаться на некоторых бюджетных ноутбуках, после чего от использования UPX отказался, выбрав наиболее старую, но при этом работоспособную для проекта версию NW.js. Альтернативные варианты – перейти на электрон либо попробовать собрать NW.js из исходников, отключив ненужные компоненты и настроив компилятор на оптимизацию по размеру, что и было реализованно в данной модификации.
Во вторых была идея открывать отдельные экземпляры симулятора электронных схем не только в отдельных окнах, но и в отдельных вкладках и удаленный в NW.js и электроне функционал браузерных вкладок подошел бы вполне удачно, от чего данный функционал хотелось попытаться возродить. Я находил места, где вкладки были удалены, однако позже пришел к выводу, что возрождение хромовских вкладок и написания для них API не даст никаких преимуществ по сравнению с тем, если я их просто нарисую в HTML, да и сложно это все, от чего от данной идеи в итоге отказался.
В третьих с идеей уменьшить итоговый размер бинарника и возродить функционал вкладок появился интерес к исходникам хромиума, который по итогу перебил дальнейшие мысли о переходе на электрон даже несмотря на то, что электрон и без того весил значительно меньше своей основы – браузера хромиум, по сравнению с NW.js, который по сути тащит в себе весь браузер хромиум.
С электроном несколько отдельная тема, когда по сути можно было также влезть в его потраха даже несмотря на особенности сборки, однако была слепая вера, что раз у электрона получилось весить значительно меньше хромиума, то у меня с NW.js может получиться даже лучше. К тому же, глядя на его структуру, уверен, куда лучше, чтоб в электроне копались реальные спецы, чем такие дилетанты, как я. Ломать сам хромиум как-то куда веселее, чем ломать электрон.
Базовая модификация NW.js (v0.64.1-mod1) представляет собой случай, когда в исходники хромиума влезли самым безопасным способом: используя опыт проекта ungoogled chromium и дополнительно отключая ненужные компоненты через args.gn – то, что предусмотрено самими разработчиками chromium. Утилиты ungoogled chromium удаляют ряд бинарных подозрительных файлов и заменяют все адреса, связанные с гуглом, заглушками для борьбы с телеметрией и слежкой со стороны гугла. Патчи ungoogled chromium вычищают некоторые лишние функции браузера, однако это самый минимум в виде того же safebrowsing, встроенных сервисов гугла и пр. Та же телеметрия в фоне работает, просто данные больше не отправляются в гугл.
Базовую модификацию действительно удалось сделать даже чуть меньше по размеру версии электрона, использующей примерно такую же версию хромиума, однако по функционалу она будет явно хуже него. Учитывая, что для модификации выбрана версия двухгодовой давности 0.64.1, были отключены некоторые возможности, связанные с работой некоторых сетевых протоколов и их безопасностью, с расчетом на то, что данная версия будет использоваться исключительно для локальных проектов, не требующих выхода в интернет.
Лицензия: MIT
Платформы: Windows (x32, x64), Linux (x32, x64), MacOS (x64, arm64)
Исходный код: https://github.com/SEVA77/nw.js_mod
Релизы: https://github.com/SEVA77/nw.js_mod/releases
Собрать свой проект, используя данную модификацию, можно через nw-builder, предварительно указав в скрипте или json следующие параметры:
version: "0.64.1-mod1",
flavor: "normal",
downloadUrl: "https://github.com/SEVA77/nw.js_mod/releases/download",
manifestUrl: "https://raw.githubusercontent.com/SEVA77/nw.js_mod/main/versions.json"