Многопоточность, SQLite, собственные модули и другие общие проблемы

1656624499 mnogopotochnost sqlite sobstvennye moduli i drugie obshhie problemy

Эндрю Уолш

OZ3SSm5exj7vxj2Yvr7L7QpA0TRELOhhuYFb

Будучи основой для разработки настольных приложений, Electron может многое предложить. Он предоставляет полный доступ к API и экосфере Node. Он разворачивается на всех главных операционных системах (с единой кодовой базой). Благодаря веб-архитектуре вы можете использовать новейшие функции CSS для создания расширенных интерфейсов интерфейса.

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

В частности, мы рассмотрим:

  • Как работает Electron (кратко) и как его архитектура влияет на то, что мы можем делать
  • Многопоточность
  • Использование локальных баз данных, таких как SQLite, или запись в любой файл в программе Electron
  • Нативные модули
  • Несколько проблем, о которых нужно знать
  • Упаковка программы с использованием родных модулей

Как работает Электрон – сокращенно

keOEXfrPYcN9EhRMyl2h49AepZe-6YtXRP3J

Следует повторить ключевые принципы архитектуры Electron. Приложение Electron состоит по меньшей мере из двух процессов. Основной поток является входом в вашу программу и выполняет всю работу, необходимую, чтобы показать ваш процесс (или процессы) отображения вашим пользователям. Может быть только один экземпляр основного процесса.

Процессы Renderer используют Chromium для воспроизведения программы. Подобно тому, как каждая вкладка работает в собственном процессе, так же выполняется каждое средство визуализации. Они загружаются с помощью метода loadURL конструктора BrowserWindow, который должен указывать локальный или удаленный файл HTML. Это означает, что единственный способ запустить процесс визуализации – это использовать файл HTML в качестве записи.

Предостережение архитектуры Электрона

Простота Electron является одним из его величайших преимуществ. Ваш основной процесс выполняет любую необходимую конфигурацию, затем передает HTML-файл или URL-адрес процесса визуализации. Этот файл может делать все, что может обычная веб-приложение – и вы можете начать.

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

Важно знать, что выполнение каких-либо интенсивных вычислений для основного процесса замедлит (или заморозит) ваши процессы визуализации. Очень важно, чтобы любая интенсивная вычислительная работа была перенесена из основного потока. Лучше оставить это только для выполнения всего необходимого для запуска процессов визуализации. Поскольку мы не можем выполнять интенсивную работу над тем же процессом визуализации, который воспроизводит интерфейс программы (поскольку это также повлияет на пользовательский интерфейс), нам нужен другой подход.

Многопоточность

nSgrPDUeijHdeOrJtPUcNVzOuUPBf125BGO1

Есть три общих подхода к многопоточной работе в Electron:

  • Используйте веб-воркеры
  • Разделите новые процессы для выполнения задач
  • Запускайте (скрытые) процессы визуализации как работники

Веб-работники

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

Однако есть одна очень большая оговорка — вы не можете использовать собственные модули. Технически вы можете, но это приведет к сбою программы. Это существенная проблема, поскольку любой программе, требующей многопоточности, может потребоваться использовать собственные модули (например, node-sqlite3).

Разветвление новых процессов

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

Основная проблема состоит в том, что в отличие от процессов визуализации дочерние процессы не могут использовать методы из библиотеки Electron. Это заставляет вас поддерживать канал связи с основным процессом через IPC. Процессы визуализации могут использовать удаленный модуль, чтобы приказать основному процессу выполнять только основные задачи без дополнительного шага.

Другая проблема заключается в том, что если вы используете модули ES или функции TC39 JavaScript, нужно убедиться, что вы запускаете транспилированные версии своих скриптов. Вам также нужно будет включить их в упакованную программу. Эта проблема влияет на любую программу Node, которая разделяет процессы, но добавляет еще один уровень сложности в процесс сборки. Это также может стать сложным, если сбалансировать требования упаковки программы с использованием инструментов разработки, которые используют такие функции, как перезагрузка в реальном времени.

Использование процессов визуализации как рабочих потоков

Процессы визуализации традиционно рассматриваются как используемые для визуализации вашего пользовательского интерфейса. Однако они не обязаны выполнять эту единственную задачу. Их можно скрывать и запускать в фоновом режиме, настроив флаг шоу, переданный в BrowserWindow.

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

Одной из проблем при использовании Electron является IPC. Хотя он прост, он требует значительного количества шаблонов и создает трудности с отладкой большого количества слушателей событий. Это также другое дело, которое нужно провести модульный тест. Используя процесс визуализации в качестве рабочего потока, вы можете полностью обойти это. Так же, как и на сервере, вы можете прослушивать локальный порт и получать запросы, позволяющие использовать такие инструменты, как GraphQL + React Apollo. Вы также можете использовать веб-сокеты для общения в реальном времени. Еще один бонус состоит в том, что вам не нужно использовать ipcRenderer, и вы можете сохранить свои Electron и веб-приложения изоморфными (если вы хотите использовать общую кодовую базу для настольных компьютеров и веб-приложений).

Для расширенных случаев использования этот подход можно сочетать с кластеризацией, чтобы получить лучшее из всех миров. Единственный недостаток состоит в том, что вам нужно будет предоставить HTML-файл в качестве записи для ваших рабочих процессов визуализации (что выглядит как хак).

