首页 / WXT 浏览器扩展框架教程 / 入口点:一个文件定义一个功能

WXT 浏览器扩展框架教程

入口点:一个文件定义一个功能

本教程共 45 篇 · 第 7 篇 · 更新于 2026-08-13 · 约 4 分钟阅读

WXT入口点entrypoints项目结构manifest浏览器扩展

本节目标:理解入口点是什么,掌握单文件与目录两种写法,认识全部 13 类入口类型,学会在入口文件里声明 manifest 选项。

什么是入口点

第 04 章介绍了 entrypoints/ 目录,这一章把里面的「居民」逐个认一遍。

入口点(entrypoint)是扩展的独立功能单元。弹窗是一个入口点,后台是一个入口点,注入网页的脚本也是一个入口点。WXT 把 entrypoints/ 目录下的所有文件当作构建输入,帮你打包、生成 manifest。一个入口点由一个文件定义,或由一个目录定义;文件名(目录名)决定它的类型。

两种写法:单文件或目录

📂 entrypoints/
   📄 {name}.{ext}          # 单文件写法
   📂 {name}/
      📄 index.{ext}        # 目录写法

以后台入口为例,两种写法等价:

📂 entrypoints/
   📄 background.ts         # 写法一

📂 entrypoints/
   📂 background/
      📄 index.ts           # 写法二

目录写法的好处:配套文件可以放在 index 旁边,比如 popup 目录里的 main.tsstyle.css。它们不会变成独立入口,只是弹窗的「零件」。

别把零件直接平铺进

根目录,比如 popup.tspopup.css 各放一个。WXT 会把它们各自当成一个入口点去构建,通常直接报错。需要配套文件时,用目录写法。

深层嵌套?不支持

entrypoints/ 看起来像 Nuxt 或 Next.js 的 pages/ 目录,但它不支持深层嵌套。入口点最多一层深:entrypoints/youtube.content/index.ts 合法,entrypoints/youtube/content/index.ts 不行。

遇到「一个功能一个子目录」的需求,拆成多个平级入口:

📂 entrypoints/
   📂 youtube.content/      # 平级,合法
   📂 youtube-injected/     # 平级,合法

13 类入口类型全景

WXT 按文件名识别入口类型,一共 13 类:

类型文件名模式(示例)说明
后台 backgroundbackground.tsMV3 service worker / MV2 后台页
弹窗 popuppopup.html点击工具栏图标弹出
选项页 optionsoptions.html扩展设置页
内容脚本 content scriptcontent.ts{name}.content.ts注入网页的脚本
侧边栏 sidepanelsidepanel.html{name}.sidepanel.html浏览器侧边栏
新标签页 newtabnewtab.html覆盖浏览器新标签页
开发者工具 devtoolsdevtools.html注册 DevTools 面板
书签页 bookmarksbookmarks.html覆盖书签管理器
历史页 historyhistory.html覆盖历史记录页
沙盒页 sandboxsandbox.html{name}.sandbox.html受限沙盒页面(仅 Chromium)
未列出页面 unlisted page{name}.html打包但不注册的页面
未列出脚本 unlisted script{name}.ts打包但不注册的脚本
未列出 CSS unlisted CSS{name}.css打包但不注册的样式

前 10 类是已列出(listed)入口,会写进 manifest.json,由浏览器自动注册。后 3 类是未列出(unlisted)入口,只打包不注册,需要代码自己加载,第 13 章专门讲。

记不住全部没关系。日常 80% 的项目只用 background、popup、options、content script 四类,其余用到再查这张表。

在入口文件里声明 manifest 选项

传统开发里,入口的配置写在独立的 manifest.json。WXT 反过来:选项写在入口文件内部,构建时自动生成 manifest。

TS 入口用 defineXxx 的配置对象声明,比如内容脚本的匹配范围:

// entrypoints/content.ts
export default defineContentScript({
  matches: ['*://*.wxt.dev/*'],
  main() {
    // ...
  },
});

HTML 入口用 <meta> 标签声明,比如让 MV2 弹窗使用 page_action:

<!doctype html>
<html lang="en">
  <head>
    <meta name="manifest.type" content="page_action" />
  </head>
</html>

构建时 WXT 读取这些选项,生成对应的 manifest.json(生成规则如 §25 所述)。

真实项目里的入口怎么配

mkext 是一个入口齐全的生产级项目,每个入口对应一种用户打开方式:

入口用户如何打开典型用途
background浏览器自动管理协调请求、缓存数据
popup点击工具栏图标紧凑快捷操作
options扩展设置入口完整设置页
sidepanel浏览器侧边栏边浏览边操作的常驻面板
newtab打开新标签页新标签替换页
devtools + devtools-panel打开开发者工具检查网页的专用面板
tabs(未列出页面)代码通过 URL 打开登录、帮助页
google-search.content注入 Google 搜索结果页在结果旁显示信息
domain-rating.content注入其他网页页面悬浮面板

选型可以记个口诀:快速操作选弹窗,复杂设置选选项页,边看边用选侧边栏,产品即首页才选新标签页,读改网页 DOM 选内容脚本,集中监听事件选后台。

不需要的入口要果断删。尤其 newtab 会改变用户习惯,删除后重新构建,检查生成的 manifest 里没有残留配置(删除步骤如 §12 所述)。

小结

  • 入口点是 WXT 的核心抽象:一个文件或目录,就是一个功能。
  • 13 类入口分 listed(进 manifest)与 unlisted(不进 manifest)两类,选项写在入口文件里(JS 用选项对象,HTML 用 meta 标签)。
  • 入口只支持零到一层嵌套,别把文件散放在 entrypoints/ 根目录。