選擇外掛程式格式

本頁內容

EmDash 外掛程式以兩種格式之一交付:沙盒式原生。這個選擇會影響外掛程式的安裝方式、執行時期獲得的強制執行以及可用的功能。

預設使用沙盒式。 沙盒式外掛程式可以發布到市集並從管理介面一鍵安裝。原生外掛程式需要修改程式碼、執行 npm install 並在每個想要使用它們的網站上重新部署。沙盒式是終端使用者想要的。

僅在需要沙盒無法提供的功能時才選擇原生。

概覽

沙盒式原生
描述符上的 format 欄位"standard""native"
安裝方法從管理市集一鍵安裝npm install + 編輯 astro.config
執行環境由沙盒執行器提供的隔離執行時期與您的 Astro 網站相同的處理程序
功能由沙盒橋接強制執行由相同橋接在處理程序內強制執行
資源限制由執行器強制執行 — 通常是 CPU、子請求、執行時間、記憶體
網路存取ctx.http,限制為 allowedHostsctx.http,限制為 allowedHosts
直接 fetch() / process.env被執行器阻止可能(外掛程式碼共用執行時期)
分發方式市集上的 .tar.gz 套件npm 套件
管理介面Block Kit(JSON 描述)路由React 元件或 Block Kit
設定介面Block Kit 頁面 + KV 讀取admin.settingsSchema(自動表單)或 Block Kit
Portable Text 轉譯元件不可用componentsEntry 提供 Astro 元件
頁面中繼資料貢獻page:metadata 掛鉤 — meta/property 標籤、白名單 <link> rels、JSON-LDpage:metadata 掛鉤(相同介面)
頁面片段注入不可用 — 僅透過 page:metadata 注入 meta/JSON-LDpage:fragments 掛鉤 — 內嵌指令碼、外部指令碼、原始 HTML
建構函式選項無 — 在執行時期從 KV 讀取設定描述符上的 options

選擇原生會失去什麼

原生外掛程式看起來像同一事物的更強大版本,確實如此 — 但代價很高:

  • 沒有市集。 每個網站都必須安裝您的 npm 套件、編輯 astro.config.mjs 並重新部署。
  • 沒有隔離。 外掛程式中的錯誤可能會導致主機處理程序當機或耗盡其 CPU 預算。掛鉤中未處理的拒絕可能會連同周圍的請求一起倒下。
  • 使用者的信任負擔。 原生外掛程式具有與主機網站相同的存取權限。終端使用者無法僅透過功能宣告來稽核它們。

如果您的外掛程式可以在沙盒中完成工作,就應該這樣做。

何時選擇原生

選擇原生有三個原因,它們都與需要與主機網站進行建置時期整合的功能有關:

  1. 自訂 React 管理頁面或小工具。 沙盒式外掛程式使用 Block Kit 描述其管理介面 — 這是管理員代表外掛程式轉譯的 JSON 結構描述。如果您需要完整的 React(自訂掛鉤、第三方元件、複雜狀態),則需要原生。

  2. 用於在公開網站上轉譯 Portable Text 區塊的 Astro 元件。 外掛程式可以使用 format: "standard" 宣告自訂區塊類型,但在公開網站上轉譯它的 Astro 元件必須在建置時期從 npm 載入。只有原生外掛程式可以提供 componentsEntry

  3. 將原始 HTML、指令碼或樣式表注入公開頁面。 page:fragments 掛鉤將第一方程式碼傳送到訪客的瀏覽器 — 在任何沙盒邊界之外。它僅限於原生外掛程式。沙盒式外掛程式仍然可以透過 page:metadata 掛鉤為公開頁面做出貢獻,它涵蓋了許多實際使用案例:

    • meta 標籤(name + content)— SEO 描述、robots 指令、Twitter Cards
    • property 標籤 — OpenGraph 和其他基於屬性的中繼資料
    • 具有安全鎖定 rel 白名單的 link 標籤(canonicalalternateauthorlicensenlwebsite.standard.document)— stylesheetprefetch 和類似的資源載入 rels 被刻意不允許
    • JSON-LD 圖

    如果您的「頁面注入」需求是結構化資料或 SEO 中繼資料,請保持沙盒式並使用 page:metadata。如果您確實需要將 JavaScript 或 HTML 傳送到訪客的瀏覽器,那就是選擇原生的情況。

如果您不確定,請選擇沙盒式。您始終可以稍後遷移到原生 — 但相反則更困難,因為原生專有功能沒有沙盒等效物。

沙盒執行器和平台支援

沙盒本身是可插拔的。EmDash 公開了一個 sandboxRunner 組態選項,執行器決定如何隔離外掛程式碼 — 外掛程式格式本身沒有任何 Cloudflare 特定的內容。

今天大多數網站使用的執行器是來自 @emdash-cms/cloudflaresandbox(),它使用 Cloudflare Workers 的 Dynamic Worker Loader。Worker Loader 按外掛程式 ID 快取 V8 隔離,因此隔離冷啟動成本只需支付一次;執行器在每次呼叫時建構一個新的 worker 存根和橋接繫結,因為存根和繫結與呼叫請求的 I/O 情境繫結。其他平台(透過 workerd 的 Node.js 以及可能的 Deno)的執行器正在開發中。

如果未組態執行器,或者如果組態的執行器報告在目前平台上不可用,則在啟動時跳過 sandboxed: [] 下列出的外掛程式,並記錄偵錯層級日誌。

如果您希望標準格式外掛程式在沒有沙盒執行器的平台上執行,請將其從 sandboxed: [] 移動到 plugins: [] 陣列 — 它將在處理程序中執行。功能宣告仍然受到尊重(相同的 PluginContext 工廠限制 ctx.contentctx.http 等),但沒有隔離邊界,沒有資源限制,有錯誤或惡意的外掛程式可以直接呼叫 fetch()、讀取環境變數或阻止事件迴圈。如果沒有活動的沙盒執行器,出於信任目的,請將每個外掛程式視為原生外掛程式。

下一步