manifest.json 視為進入點、資產與瀏覽器專屬行為的唯一來源,讓擴充功能建置維持可預期。
Extension.js 會編譯你的 manifest,過濾帶有瀏覽器前綴的欄位。它會改寫執行階段路徑、驗證被引用的檔案,並為每個目標瀏覽器產出可直接載入的 manifest。
Manifest 能力
Extension.js 從哪裡讀取 manifest
src/manifest.json(存在時優先)- 專案根目錄的
manifest.json
public/manifest.json 作為來源 manifest。
放在 public/ 之下的 manifest.json 會讓建置以 manifest.json must not be placed under public/ 失敗。請把它移到 src/manifest.json 或專案根目錄,這樣被複製的靜態資產就永遠不會覆蓋 Extension.js 產生的 manifest。
Extension.js 對 manifest 做了什麼
在 dev/build 期間,manifest 管線會:- 從你的來源檔輸出 manifest 資產。
- 為目前作用中的瀏覽器目標過濾帶有瀏覽器前綴的鍵。
- 為擴充功能輸出套用 manifest 覆寫/路徑標準化。
- 驗證被引用的檔案(HTML/scripts/CSS/圖示/JSON),在缺漏時及早失敗。
一份 manifest,多個瀏覽器
帶有瀏覽器前綴的鍵讓你能維持一份 manifest,同時針對瀏覽器專屬行為:chromium:*套用到所有 Chromium 家族瀏覽器,chrome:*與edge:*各自只套用到一個瀏覽器firefox:*、gecko:*
chromium:keybackground.firefox:scriptsbackground.chromium:service_worker
支援的 manifest 欄位
常見的進入點相關欄位包含:權限設計
Manifest 也是你擴充功能宣告自身能力的地方。Extension.js 會編譯 manifest,但你仍需要良好的權限設計。- 保持
permissions小巧而刻意。 - 把
host_permissions限制在功能所允許的最小範圍。 - 在可能的情況下,把非核心能力放到
optional_permissions或optional_host_permissions。 - 當 content script 的比對或 background 能力改變時,重新檢視權限範圍。
輸出行為
Extension.js 在需要時會把 manifest 路徑改寫為可預期的輸出位置。兩個重要範例:background.service_worker變成background/service_worker.jsside_panel.default_path變成sidebar/index.htmlpage_action.default_popup變成page_action/index.html,在 Firefox(任何 manifest 版本)與 Chromium MV2 上是工具列彈出視窗旁的獨立頁面。當page_action與action(或browser_action)指向同一個檔案時,兩個鍵共用action/index.html。Chromium MV3 沒有 page action 介面,因此建置會帶著警告從該 manifest 移除page_action,也不會輸出它的頁面。
content_scripts/content-0.jscontent_scripts/content-0.css
Manifest V2 建置會合併 host permissions 並把 CSP 壓平
從 4.1.18 開始,每一個manifest_version: 2 的建置都會重塑兩個 Manifest V3 鍵,對任何瀏覽器目標都是如此。你的來源 manifest 保持原樣。
host_permissions 會合併進 permissions,optional_host_permissions 會合併進 optional_permissions。每個清單都會去重,兩個 MV3 鍵會從輸出的 manifest 移除。Manifest V2 從 permissions 讀取比對樣式,Firefox 也正是在那裡找它們。
content_security_policy 會輸出為一個字串,取自物件形式裡的 extension_pages 欄位。Manifest V2 沒有地方放 sandbox 欄位,所以那條政策會帶著警告被丟棄:
"permissions": ["storage", "https://example.com/*"] 與 "content_security_policy": "script-src 'self'",且不含 host_permissions 鍵。
開發行為
- 當
manifest.json變更時,Extension.js 會重新編譯並觸發擴充功能 hard reload 流程。 - 如果 manifest 進入點結構變更(例如 script 清單改變),Extension.js 可能需要重新啟動開發伺服器。
- 被 manifest 欄位參考的檔案若缺失,編譯會以聚焦在 manifest 的錯誤訊息失敗。
變更結果對照表
Extension.js 會替你修復什麼
有些 manifest 形態會讓 Chromium 直接拒絕載入擴充功能,而且幾乎不給任何說明。Extension.js 會在瀏覽器啟動前診斷這些狀況,並自動修復其中致命的那些。每次修復都會印出一則警告,指出欄位與原因。拒絕原因與修復方式的完整清單,請見 Manifest 拒絕載入。舊版路徑警告
當產出的 manifest 仍然包含下列已淘汰的生成路徑時,開發建置與正式建置都會發出警告:devtools_page/devtools_page.htmloptions_ui/page.htmlbackground/page.htmlbrowser_action/default_popup.htmlpage_action/default_popup.htmlside_panel/default_path.htmlsidebar_action/default_panel.html
ManifestLegacyWarning。Extension.js 會在下一個主要版本把這些路徑改寫到標準化的資料夾。
最佳實務
- 讓 manifest 路徑相對於擴充功能來源/輸出模型,只有在意指擴充功能輸出根目錄時才使用開頭
/。 - 使用帶瀏覽器前綴的鍵,而不是為每個瀏覽器維護不同的 manifest 檔案。
- 刻意管理進入點變更;在 manifest 中新增/移除 script 經常會改變開發期的 reload 語義。
- 在持續整合(CI)中驗證圖示、JSON 資源與 content script 資產,以及早抓出路徑回歸。
- 不要把
manifest.json放在public/之下。
後續步驟
- 在 dev 更新行為中了解更新結果。
- 在權限與 host 權限中設計最小權限存取。
- 了解 Extension.js 如何處理瀏覽器專屬 manifest 欄位。
- 在頁面重新載入與 hot module replacement(HMR)中了解開發更新流程。

