プラグイン形式の選択

このページ

EmDash プラグインは sandboxed または native のどちらかの形式を使います。オーサリング形状、インストール経路、信頼境界が異なるため、プラグインを書く前に形式を選んでください。

プラグインが native 専用の統合を必要としない限り、sandboxed プラグインを選んでください。sandboxed プラグインはレジストリに公開し、管理 UI からインストールできます。native プラグインは、サイト運用者がプロジェクトにインストールし、再デプロイ前に astro.config.mjs に追加する npm パッケージです。

一目で

SandboxedNative
Authoring shapeemdash-plugin.jsonc + src/plugin.tsdefinePlugin() descriptor
Install methodOne-click from the admin registrynpm install + edit astro.config
Runs inAn isolated runtime provided by a sandbox runnerSame process as your Astro site
Capability-gated ctx APIsEnforced by the sandbox bridgeGated by PluginContext, but not a security boundary
Resource limitsRunner limits for CPU, subrequests, and wall time; platform memory ceilingNo per-plugin limits
Network accessctx.http, restricted to declared accessctx.http follows declarations; native code can also call fetch()
Direct fetch() / process.envBlocked by the runnerPossible (plugin code shares the runtime)
DistributionSigned release in the plugin registrynpm package
Admin UIBlock Kit (JSON-described) routesReact components, or Block Kit
Settings UIBlock Kit page + ctx.settingsadmin.settingsSchema (auto-form) or Block Kit
Portable Text rendering componentsNot availablecomponentsEntry provides Astro components
Page metadata contributionspage:metadata hook — meta/property tags, allowlisted <link> rels, JSON-LDpage:metadata hook (same surface)
Page fragment injectionNot available — meta/JSON-LD only via page:metadatapage:fragments hook — inline scripts, external scripts, raw HTML
Constructor optionsNone — read settings from KV at runtimeoptions on the descriptor

native プラグインのコスト

native プラグインには異なるインストールと信頼モデルがあります。

  • プロジェクト単位のインストール。 すべてのサイトが npm パッケージをインストールし、astro.config.mjs を編集して再デプロイする必要があります。
  • 分離なし。 プラグインのバグがホストプロセスをクラッシュさせたり、CPU 予算を消費したりします。フック内の未処理の rejection が周囲のリクエストも巻き添えにすることがあります。
  • ユーザー側の信頼負担。 native プラグインはホストサイトと同じアクセスを持ちます。ケイパビリティ宣言だけでは、コードができることのすべてを示せません。

プラグインがサンドボックスで仕事をできるなら、そうすべきです。

native にするとき

ホストサイトとのビルド時統合が必要な機能には native を選んでください。

  1. カスタム React 管理ページまたはウィジェット。 sandboxed プラグインは管理 UI を Block Kit — 管理画面がプラグインの代わりにレンダリングする JSON スキーマ — で記述します。フル React(カスタムフック、サードパーティコンポーネント、複雑な状態)が必要なら native が必要です。

  2. カスタム Portable Text ブロック型。 編集設定と Astro レンダリングコンポーネントはインストール済み npm パッケージから読み込まれます。そのビルド時サーフェスを提供できるのは native プラグインだけです。

  3. 公開ページへの生 HTML、スクリプト、スタイルシートの注入。 page:fragments フックは訪問者のブラウザにファーストパーティコードを送ります — どのサンドボックス境界の外でも。native プラグインに限定されています。sandboxed プラグインは、多くの実用例をカバーする page:metadata フック経由で公開ページに引き続き貢献できます。

    • meta タグ(name + content)— SEO 説明、robots ディレクティブ、Twitter カード
    • property タグ — OpenGraph やその他の property ベースのメタ
    • セキュリティで固定された rel 許可リスト付きの link タグ(canonical、alternate、author、license、nlweb、site.standard.document)— stylesheet、prefetch、および同様のリソース読み込み rel は意図的に許可されていません
    • JSON-LD グラフ

    「ページ注入」の必要が構造化データや SEO メタデータなら、sandboxed のまま page:metadata を使ってください。訪問者のブラウザに実際に JavaScript や HTML を送る必要があるなら、それが native にするケースです。

これらの機能のいずれも当てはまらない場合は、sandboxed 形式を使ってください。

サンドボックスランナーとプラットフォームサポート

サンドボックス自体は差し替え可能です。EmDash は sandboxRunner 設定オプションを公開し、ランナーがプラグインコードの分離方法を決めます — プラグイン形式自体に Cloudflare 固有のものはありません。

EmDash には 2 つのランナーが同梱されています。@emdash-cms/cloudflare の sandbox() は Cloudflare の Worker Loader 経由で各プラグインを Dynamic Worker として実行し、@emdash-cms/sandbox-workerd/sandbox は Node.js 上の workerd 子プロセスでプラグインを実行します。Plugin Sandbox では各ランナーのセットアップ、適用するリソース制限、両者の違いを扱います。

ランナーが構成されていない場合、sandboxed: [] に列挙されたプラグインは読み込まれません。構成済みランナーが現在のプラットフォームで利用できない場合も読み込まれず、EmDash は起動時に警告を記録します。

サンドボックスランナーのないプラットフォームで sandboxed プラグインを動かしたい場合は、sandboxed: [] から plugins: [] 配列へ移してください — プロセス内で実行されます。ケイパビリティ宣言は引き続き守られます(同じ PluginContext ファクトリが ctx.content、ctx.http などをゲートします)が、分離境界もリソース制限もなく、バグのあるまたは悪意のあるプラグインが fetch() を直接呼び、環境変数を読み、イベントループをブロックできます。サンドボックスランナーが有効でないときは、信頼の観点ですべてのプラグインを native プラグインとして扱ってください。

次へ