Entry на основе конфигурации

В addfox.config.ts через entry и manifest можно:

  • Настраивать пользовательские пути entry
  • Переопределять результаты автообнаружения
  • Добавлять пользовательские entry (такие как capture, my-page и т.д.)

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

Основные принципы

Как и entry на основе файлов:

  • Entry должен быть JS/TS: сборка основана на Rsbuild, реальные entry могут быть только скриптовыми файлами
  • Обработка HTML: встроенные HTML entry (popup/options и т.д.) автоматически генерируются; при использовании пользовательского HTML шаблона необходимо указать entry скрипт через data-addfox-entry
  • При автоматической генерации HTML (без пользовательского шаблона): страница содержит <div id="root"></div>; <title> использует manifest.name; favicon через <link rel="icon"> использует пути из manifest.icons. При использовании пользовательского index.html эти два элемента автоматически не внедряются и должны быть написаны вручную.

Способы конфигурации

1) Настройка entry через entry

entry — это объект: ключ = имя entry, значение = путь или объект конфигурации.

2) Настройка возможностей entry через manifest

В manifest можно объявлять поля, связанные с возможностями entry (такие как background, action.default_popup, content_scripts):

export default defineConfig({
  manifest: {
    manifest_version: 3,
    background: { service_worker: "background/index.js" },
    action: { default_popup: "popup/index.html" },
    content_scripts: [
      { matches: ["<all_urls>"], js: ["content/index.js"] },
    ],
  },
});

3) Приоритет entry и manifest

При одновременном участии в разрешении entry приоритет следующий:

  1. Явно настроенные в entry
  2. Поля, связанные с entry, в manifest
  3. Автообнаружение (на основе файлов)

То есть: entry переопределяет одноименные entry из других источников.

Строковый путь (рекомендуется)

Значение — это путь относительно baseDir (по умолчанию app/):

Тип значенияЗначениеПример
Путь к скрипту .ts/.tsxИспользовать этот скрипт как entry; встроенные HTML entry автоматически генерируют HTML или используют index.html из той же директории как шаблон"popup/index.ts"
Путь к HTML .htmlИспользовать этот HTML как шаблон; entry скрипт должен быть указан через data-addfox-entry"popup/index.html"

Объектная форма: { src, html? }

Более детальный контроль:

ПолеТипОписание
srcstringПуть к entry скрипту (относительно baseDir) обязательно
htmlboolean | stringtrue: генерировать HTML без шаблона; false: только скрипт; string: указать путь к HTML шаблону

Встроенные entry и пути вывода

При настройке встроенных entry через entry пути вывода по умолчанию следующие:

Имя entryТипВыходной скриптВыходной HTML
backgroundТолько скриптbackground/index.js
contentТолько скриптcontent/index.js
popupСкрипт+HTMLpopup/index.jspopup/index.html
optionsСкрипт+HTMLoptions/index.jsoptions/index.html
sidepanelСкрипт+HTMLsidepanel/index.jssidepanel/index.html
devtoolsСкрипт+HTMLdevtools/index.jsdevtools/index.html
offscreenСкрипт+HTMLoffscreen/index.jsoffscreen/index.html
Info

В manifest фреймворк автоматически заполняет поля action.default_popup, options_page и т.д. указанными выше путями.

Примеры конфигурации

Переопределение части entry

// addfox.config.ts
import { defineConfig } from "addfox";

export default defineConfig({
  entry: {
    // Переопределить только эти entry, остальные автообнаруживаются
    popup: "popup/main.tsx",
    options: "options/settings.tsx",
  },
});

Полная конфигурация всех entry

export default defineConfig({
  appDir: "src",
  entry: {
    background: "background/index.ts",
    content: "content/index.ts",
    popup: "popup/index.tsx",
    options: "options/index.tsx",
    sidepanel: "sidepanel/index.tsx",
  },
});

Пользовательский entry + принудительная генерация HTML

export default defineConfig({
  entry: {
    // Встроенные entry
    background: "background/index.ts",
    content: "content/index.ts",
    popup: "popup/index.tsx",
    
    // Пользовательские entry страниц (автоматическая генерация HTML)
    capture: { src: "pages/capture/index.tsx", html: true },
    
    // Пользовательские entry страниц (использование шаблона)
    welcome: { src: "pages/welcome/index.tsx", html: "pages/welcome/template.html" },
    
    // Только скрипт (без HTML)
    worker: { src: "worker/index.ts", html: false },
  },
});

Отключение автообнаружения entry

Если требуется полностью ручное управление всеми entry:

export default defineConfig({
  entry: {
    background: "background/index.ts",
    content: "content/index.ts",
    popup: "popup/index.tsx",
    // ... перечислите все необходимые entry
  },
  // Ненастроенные entry остаются неопределенными, фреймворк обрабатывает только перечисленные в entry
});

Правила разрешения путей

Относительно baseDir

Все пути в entry относительны baseDir, baseDir определяется appDir (по умолчанию app):

export default defineConfig({
  appDir: "src",                    // baseDir = src/
  entry: {
    popup: "popup/index.ts",        // указывает на src/popup/index.ts
  },
});

Таблица быстрого поиска путей

Способ конфигурацииРасположение entry скриптаТипичный вывод
background: "background/index.ts"app/background/index.tsextension/background/index.js
content: "content.ts"app/content.tsextension/content.js
popup: "popup/index.ts"app/popup/index.tsextension/popup/index.html + extension/popup/index.js
capture: { src: "capture/index.ts", html: true }app/capture/index.tsextension/capture/index.html + extension/capture/index.js

Следующие шаги