入口点加载器
为了在构建时生成 manifest 和其他文件,WXT 必须导入每个入口点以获取其选项,例如 content script 的 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 且代码完成预处理,接下来就由入口点加载器来导入你的代码,从默认导出中提取选项。