Skip to main content
Bun 可以充当 Extension.js 项目的包管理器和脚本运行器。Extension.js 会检测到 Bun,把它记录进 package.json,并在自己的输出里打印 Bun 命令。 Extension.js CLI 本身跑在 Node 上。这个分工就是下面那个问题的全部答案。

我可以用 Bun 代替 Node 吗?

对你的项目来说,可以。对 CLI 进程来说,不行。 Bun 仍然是你的操作界面,Node 仍然是执行 CLI 的运行时。两者都要装。

用 Bun 创建项目

Extension.js 看得出是 Bun 调用了它。它打印出来的后续步骤会点名 Bun:
生成的 package.json 会固定住你用的那个管理器:
package.json

安装与构建

这会写下一个 bun.lock 文件。之后每次运行,Extension.js 都会读取这个锁文件,以便继续选择 Bun。
脚手架写下的脚本与管理器无关。每一条都调用 extension 这个可执行文件,所以 bun run devbun run buildbun run preview 都能用。

CLI 为什么需要 Node

发布出去的包声明了 "engines": {"node": ">=22.12"}。CLI 在启动时检查 process.versions.node,版本太低就停下来。 Bun 报告的 Node 兼容版本低于这个下限。因此强行使用 Bun 运行时会触发这道守卫:
去掉 --bun,同一条命令就能用。普通的 bunx 会尊重 CLI 可执行文件上的 #!/usr/bin/env node shebang,所以进程跑在 Node 上,而解析和缓存交给 Bun。

Extension.js 如何检测 Bun

检测读的是项目,而不是你敲下的那条命令。有三个信号喂给它:
  • 项目根目录下的 bun.lockbun.lockb 锁文件。
  • package.json 里点名 bunpackageManager 字段。
  • Bun 运行脚本时设置的 npm_config_user_agent 环境变量。
Extension.js 支持 npmpnpmyarnbundeno。当一个信号都没有时,它会按 pnpmyarnbun 的顺序去探测你的 PATH

自动安装依赖

extension devextension build 会在编译之前先装上缺失的依赖。这次安装走的是被检测到的那个管理器,并且会传入 --ignore-scripts。因此依赖里的 postinstall 脚本不会在这一步运行。

注意事项

  • Bun.file 这类 Bun 专有的运行时 API 不属于扩展代码。那些代码是跑在浏览器里的。
  • Extension.js 不会写任何 Bun 专有的脚本。devbuildpreview 脚本对每个管理器都一样。
  • 你通过 extension create 引入的模板不带锁文件。Extension.js 会从中剥掉 bun.lockbun.lockb。之后由你自己那次安装来决定依赖树。

下一步