基于配置的入口

addfox.config.ts 中通过 entrymanifest 做配置驱动时,可以:

  • 自定义入口路径
  • 覆盖自动发现的结果
  • 添加自定义入口(如 capturemy-page 等)

未在 entry 中列出的入口仍会通过基于文件的规则自动发现。

核心原则

与基于文件的入口一致:

  • 入口必须是 JS/TS:构建基于 Rsbuild,真实入口只能是脚本文件
  • HTML 的处理:内置 HTML 入口(popup/options 等)自动生成;使用自定义 HTML 模板时,必须通过 data-addfox-entry 标明入口脚本

配置写法

1) 通过 entry 配置入口

entry 是一个对象:键 = 入口名,值 = 路径或配置对象

2) 通过 manifest 配置入口相关字段

manifest 中可声明入口相关能力字段(如 backgroundaction.default_popupcontent_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) entrymanifest 的优先级

当两者同时参与入口解析时,优先级为:

  1. entry 中显式配置
  2. manifest 中入口相关字段
  3. 自动发现(基于文件)

也就是:entry 会覆盖同名入口的其他来源。

字符串路径(推荐)

值为相对于 baseDir(默认 app/)的路径:

值类型含义示例
脚本路径 .ts/.tsx以该脚本为入口;内置 HTML 入口会自动生成 HTML 或使用同目录的 index.html 作为模板"popup/index.ts"
HTML 路径 .html以该 HTML 为模板;必须通过 data-addfox-entry 解析入口脚本"popup/index.html"

对象形式:{ src, html? }

更细粒度的控制:

字段类型说明
srcstring入口脚本路径(相对 baseDir)必需
htmlboolean | stringtrue:生成 HTML 无模板;false:仅脚本;string:指定 HTML 模板路径

内置入口与输出路径

通过 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_popupoptions_page 等字段。

配置示例

覆盖部分入口

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

export default defineConfig({
  entry: {
    // 仅覆盖这些入口,其他仍自动发现
    popup: "popup/main.tsx",
    options: "options/settings.tsx",
  },
});

完整配置所有入口

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",
  },
});

自定义入口 + 强制生成 HTML

export default defineConfig({
  entry: {
    // 内置入口
    background: "background/index.ts",
    content: "content/index.ts",
    popup: "popup/index.tsx",
    
    // 自定义页面入口(自动生成 HTML)
    capture: { src: "pages/capture/index.tsx", html: true },
    
    // 自定义页面入口(使用模板)
    welcome: { src: "pages/welcome/index.tsx", html: "pages/welcome/template.html" },
    
    // 仅脚本入口(无 HTML)
    worker: { src: "worker/index.ts", html: false },
  },
});

禁用入口自动发现

如果需要完全手动控制所有入口:

export default defineConfig({
  entry: {
    background: "background/index.ts",
    content: "content/index.ts",
    popup: "popup/index.tsx",
    // ... 列出所有需要的入口
  },
  // 不要的配置项保持未定义,框架只会处理 entry 中列出的入口
});

路径解析规则

相对于 baseDir

entry 中所有路径均相对于 baseDir,baseDir 由 appDir 决定(默认 app):

export default defineConfig({
  appDir: "src",                    // baseDir = src/
  entry: {
    popup: "popup/index.ts",        // 指向 src/popup/index.ts
  },
});

路径速查表

配置写法入口脚本位置典型输出
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

下一步