Skip to content

Сборка и упаковка

Как @rynt/extension-build превращает исходники расширения в dist/ и .ryntextension.

Пресет Vite

ryntExtensionViteConfig({ root, manifest }) из @rynt/extension-build:

  • ESM-бандл entry (src/index.tsdist/index.js).
  • Шимы на модули хоста (vue, @rynt/sdk/extension, …) — один экземпляр Vue и реестров с лаунчером.
  • Запись __RYNT_EXTENSION_ID__ из manifest.id для корректного автора записей в реестрах.
  • Генерация dist/manifest.json (слияние с package.json).
  • Обработка иконки (см. ниже).
  • Плагин dev-bridge для watch-сборки — см. Dev-режим.

Пример vite.config.ts:

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
idpackage.jsonname
mainindex.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

json
{
  "scripts": {
    "build": "vite build && rynt-extension-pack",
    "dev": "vite build --watch",
    "typecheck": "vue-tsc -p tsconfig.json --noEmit"
  }
}
СкриптДействие
buildProduction-сборка + архив .ryntextension
devWatch-сборка + dev-bridge (см. Dev-режим)
typecheckПроверка типов без emit

Упаковка .ryntextension

rynt-extension-pack (CLI из @rynt/extension-build):

  1. Читает dist/manifest.json (обязателен).
  2. Формирует имя {slug}-{version}.ryntextension, где slug — из manifest.id (без @, спецсимволы → -).
  3. Упаковывает всё содержимое dist/ (zip): index.js, index.css, manifest.json, icon.png, …

Без предварительного vite build упаковка завершится ошибкой «Нет dist/manifest.json».

Содержимое dist/ после сборки

ФайлОписание
index.jsESM 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 в расширении:

  1. Зарегистрировать namespace в registerRyntExtensionHostModules (лаунчер).
  2. Добавить шим в пресете @rynt/extension-build (см. документацию пакета на npm).

См. также