Skip to main content
在開發期間以受管理、持久或自訂的設定檔,控制瀏覽器狀態的隔離程度。 依照工作流程,讓瀏覽器工作階段保持隔離或持續可重用。Extension.js 啟動瀏覽器時會套用設定檔感知的預設值。可選擇全新的乾淨執行、可重用的狀態,或是明確指定的本地設定檔路徑。

運作方式

Extension.js 會依以下順序決定設定檔模式:
  1. 當 profile: false 或 EXTENSION_USE_SYSTEM_PROFILE=true 時使用系統設定檔模式
  2. 明確指定的 profile 路徑(若有提供)
  3. 受管理設定檔模式(預設)
    • 預設為暫存(短暫)模式
    • 當 persistProfile: true 或 keepProfileChanges: true 時改為持久模式

--profile 的值如何被讀取

CLI 是以字串傳遞旗標的值,因此 Extension.js 會先做正規化:
  • --profile=false(或設定檔中的 profile: false)代表使用瀏覽器自己的預設設定檔。
  • --profile=true 代表受管理的預設值,等同於不設定這個選項。
  • 其他任何字串都會被當成明確指定的設定檔路徑。
相對的 --profile 路徑是相對於專案(編譯情境)解析,而不是相對於你 shell 的工作目錄。這可以避免依序執行不同專案時全部塌縮到同一個共用設定檔。

Firefox 與其他 Gecko 瀏覽器上的系統設定檔模式

Extension.js 拒絕在系統設定檔模式下啟動 Firefox 或任何其他以 Gecko 為基礎的瀏覽器。 只在 Chromium 家族瀏覽器上使用它。
Extension.js 透過遠端除錯把附加元件安裝進 Gecko 瀏覽器,而瀏覽器自己的設定檔預設關閉遠端除錯。因此在使用 --profile=false、profile: false 或 EXTENSION_USE_SYSTEM_PROFILE=true 時,dev、start 與 preview 會在瀏覽器啟動之前停下,不會有任何東西以你平常使用的設定檔開啟。這適用於 CLI 啟動的每一個 Gecko 目標:firefox、waterfox、librewolf、zen、floorp 與 gecko-based。 這三個指令都會輸出一段說明,指出該設定的來源以及兩條出路。瀏覽器名稱會隨你的目標而變,SET BY 行會列出每一個生效的來源(--profile=false、profile: false in extension.config.js 或 EXTENSION_USE_SYSTEM_PROFILE=true):
extension dev 會讓開發伺服器繼續執行並監看,ready.json 處於 error(代碼 browser_launch_failed,browserLaunchFailedCode: "E_FLAG_NOT_SUPPORTED_HERE")。extension start 與 extension preview 以結束代碼 1 結束。使用 --output json 時,每個指令都會以 E_FLAG_NOT_SUPPORTED_HERE 與 status: "usage" 失敗。 較早的版本會以你自己的設定檔啟動瀏覽器,但其中沒有載入任何東西。要得到可用的工作階段,請選擇這段說明中提到的兩條出路之一:
  • 拿掉 --profile=false(以及 profile: false 或 EXTENSION_USE_SYSTEM_PROFILE),讓 Extension.js 管理設定檔並安裝附加元件。加上 persistProfile: true 可在多次執行間保留登入與狀態,也可以用 copyFromProfile 從既有設定檔為受管理設定檔建立初始內容。
  • 傳入 --profile=<path>,以你自己的設定檔目錄啟動。Extension.js 會把附加元件安裝進去。

設定檔功能

以 copyFromProfile 建立初始內容

copyFromProfile 會在啟動前把來源目錄複製到受管理設定檔中。只有當目標是全新的,也就是不存在或為空時才會複製。因此持久化的設定檔只會被複製一次,你之後的變更會在每次執行後保留下來。

設定檔模式

Extension.js 會在下列位置建立受管理設定檔:
  • dist/extension-js/profiles/<browser>-profile/<...>
持久模式使用:
  • dist/extension-js/profiles/<browser>-profile/dev
每次暫存執行都會取得一個以「形容詞-顏色-動物」形式產生的三字末端目錄名稱,例如 brave-magenta-heron。這個名稱每次執行都是隨機的,所以不要寫死。想知道某次執行使用的是哪個設定檔,請讀取該工作階段 ready.json 中的 profilePath 欄位。

在 extension.config.* 中設定

你也可以依指令來設定預設值:

CLI 用法

直接使用明確的設定檔路徑:
在 start 與 preview 的用法類似。

生命週期說明

  • Extension.js 會為每次執行建立暫存的受管理設定檔。
  • Extension.js 會在多次執行間重複使用持久的受管理設定檔(dev)。
  • 每個暫存設定檔都帶有一個 .extension-js-managed-profile 標記檔。瀏覽器結束時,Extension.js 只會移除帶有該標記的目錄,因此被保留的設定檔與明確指定的設定檔永遠不會被回收。
  • Extension.js 也會在下次啟動時清掃過期的帶標記設定檔。可透過 EXTENSION_TMP_PROFILE_MAX_AGE_HOURS 控制最長保留時間(預設 12 小時)。
  • 每次啟動 Firefox 時,Extension.js 都會刪除該設定檔的 startupCache 目錄。否則被釘選或持久化的設定檔可能在整次 dev 重新啟動後仍提供過期的擴充功能程式碼。

被鎖定的 Chromium 設定檔

如果同一台機器上另一個仍在執行的瀏覽器程序正持有該設定檔,Extension.js 會拒絕啟動,而不是把它弄壞。請先關閉那個瀏覽器,或改用其他設定檔。
在 Chromium 啟動前,Extension.js 會讀取該設定檔的 SingletonLock 產物。若鎖指向一個已結束的程序或另一台主機,它就是過期的。Extension.js 會移除過期的 SingletonLock、SingletonSocket 與 SingletonCookie 檔案,然後正常啟動。若持有它的程序在本機仍在執行,啟動則會中止。該工作階段的 ready.json 會標上 profile_locked 錯誤碼,因此機器端的使用者永遠不需要解析錯誤句子。

隱私

受管理設定檔是一份完整的瀏覽器設定檔。它保存了你在那個瀏覽器工作階段中所做的一切留下的 cookie、瀏覽紀錄與登入資料。Extension.js 會在 dist/extension-js 中寫入一次帶有 * 規則的 .gitignore,因此設定檔與工作階段狀態永遠不會進入 git。不要提交或散布這個目錄。

最佳實務

  • 以受管理的暫存設定檔做基線測試:減少隱藏狀態與難以重現的問題。
  • 以 persistProfile 進行長時間除錯:在多次執行間保留登入/工作階段/開發者工具狀態。
  • 每個瀏覽器家族使用各自的自訂設定檔:避免跨瀏覽器互相污染。
  • 有意識地使用系統設定檔模式:適合在 Chromium 家族瀏覽器上重現問題,但隔離程度不如受管理設定檔。Extension.js 會拒絕在這種模式下啟動 Gecko 瀏覽器。

後續步驟