README.md 21.5 KiB
Newer Older
Grigorii Lutkov's avatar
Grigorii Lutkov committed
# Простое демонстрационное расширение c node интеграцией

# 1. Общая инфрмация

1. Описание расширения находится в `package.json`
1. Инициализация расширения происходит в скрипте `root.ts` (`front`/`renderer` процесс)
Grigorii Lutkov's avatar
Grigorii Lutkov committed
1. Инициализация корневого скрипта с "node" интеграцией происходит в `root_node.ts` ("main" процесс)
1. Расширение добавляет вкладку "Демонстрационная вкладка 2" на левую панель управления, которая состоит из:
   - `static/control_panel/cp_tab.html`: описание структуры вкладки
   - `static/control_panel/cp_tab.css`: описание стилей элементов (загружается из `cp_tab.html` файла)
   - `src/control_panel/cp_tab.ts`: скрипт с логикой (загружается из `cp_tab.html` файла)
1. Данная вкладка содержит:
   - Заголовок "Демонстрационная вкладка 2"
   - Кнопки открытия основной ("рабочей" вкладки) с параметрами запуска "скрипта маршрута":
     - `open-script`: при нажатии открывается новая вкладка в основной панели ("main_panel")
1. Вкладка с конфигурацией "срипта маршрута" сотоит из:
   - `static/main_panel/mp_tab.html`: описание структуры вкладки
   - `static/main_panel/mp_tab.css`: описание стилей элементов (загружается из `mp_tab.html` файла)
   - `src/main_panel/mp_tab.ts`: скрипт с логикой (загружается из `mp_tab.html` файла)
1. Данная вкладка содержит:
   - Конфигурируемые входные параметры скрипта различных типов данных:
     - Параметр 1 (текст), обязательный
     - Параметр 2 (тумплер), опциональный
     - Параметр 3 (число), опциональный
   - Кнопка запуска скрипта "Запуск"
     - При выполнении скрипта логируется его вывод в отладочную консоль
Grigorii Lutkov's avatar
Grigorii Lutkov committed

Отладочную консоль можно открыть используя верхнее меню: `Developer` -> `Toggle Developer Tools`

# 2. Предварительная настройка окружения

1. Установить `nvm`
   - https://github.com/nvm-sh/nvm
   - Linux & MacOS: `brew install nvm`
   - Windows: `winget install nvm-windows`
Grigorii Lutkov's avatar
Grigorii Lutkov committed
1. Установить `node 20.16.0`
Grigorii Lutkov's avatar
Grigorii Lutkov committed
   - ```sh
Grigorii Lutkov's avatar
Grigorii Lutkov committed
     nvm install 20.16.0
     nvm use 20.16.0
     nvm alias default 20.16.0 # for Linux and MacOS
Grigorii Lutkov's avatar
Grigorii Lutkov committed
     node --version # check
     ```
1. Включить менеджер пакетов `yarn`
   - ```sh
     corepack enable
     yarn --version # check
     ```
1. Установить актуальную версию `yarn 4.2.1`
Grigorii Lutkov's avatar
Grigorii Lutkov committed
   - ```sh
     yarn set version berry
     yarn --versuin # check
     ```

# 3. Запуск платформы UNIAPP/TRUAPP

1. Для запуска ПО платформы необходимо запустить исполняемый файл `UNIAPP` или `TRUAPP`
1. На Linux, при возникновении проблем с запуском, попробовать запустить с флагом `--no-sandbox`:
   - ```sh
     ./UNIAPP --no-sandbox
     ```
1. Чтобы открыть отладочную консоль с логами программы, используйте верхнее меню:
   - `Developer` -> `Toggle Developer Tools`
1. Чтобы установить запакованное расширение откройте на левой панели вкладку расширений и нажмите на знак `+`
1. При возникновении ошибок, блокирующих выполнение программы (которые можно наблюдать в отладочной консоли), нажмите в верхнем меню:
   1. `Developer` -> `Clear App Storage`
   1. `Developer` -> `Remove Installed Extensions`
   1. Перезагрузите программу

# 4. Добавление расширения в режиме отладки

Так как в процессе разработки запаковывать и переустановливать расширение при каждом изменении крайне неудобно, существует механизм добавления расширения в виде обычный директории (исходников, в режиме отладки), так чтобы изменения автоматически подхватывались платформой при перезагрузке страницы.<br/>
<br/>
Для этого требуется:

