Skip to main content
Bun 可以擔任 Extension.js 專案的套件管理器與 script 執行器。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 都會讀取這份 lockfile,以便繼續選擇 Bun。
建立專案時寫下的 scripts 與管理器無關。每一條都呼叫 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 lockfile。
  • package.json 裡點名 bunpackageManager 欄位。
  • Bun 執行 script 時所設定的 npm_config_user_agent 環境變數。
Extension.js 支援 npmpnpmyarnbundeno。當一個訊號都沒有時,它會依 pnpmyarnbun 的順序探測你的 PATH

自動安裝相依套件

extension devextension build 會在編譯之前先裝上缺少的相依套件。這次安裝走的是被偵測到的那個管理器,而且會傳入 --ignore-scripts。因此相依套件裡的 postinstall script 不會在這一步執行。

注意事項

  • Bun.file 這類 Bun 專有的執行階段 API 不屬於擴充功能程式碼。那些程式碼是跑在瀏覽器裡的。
  • Extension.js 不會寫任何 Bun 專有的 scripts。devbuildpreview scripts 對每個管理器都一樣。
  • 你透過 extension create 引入的範本不帶 lockfile。Extension.js 會從中剝掉 bun.lockbun.lockb。之後由你自己那次安裝決定相依樹。

下一步