vite build,得到了:
这个错误到底意味着什么
@crxjs/vite-plugin 分两轮构建你的扩展。在 generateBundle 阶段,crx:manifest-post 步骤会遍历 manifest 中每一个 content_scripts 条目,并向打包器询问每个源文件对应输出 chunk 的文件名。如果打包器对那个源路径没有返回任何 chunk,查询结果就是 undefined,于是插件抛出错误。
所以这个错误并不是“你的文件不存在”。它意味着插件和打包器对你 content script 输出 chunk 的命名或键值方式产生了分歧。
为什么 Vite 8 触发了它
Vite 8 把 Rollup 换成了 Rolldown 作为默认打包器。CRXJS 是按照 Rollup 的 chunk 发射模型编写的,它的 content script 解析依赖于在 Rolldown 下行为不同的内部机制。这个错误在某些特定配置下早已存在(被记录在 crxjs/chrome-extension-tools#883),但 Vite 8 的默认设置让它从边缘场景变成了常见场景。让 CRXJS 继续工作的变通方案
按顺序尝试:-
锁定到 Vite 7。 Vite 7 仍然使用 Rollup,CRXJS 可以理解:
这能立刻让构建恢复,代价是停留在旧版本 Vite 上。
-
将
@crxjs/vite-plugin升级到最新版本。 该项目正在逐步增加对 Rolldown 的兼容。在固定任何版本之前,请查看发布页和上面的 issue 了解当前的支持状态。 -
检查 manifest 如何引用脚本。 查询是按路径来匹配的。让
content_scripts.js条目和你项目根目录的路径风格保持一致(相对路径,不带前导斜杠),并确认同一个文件没有在其他地方以?script后缀被动态导入。
结构性的修复
根本问题是架构层面的:CRXJS 在通用打包器的插件 API 之上重新构建扩展语义(manifest 接线、content script 发射、HMR),所以每一次重大的打包器变更都可能让它失效。Extension.js 是一个 浏览器扩展框架,其中 manifest 是事实来源,而打包器只是一个你永远不需要接线的内部细节:- 你的
manifest.json直接声明content/index.ts。没有插件去解析 chunk 名称;框架直接编译 manifest 指向的内容。 - 没有
vite.config.ts,没有manifest.config.ts,也没有需要保持对齐的插件版本矩阵。 - 同一份源码同时输出 Chrome、Firefox 和 Edge 构建,每个界面都有对应的重载行为。
chrome.* 调用都可以原封不动地沿用。完整的迁移大约花 10 分钟:从 CRXJS 迁移到 Extension.js。

