各個框架
| 維度 | Extension.js | WXT | CRXJS | Plasmo |
|---|---|---|---|---|
| 模型 | manifest.json 為唯一來源 | 檔案慣例 + 設定 | 讀取 manifest 的 Vite plugin | 檔案慣例 |
| 打包工具 | Rspack(內建,零設定) | Vite | Vite(plugin 層) | Parcel |
| 跨瀏覽器 | 同一份原始碼支援 Chrome、Edge、Firefox | Chrome、Firefox、支援 MV2 | 聚焦 Chromium | 鎖定 Chrome、Firefox |
| 設定 | 無需任何設定 | wxt.config.ts | vite.config.ts + plugin | package.json 的 manifest 欄位 |
| 與打包工具耦合度 | 內部細節 | 須跟著 Vite 主版本 | 打包工具升級可能造成中斷 | 綁定 Parcel |
- manifest 放在哪裡。 Extension.js 讀取你的
manifest.json,並編譯它所宣告的所有內容。WXT 與 Plasmo 則是從檔案慣例與設定產生 manifest。CRXJS 雖然會讀取 manifest,但會透過 Vite 的 plugin API 解析,這也是為什麼打包工具升級可能讓它中斷(參見 Vite 8 的 fileName 錯誤)。 - 由誰掌控打包工具。 包裝通用打包工具的框架,就會繼承該打包工具的破壞性變更。Extension.js 把打包工具視為內部細節:你永遠不會去設定它,升級的問題由框架負責,而不是你。
詳細比較與遷移指南
- Extension.js vs WXT:最相近的比較,按維度逐項分析。
- 從 CRXJS 遷移:一般專案約十分鐘完成的逐步流程。
- 修正:Content script fileName 為 undefined:CRXJS + Vite 8 的建置錯誤與解法。
- 從 Plasmo 遷移:慣例對應到 manifest、環境變數與 CSUI。
不需投入即可試用
只要一行指令,就能執行任何擴充功能範本,或 GitHub 上任何擴充功能的儲存庫:chrome.* 呼叫與樣式都能從任何這些框架延續過來;遷移指南 涵蓋需要調整的串接細節。
