入口加载器
为了在构建时生成 manifest 及其他文件,WXT 必须导入每个入口文件以获取它们的选项,比如内容脚本的 matches
。对于 HTML 文件,这很简单。对于 JS/TS 入口文件,过程则更为复杂。
在加载 JS/TS 入口文件时,它们会被导入到 NodeJS 环境中,而不是它们通常运行的 browser
环境。这可能会导致在 NodeJS 环境中运行仅限浏览器的代码时常见的问题,比如缺少全局变量。
WXT 会进行一些预处理步骤,以尽量防止此过程中的错误:
- 使用
linkedom
提供一小部分浏览器全局变量(如window
、document
等)。 - 使用
@webext-core/fake-browser
创建扩展程序常用的chrome
和browser
全局变量的假版本。 - 预处理 JS/TS 代码,剥离
main
函数,然后对文件进行 tree-shaking,移除未使用的代码。
然而,这一过程并不完美。它不会设置浏览器中所有的全局变量,并且这些 API 的行为可能有所不同。因此,你应当避免在入口文件的 main
函数之外使用浏览器或扩展 API!
TIP
如果你在导入入口文件时遇到错误,可以运行 wxt prepare --debug
查看该过程的更多细节。在调试时,WXT 会打印出预处理后的代码,帮助你定位问题。
一旦环境被 polyfill 并且你的代码被预处理后,入口加载器会导入你的代码,并从默认导出中提取选项。