1. Создать директорию на ПК, в которой будут храниться расширения в режиме отладки, например
   - `mkdir ~/truapp-debug-extensions`
1. Поместить в эту директорию текущее расширение
   - ```sh
     cd ~/truapp-debug-extensions
     git clone https://trulab.ru/trutex/public/truapp-extensions/simple-node-example.git
Grigorii Lutkov's avatar
Grigorii Lutkov committed
     ```
1. Собрать расширение
   - ```sh
     cd simple-node-example
Grigorii Lutkov's avatar
Grigorii Lutkov committed
     yarn install
     yarn build # on Windows "yarn win:build"
     ```
1. Запустить `UNIAPP` или `TRUAPP`
1. Открыть настройки (settings):
   - Либо нажав на вкладку с изображением шестеренки на боковой панели
Grigorii Lutkov's avatar
Grigorii Lutkov committed
   - Либо комбинацией клавиш `ctrl|cmd`+`,`
   - Либо выбрав в верхнем меню `App` -> `Settings` -> `Open`
1. Настройки хранятся в формате `JSON`, необходимо добавить новый параметр, указывающий абсолютный путь к директории, где хранятся расширения в режиме отладки:
   - ```json
     {
       "debugExtensionsPath": "/absolute/path/to/truapp-debug-extensions"
     }
     ```
1. Сохранить внесенные изменения:
   - Либо комбинацией клавиш `ctrl|cmd`+`s`
   - Либо выбрав в верхнем меню `File` -> `Save File`
1. Перезагрузить платформу:
   - Либо комбинацией клавиш `ctrl|cmd`+`r`
   - Либо выбрав в верхнем меню `View` -> `Reload`
1. В списке расширений должно автоматически отобразиться расширение из указанной директории со специальными метками:
   - В названии расширения должно быть указано "(debug)"
   - На икноке вкладки расширения в левой панели управления в правом нижнем углу должен отображаться маленький значек жука (bug)

# 5. Процесс внесения изменений

1. Если отредактированы файлы в папке `static/`
   - достаточно просто перезагрузить платформу
     - Либо комбинацией клавиш `ctrl|cmd`+`r`
     - Либо выбрав в верхнем меню `View` -> `Reload`
1. Если отредактированы файлы в папке `src/`
   1. Необходимо пересобрать проект `yarn build`
   1. Перезагрузить платформу:
   - Либо комбинацией клавиш `ctrl|cmd`+`r`
   - Либо выбрав в верхнем меню `View` -> `Reload`

Важно: в данный момент сборка настроена таким образом, что доступ к `node` есть только у скриптов, имеющих в названии суфикс `_node`. Например `root_node.ts`.

# 6. Структура файлов проекта

- `.yarn/`: директория где `yarn` хранит различные вспомагательные файлы
- `dist/`: директория куда происходит сборка `TypeScript` в `JavaScript` командой `yarn build`
- `node_modules/`: директория где `node` и `yarn` хранит все установленные зависимости
- `scripts/`: директория где хранятся различные дополнительные скрипты (в данный момент скрипты для сборки на Windows)
- `src/`: директория со всеми исходниками (в данный момент только `TypeScript`)
  - `root.ts`: корневой скрипт расширения, является входной точкой (`front`/`renderer` процесс)
  - `root_node.ts`: корневой скрипт расширения, имеющий доступ к `node` (`back`/`main` процесс)
Grigorii Lutkov's avatar
Grigorii Lutkov committed
  - `control_panel/`: директория где хранятся скрипты, относящиеся к панели управления
    - `cp_tab.ts`: скрипт, содержащий логику вкладки на панели управления
  - `main_panel/`: директория где хранятся скрипты, относящиеся к основной (рабочей) панели
    - `mp_tab.ts`: скрипт, содержащий логику вкладки на основной панели
