Я только что выпустил большое приложение Electron, кодируя которое потратил последние два месяца. Это был захватывающий, но зачастую разочаровывающий опыт.

Я определенно ни о чем не жалею. Electron великолепен, и, честно говоря, я бы не построил его на какой-либо другой платформе.

Polar зародился как способ решения моей сложной проблемы - моя коллекция для чтения вышла из-под контроля.

У меня было множество PDF-файлов и HTML-страниц в моем личном репозитории документов, и, конечно же, не было достойного способа ими управлять.

Я хотел иметь возможность комментировать их и, конечно же, хотел синхронизировать их с Ank i. Таким образом, любой ключевой факт будет запоминаться и сохраняться до тех пор, пока он важен для моей карьеры.

Чтобы усложнить ситуацию, я использую Ubuntu, и поддержка PDF в Linux, мягко говоря, довольно жалкая.

Я наткнулся на pdf.js, веб-фреймворк от Mozilla, и был весьма впечатлен.

Что делает pdf.js настолько впечатляющим, так это то, что это полноценное решение для рендеринга PDF, основанное на веб-стандартах, которое рендерится внутри браузера с использованием холста. Текст накладывается поверх холста, поэтому вы также можете выполнять поиск в документе, пока он отображается в браузере.

В этот момент загорелся свет - я мог просто объединить pdf.js с Electron и создать полноценный просмотрщик PDF и менеджер документов, который был кроссплатформенным!

Мой опыт работы с веб-инфраструктурой. Моя компания Datastreamer распространяет платформу для распространения блогов и новостного контента. Казалось, что это будет довольно просто, поскольку я мог в основном дублировать веб-архитектуру в локальной среде рабочего стола.

Теперь Electron великолепен. Однако, как и у любой существующей когда-либо созданной структуры, есть некоторые проблемы, с которыми немного сложно работать.

IPC и обмен данными между процессами

Электрон основан на многопроцессорной модели. Основным процессом является, по сути, NodeJS, и он управляет набором процессов рендеринга, поддерживаемых libchromiumcontent.

Изоляция процесса - это одновременно и благословение, и проклятие. Это позволяет вам разделить проблемы, но как только вам придется делать что-то сложное между процессами, вы оказываетесь в мире боли.

Фреймворк Электрон IPC оставляет желать лучшего. С этим слишком сложно работать.

Кроме того, существуют основные известные проблемы с производительностью IPC. Удачи, если вы сделаете что-нибудь, чувствительное к задержке.

Думаю, что основным решением здесь могло бы стать использование чего-то вроде GRPC. С помощью GRPC вы могли фактически создавать привязки клиентов для совершения звонков в Electron вместо того, чтобы создавать и отправлять пользовательское сообщение JSON.

Это также может позволить вам создавать платформы для сериализации запросов сообщений, чтобы предотвратить изменение структур данных в нескольких потоках.

Вы можете встроить демон GRPC в один поток, обрабатывающий все запросы к встроенной базе данных (например), не беспокоясь о том, что процессы наступают друг на друга.

На данный момент основные проблемы заключаются в том, что внутри Node GRPC просто использует основной поток событий. Это заблокировало бы Electron и графический процессор (что является частью того, что мы пытаемся решить).

Кроме того, привязки GRPC для узла находятся на C, и их необходимо перекомпилировать для каждой платформы. Создавать пакеты Electron уже слишком сложно, поэтому добавление еще одной нативной зависимости только усложнит вам жизнь.

Расширения Chrome

Electron - это не Chromium, поэтому он не поддерживает расширения Chrome.

Сначала я не думал, что это меня остановит, но теперь это одна из главных вещей, которые мне хотелось бы, чтобы Electron поддержал.

Что касается Polar, мы хотели бы включить блокировку рекламы при рендеринге контента. Если бы Chrome поддерживал расширение, встроить uBlock в наш дистрибутив заняло бы 5 минут.

Текущее предложение сейчас состоит в том, чтобы внедрить смелый рекламный блок, но это будет не так просто, как я изначально думал. И Ad Block Pro, и uBlock реализуют более сложные решения, помимо блокировки URL. Они поддерживают блокировку имени класса CSS и сворачивание iframe.

Мне нужно провести здесь немного дополнительных исследований, чтобы убедиться, что я реализую блокировку рекламы так же, как основные расширения Chrome.

Обслуживание вашего приложения

Обслуживание вашего приложения немного сложно. Вы можете обслуживать из файловой системы, но некоторые библиотеки откажутся запускаться при обслуживании из URL-адреса файла.

Вы можете реализовать свой собственный поддельный протокол, например myapp: //, но есть множество других приложений, которые откажутся запускать что-либо, кроме http и https. Firebase - отличный тому пример. Они просто не будут работать в Electron, если вы не предоставите контент через http или https.

Теперь вы можете встроить экспресс. Но теперь у вас есть еще одна довольно сложная библиотека, о которой нужно подумать. Кроме того, существует проблема безопасности: держать порт открытым, а также выяснять, какие порты обычно доступны.

Что делать, если вы распространяете это через магазин приложений Mac. Вы должны запросить дополнительное разрешение для привязки этого порта из-за их изолированности. Еще больше работы.

Я думаю, что решение здесь состоит в том, чтобы реализовать свой собственный перехватчик протокола и создать свой собственный поддельный URL-адрес.

Таким образом, у вас может быть поддельный URL-адрес, например http: //mylocalapp.local, который на самом деле не находится за HTTP-сервером, но Electron может обслуживать контент из папки карты благодаря вашему перехватчику протокола.

Единственный способ, которым я действительно пришел к этому как к практическому решению, - это то, что у Polar есть классная функциональность по кэшированию и сохранению веб-контента в виде документов, в которых используются перехватчики протоколов.

Если это сработает, я могу в конечном итоге объединить его в отдельную библиотеку.

Дополнительные вопросы

Вот еще несколько важных проблем, которые у меня возникли при попытке собрать все воедино.

Просмотр с вкладками

Я действительно хотел бы, чтобы была стандартная библиотека просмотра с вкладками, которая работала и идеально имитировала хром.

Я собираюсь поиграть с хром-вкладками, чтобы посмотреть, смогу ли я заставить его работать с React.

Сертификаты подписи кода

Это была большая боль, и я потратил на это около недели. Мне пришлось позвонить Данну и Брэдстриту и орать на полдюжины компаний за привилегию выпустить приложение с открытым исходным кодом для сообщества.

В конце концов, я потратил около 1000 долларов своих собственных денег на выпуск приложения с открытым исходным кодом, на разработку которого я потратил два месяца бесплатно.

Ведение журнала

На самом деле нет простого способа настроить ведение журнала в Electron. Я просмотрел несколько проектов, но ничего не помогло. В итоге я реализовал кое-что из рук, на что ушло, наверное, 3–5 дней инженерного времени.

Вывод

В конце концов, я бы все равно использовал Electron. Я мог бы рассмотреть возможность использования NW.js, поскольку он фактически поддерживает расширения Chrome.

Надеюсь, что в какой-то момент Electron будет поддерживать расширения, которые значительно упростят весь этот процесс.