Сборка и упаковка
Как @rynt/extension-build превращает исходники расширения в dist/ и .ryntextension.
Пресет Vite
ryntExtensionViteConfig({ root, manifest }) из @rynt/extension-build:
- ESM-бандл entry (
src/index.ts→dist/index.js). - Шимы на модули хоста (
vue,@rynt/sdk/extension, …) — один экземпляр Vue и реестров с лаунчером. - Запись
__RYNT_EXTENSION_ID__изmanifest.idдля корректного автора записей в реестрах. - Генерация
dist/manifest.json(слияние сpackage.json). - Обработка иконки (см. ниже).
- Плагин dev-bridge для watch-сборки — см. Dev-режим.
Пример vite.config.ts:
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import { ryntExtensionViteConfig } from '@rynt/extension-build';
const root = path.dirname(fileURLToPath(import.meta.url));
export default ryntExtensionViteConfig({
root,
manifest: {
id: '@acme/my-pack',
name: 'My Pack',
description: 'Краткое описание',
icon: './assets/icon.png',
author: 'Acme Team',
main: 'index.js',
engines: { rynt: '>=0.9.0' },
extensionApi: '1',
contributes: { rynt: { /* … */ } },
},
});Манифест: только в Vite-конфиге
Отдельный manifest.json в корне пакета не нужен. При vite build пресет пишет dist/manifest.json.
Правила слияния с package.json:
| Поле | Если не задано в manifest |
|---|---|
version, name, description | Берутся из package.json |
id | package.json → name |
main | index.js |
Лаунчер при обходе ищет dist/manifest.json (или legacy manifest.json в корне папки расширения).
Иконка
В manifest.icon укажите локальный путь (например ./assets/icon.png):
- Растровые форматы масштабируются через Jimp до max 512×512, результат —
dist/icon.png, в манифесте"icon": "icon.png". - SVG копируется как
icon.svgбез растеризации. - Абсолютные http(s) URL и
data:URI не обрабатываются — попадают в манифест как есть.
Поле author (строка) попадает в dist/manifest.json и используется в UI лаунчера и маркетплейса.
Скрипты в package.json
{
"scripts": {
"build": "vite build && rynt-extension-pack",
"dev": "vite build --watch",
"typecheck": "vue-tsc -p tsconfig.json --noEmit"
}
}| Скрипт | Действие |
|---|---|
build | Production-сборка + архив .ryntextension |
dev | Watch-сборка + dev-bridge (см. Dev-режим) |
typecheck | Проверка типов без emit |
Упаковка .ryntextension
rynt-extension-pack (CLI из @rynt/extension-build):
- Читает
dist/manifest.json(обязателен). - Формирует имя
{slug}-{version}.ryntextension, гдеslug— изmanifest.id(без@, спецсимволы →-). - Упаковывает всё содержимое
dist/(zip):index.js,index.css,manifest.json,icon.png, …
Без предварительного vite build упаковка завершится ошибкой «Нет dist/manifest.json».
Содержимое dist/ после сборки
| Файл | Описание |
|---|---|
index.js | ESM entry (export default defineRyntExtension(...)) |
index.css | Стили из Vue/SFC (подключаются лаунчером отдельным <link>) |
manifest.json | Итоговый манифест для загрузчика |
icon.png / icon.svg | Иконка (если задана локально) |
Шимы и @rynt/sdk
Bare-импорты vue, @rynt/sdk/extension, … подменяются на маленькие host-shim файлы, которые реэкспортируют API с globalThis.__RYNT_EXTENSION_HOST_MODULES__.
Новый subpath SDK в расширении:
- Зарегистрировать namespace в
registerRyntExtensionHostModules(лаунчер). - Добавить шим в пресете
@rynt/extension-build(см. документацию пакета на npm).