プラグイン
作成2026年6月1日Takeshi Takatsudo
zfb プラグインの作成と利用 — 4 つのライフサイクルフック、仮想モジュール、インポートエイリアス、開発専用の注入ルート。
ℹ️ 翻訳予定
このページは英語版のスタブです。完全な翻訳は別の PR で行われます。 英語版: Plugins
概要
zfb プラグインは、ZfbPlugin オブジェクトをデフォルトエクスポートする ES モジュールです。zfb の build / dev ホストは各プラグインモジュールを起動時に一度ロードし、4 つのライフサイクルフックを順次ディスパッチします。
import { definePlugin } from "@takazudo/zfb/plugins";
export default definePlugin({
name: "my-plugin",
setup?(ctx) {}, // #255 — ホスト起動時に一度、preBuild の前
preBuild?(ctx) {}, // バンドラ / レンダラ前のファイル生成
postBuild?(ctx) {}, // dist/ への書き出し後の仕上げ処理
devMiddleware?(ctx) {},// zfb dev でのリクエスト単位 HTTP ハンドラ
});
4 つのフック
setup(ctx)—addAlias/addVirtualModule/injectRouteで仮想モジュール、インポートエイリアス、開発専用の合成ルートを登録します。ctx.commandが"build"か"dev"かで分岐できます。preBuild(ctx)— バンドル前にファイルを生成する用途。postBuild(ctx)—dist/書き出し後の仕上げ。ctx.routesにビルドが生成した全 URL のルートマニフェストが渡されます(preBuildではundefined)。devMiddleware(ctx)— リクエストごとに{ status, headers, body }を返す HTTP ハンドラ。injectRouteがページレンダリングパイプラインを通すのに対し、こちらは JSX を介さない素の HTTP 応答です。
設計上の制約
addAliasのコントラクトは 完全一致のみ ですが、現状 1 系統だけ振る舞いが異なります。SSR とpaths()を実行する組み込み V8 ホストは完全一致を遵守します。一方、"use client"島をバンドルする islands esbuild 経路は esbuild CLI の--aliasフラグに依拠しており、これがプレフィックス + スラッシュ一致のため@/fooを登録すると@/foo/barも書き換えてしまいます。両系統を完全一致に揃える作業は v1 フォローアップで追跡されます。当面は実際に import する specifier のみをエイリアス登録するのが安全です。addVirtualModule(specifier, loader)のloaderは 完全な ESM ソーステキスト を返します。loader はビルドごと(および dev ホスト起動ごと)に最初のimportのタイミングで 1 回だけ 実行され、結果はキャッシュされます。injectRouteは dev 専用。zfb build中に呼ぶとInjectRouteInBuildModeで失敗します。なお v1 ではレジストリへの登録・衝突検出・パターンマッチングまでが対象で、マッチした entrypoint を実際にページレンダラで評価する処理は後続イシューで対応します(マッチ自体はzfb_pluginトレースに記録されます)。- 同じキー(エイリアスの
from/ 仮想モジュールのspecifier/ 注入ルートのpattern)を 2 つのプラグインが異なる値で登録すると衝突エラーで両方のプラグイン名を含めて中断します。 SetupContextにはaddRemarkPluginなどのマークダウン拡張面は 意図的に存在しません。マークダウン関連は zfb 本体(Rust 側)に内包する方針です。
詳細は英語版を参照してください。