- `static/`: директория где хранятся все статические данные (в данный момент это иконки, `HTML` документы и файлы стилей)
  - `icon.svg`: иконка самого расширения, отображаемая в списке расширений
  - `icons/`: директория где хранятся различные используемые иконки
  - `control_panel/`: директория где хранятся ассеты, относящиеся к панели управления
    - `cp_tab.html`: документ, описывающий содержимое вкладки на боковой панели
    - `cp_tab.css`: файл стилей, описывающий внешний вид элементов соответствующего `html` файла
  - `main_panel/`: директория где хранятся ассеты, относящиеся к основной панели
    - `mp_tab.html`: документ, описывающий содержимое вкладки на основной панели
    - `mp_tab.css`: файл стилей, описывающий внешний вид элементов соответствующего `html` файла
- `temp/`: директория где хранятся временные файл (в данный момент она используется во время сборки `yarn build`)
- `.gitattributes`: конфигурационный файл с описанием файловых параметров для `git`
- `.gitignore`: конфигурационный файл с правилами игнорирования файлов для `git`
- `.nvmrc`: конфигурационный файл для `nvm`, позволяет просто использовать команду `nvm use` для выбора необходимой версии `node`
- `.prettierignore`: конфигурационный файл с правилами игнорирования файлов для `prettier`
- `.prettierrc.json`: конфигурационный файл для `prettier` (описание правил автоформатирования текста)
- `.yarnrc.yml`: конфигурационный файл для `yarn`
- `package.json`: основной файл с описанием всех параметров расширения
- `README.md`: данный файл с общей информацией
- `tscоnfig.json`: конфигурационный файл для `TypeScript`
- `yarn.lock`: файл в котором `yarn` хранит все версии установленных зависимостей. Он необходим для обеспечения стабильности окружения

# 7. Структура `package.json`

- `id`: уникальный идентификатор расширения в специальном формате `имя-автора` `/` `название-расширения`
Grigorii Lutkov's avatar
Grigorii Lutkov committed
- `title`: название расширения
- `description`: описание расширения
- `author`: автор / разработчик / владелец расширения
- `version`: версия расширения в формате `semver`
- `url`: адрес расширения,
- `iconPath`: путь до иконки расширения
- `scriptPath`: путь до корневого (входного) скрипта расширения (`front`/`renderer` процесс)
Grigorii Lutkov's avatar
Grigorii Lutkov committed
- `backScriptPath`: путь до корневого (входного) скрипта расширения c `node` интеграцией (`back`/`main` процесс)
Grigorii Lutkov's avatar
Grigorii Lutkov committed
- `requiredApis`: список требуемых интерфейсов (API)
- `scripts`: описание `yarn` скриптов, используемых при разработке
  - `build_front`: сборка всех файлов, относящихся к `front`/`renderer` процессу
  - `build_back`: сборка всех файлов, относящихся к `back`/`main` процессу
Grigorii Lutkov's avatar
Grigorii Lutkov committed
  - `build`: финальная сборка
  - `archive`: сборка и архивация расширения в формат `.asar` для последующего распространения
  - `win:build_front`: аналогичный скрипт, адаптированный под Windows
  - `win:build_back`: аналогичный скрипт, адаптированный под Windows
Grigorii Lutkov's avatar
Grigorii Lutkov committed
  - `win:build`: аналогичный скрипт, адаптированный под Windows
  - `win:archive`: аналогичный скрипт, адаптированный под Windows
- `dependencies`: список зависимостей расширения
  - `uniapp`: модуль, осуществляющий интеграцию с API платформы
- `engines`: список требуемых инструментов и их версий
- `packageManager`: используемый менеджер пакетов
- `type: module`: включение поддержки `ES` модулей (другими словами `import` директив для `JavaScript`)
- `devDependencies`: список зависимостей, используемых только в режиме отладки

# 8. Используемые API

- `communicationApi`
- `controlPanelApi`
- `mainPanelApi`
- `nodeApi`
- `pingPongApi`
Grigorii Lutkov's avatar
Grigorii Lutkov committed

# 9. Все доступные API

- `appInfoApi` (предварительная готовность)
  - для получения информации о платформе (версия, package.json и т.д.)
- `appMenuApi` (в работе)
  - для взаимодействия с панелью кнопок ("File", "Edit", и т.д.)
- `cacheApi` (в работе)
  - для хранения данных в кэше
- `codeEditorApi` (концепция в проработке)
  - для отображения текстовых файлов через редактор кода
  - для обеспечения интеграции с различными редакторами кода
- `commandsApi` (в работе)
  - для добавления и взаимодействия с `command palette`
- `communicationApi` (предварительная готовность)
  - для обеспечения взаимодействия между разными процессами по тегам
- `contextMenuApi` (в работе)
  - для добавления опцией в выпадающее контекстное меню
- `controlPanelApi` (предварительная готовность)
  - для работы с панелью управления
- `databaseApi` (предварительная готовность)
  - для хранения данных в базе
  - для обеспечения интеграции с различными базами данных
- `extensionInfoApi` (предварительная готовность)
  - для получения информации о расширении (версия, `package.json` и т.д.)
- `fileExplorerApi` (концепция в проработке)
  - для отобрадения проводника по файлам
  - для обеспечения интеграции с различными файловыми проводниками
- `fileSystemApi` (предварительная готовность, временный)
  - для работы с файловой системой через `node.fs`
- `hotkeysApi` (в работе)
  - для добавления и взаимодействия с горячими клавишами
- `lifecycleApi` (предварительная готовность)
  - для контроля жизненного цикла (`onReady`, `onDestroy` и т.д.)
- `mainPanelApi` (предварительная готовность)
  - для работы с основной рабочей панелью
- `nodeApi` (предварительная готовность)
  - для работы с `node` через специальные `utility processes` и обеспечения общения между ними
- `notificationsApi` (в работе)
  - для отправки уведомлений
- `pathApi` (предварительная готовность)
  - для работы с файловой системой через `node.fs`
- `pingPongApi` (предварительная готовность)
  - для отправления тестовых "ping" / "pong" сигналов
- `processesApi` (предварительная готовность)
  - для добавления и взаимодействия с процессами платформы
- `settingsApi` (предварительная готовность)
  - для работы с настройками
- `statusBarApi` (в работе)
  - для взаимодействия со статусной строкой
- `storageApi` (предварительная готовность)
  - для хранения простых данных в формате "ключ" -> "значение"
- `tagsApi` (предварительная готовность)
  - для получения информации о существующих тегах
- `webApi` (предварительная готовность)
  - для контроля доступа к интернету

# 10. Используемые инструменты / технологии верхнего уровня
Grigorii Lutkov's avatar
Grigorii Lutkov committed

- `TypeScript`: для написания типизированного `JavaScript` кода
  - https://www.typescriptlang.org/
- `esbuild`: быстрый сборщик `TypeScript` файлов
  - https://esbuild.github.io/
- `ASAR`: архивный формат для распространения расширений
  - https://www.electronjs.org/docs/latest/tutorial/asar-archives

# 11. База знаний
Grigorii Lutkov's avatar
Grigorii Lutkov committed

1. [ECMAScript](https://developer.mozilla.org/en-US/docs/Glossary/ECMAScript) - основа языка JS
1. [JavaScript](https://developer.mozilla.org/en-US/docs/Web/javascript)
1. [TypeScript](https://www.typescriptlang.org/docs/handbook/intro.html) - язык на базе JS добавляющий типизацию
1. [V8 JS Engine](<https://en.wikipedia.org/wiki/V8_(JavaScript_engine)>) - интерпретатор/компилятор JS кода
1. [Node.js](https://en.wikipedia.org/wiki/Node.js) - исполнитель JS кода использующий V8
1. [Chromium](<https://en.wikipedia.org/wiki/Chromium_(web_browser)>) - основа браузера Chrome использующая V8
1. [Electron.js](https://www.electronjs.org/docs/latest) - JS фреймворк для создания приложений использующий Chromium и Node.js
1. [Vue.js](https://vuejs.org/guide/introduction.html) - JS фреймворк, реализующий реактивность
1. [Vite.js](https://vitejs.dev/guide/why.html) - сборщик JS (web) проектов
1. [Quasar.js](https://quasar.dev/docs) - высокоуровневый фреймворк для сборки Vue.js + TS + Electron.js приложений на базе Vite.js
1. [HTML](https://developer.mozilla.org/en-US/docs/Web/HTML) - язык разметки
1. [CSS](https://developer.mozilla.org/en-US/docs/Web/CSS) - файл описания стилей
1. [SCSS](https://sass-lang.com/guide) - надстройка над CSS расширяющая его возможности
1. [ESLint](https://eslint.org/docs/latest/use/getting-started) - линтер для JS
1. [Prettier](https://prettier.io/docs/en) - инструмент для форматирования текста