Как использовать SQLite (или все, что вам нужно написать)

dtC2ic6Yczjpbr3W9QCkY-rotuXLDfPWmjMe

Существует несколько подходов к управлению состоянием, для которых не требуются собственные модули. К примеру, обработка всего вашего состояния в контексте визуализации с помощью Redux.

Однако если вам нужно обрабатывать большие объемы данных, этого будет недостаточно. В частности, мы рассмотрим, как использовать SQLite в программе Electron.

Чтобы развернуть программу Electron, вам сначала нужно ее упаковать. Для этого существует ряд инструментов, наиболее популярным является Electron Builder. Electron использует формат архива ASAR для объединения вашего приложения в один несжатый файл. Архивы ASAR доступны только для чтения, то есть вы не можете записывать в них данные. Это означает, что вы не можете включить свою базу данных в свой архив ASAR вместе с остальным вашим кодом (в electron builder это будет в разделе «файлы»).

Вместо этого добавьте свою базу данных в каталог Resources вашего электронного пакета. Структуру файлов упакованной программы Electron и местоположение вашей базы данных можно увидеть ниже:

Ma0VJabKd0W1PcjbsYYSVnnYkFMwOKdsiSuH

Упакованный архив ASAR под названием app.asar существует в ./Contents/Resources. Вы можете разместить свою базу данных или любой файл, в который вы хотите записывать, но включить его в свою упакованную программу, в тот же каталог. Это можно достичь с помощью Electron Builder, используя конфигурацию «extraResources».

Другой подход – создать базу данных полностью в другом каталоге. Но вам нужно будет учитывать удаление этого файла на всех платформах, если пользователи решат удалить ваше приложение.

Упаковка с родными модулями

Большинство модулей Node являются скриптами, написанными на JavaScript. Нативные модули – это модули, написанные на C++, имеющие привязки для использования с Node. Они действуют как интерфейс других библиотек, написанных на C/C++, и, как правило, настроены для компиляции после установки.

В качестве модулей низкого уровня их нужно скомпилировать для целевых архитектур и операционных систем. Нативный модуль, скомпилированный на машине Windows, не будет работать на Linux, даже если обычный модуль будет работать. Это проблема для Electron, поскольку нам в конце концов нужно запаковать все в исполняемый файл .dmg (OSX), .exe (Windows) или .deb (Linux).

Электронные программы, использующие собственные модули, должны быть упакованы в систему, на которую они ориентированы. Поскольку вы хотите автоматизировать этот процесс в конвейере CI/CD, вам нужно будет создать собственную зависимость перед упаковкой. Чтобы сделать это, можно использовать инструмент, разработанный командой Electron, который называется electron-rebuild.

Если вы разрабатываете некоммерческий проект с открытым кодом, можно использовать TravisCI (Linux, OSX) и Appveyor (Windows) для автоматического бесплатного создания, тестирования и развертывания приложения.

Настройки для этого могут быть сложными, если у вас есть интеграционные тесты, поскольку вам нужно будет установить определенные зависимости, чтобы безголовые тесты работали. Пример конфигурации для OSX и Linux с TravisCI можно найти здесь, а пример конфигурации Appveyor здесь (эти примеры основаны на конфигурации в проекте electron-react-boilerplate с добавлением OSX и развертыванием).

Понятно

Когда ваша программа Electron упакована, некоторые встроенные свойства Node, касающиеся путей, могут вести себя не так, как вы ожидали, и не ведут себя так, как они будут действовать, когда вы запускаете предварительно встроенный двоичный файл для обслуживания вашего приложения.

Такие переменные, как __dirname, __filename и методы, такие как process.cwd, не будут вести себя должным образом в упакованной программе (см. проблемы здесь, здесь и здесь). Вместо этого используйте app.getAppPath.

Последнее примечание по упаковке

При разработке программы Electron можно использовать как производственный (обслуживание пакетного кода с предварительно встроенным двоичным файлом), так и режимы разработки (использование webpack-dev-server или webpack-serve для просмотра ваших файлов).

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

По крайней мере, ваш основной процесс должен указывать путь к файлу HTML-файла ваших процессов визуализации. Если вы переместите этот файл в другой каталог в рамках процесса сборки, вы будете вынуждены поддерживать предположения о структуре файлов, и это может быстро стать еще одним сложным уровнем, который вам нужно поддерживать.

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

Резюме

fwQjnBH2Taw7dUyakJKN8AUoxpwMaV8ZqCde

Существует несколько подходов к многопоточности в Electron. Веб-воркеры удобны, но не имеют возможности использовать собственные модули. Раздел новых процессов работает так же, как и в Node, но отсутствие возможности использовать библиотеку Electron заставляет использовать IPC для обычных задач и может быстро усложняться. Использование процессов визуализации в качестве работников предоставляет полную мощность всех доступных серверных инструментов Node в качестве замены коммуникации через IPC, сохраняя при этом доступ к родным модулям и методам библиотеки визуализации Electron.

Поскольку Electron упаковывает файлы в архив ASAR, доступен только для чтения, не может быть включен любой файл, в который нам нужно записывать (например, базу данных SQLite). Их можно разместить в каталоге Ресурсы, где они останутся в упакованной программе.

Наконец, помните о том, что в упакованной программе некоторые свойства Node ведут себя не так, как вы ожидали. И для ясности ума сравните структуру файла упакованной программы с исходным кодом.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *