プラグイン機能別レシピ
はじめてのプラグイン作成では、空のフォルダから動くディレクティブまでを一続きで作りました。このページはその次の段階として、よく使う拡張ポイント別に小さなレシピをまとめています。
各レシピは独立しています。必要なものを extensions/ にコピーし、riebeckite.config.ts に登録して、ブラウザまたはビルド出力で確認してください。ここでは「何を作るか」を優先し、正確な取り決めは Plugin API に譲ります。
プラグインは信頼されたアプリケーションコードです。HTML を組み立てるレシピでは、外部から来た値を必ずエスケープします。URL を出す場合は、その用途に合った形で検証します。Riebeckite はプラグインが生成した HTML をサニタイズしません。セキュリティモデルも参照してください。
レシピ共通の準備
レシピは create-riebeckite で作ったサイトと、extensions/ に置くローカルプラグインを前提にしています。ローカルプラグインに専用のパッケージは要りません。
まず最小のプラグインを用意します。
import { definePlugin } from "@riebeckite/core";
export function example() {
return definePlugin({
name: "example",
});
}
設定に登録します。
import { defineConfig } from "@riebeckite/core";
import { example } from "./extensions/example";
export default defineConfig({
plugins: [example()],
});
各レシピは独自のファクトリを定義します。extensions/ に置き、example の代わりに登録してください。name は有効なプラグインの中で一意にしてください。プラグインのキャッシュと生成出力の名前空間は、この name が所有します。
レシピ一覧
| やりたいこと | 拡張ポイント | レシピ |
|---|---|---|
| Markdown / HTML を変換する | remarkPlugins、rehypePlugins、パイプライン |
1 |
| 埋め込まれたファイルを描画する | renderers |
2 |
| ビルド中にコンテンツを読む | onConfigResolved、onContentLoaded、onPostParsed、onPostProcessed、onManifestCreated |
3 |
| 公開 URL を変える | resolveContentLocations、extendContentLocations |
4 |
| グラフとバックリンクにリンクを追加する | extendContentGraph |
5 |
| 独立したページを追加する | pageTypes |
6 |
| UI コンポーネントを配布する | パッケージの export | 7 |
| CSS とブラウザ動作を追加する | assets、clientEntries |
8 |
| JSON などの HTTP 応答を返す | endpoints |
9 |
| タイトル、フィード、構造化データを変える | seo |
10 |
| コンテンツの問題を報告する | addDiagnostics、inspectGeneratedHtml |
11 |
| ビルド間で派生データを再利用する | cacheVersion、context.cache |
12 |
| ビルド中にファイルを書き出す | planGeneratedOutputs、context.output |
13 |
| 実行順を制御し、オプションを検証する | provides、requires、optional、order、validateOptions |
14 |
| ビルドの動作を記録する | logger、tracer |
15 |
各レシピの確認方法
| レシピ | 確認すること |
|---|---|
| 変換 | 期待したマークアップが生成 HTML に出る |
| レンダラー | ![[data.csv]] でプレビューが出て、通常のリンクも動く |
| コンテンツフック | CLI にプラグイン名付きの診断が出る |
| 公開 URL | 新しい URL が動き、古い URL がリダイレクトする |
| グラフ | 関連ノートがバックリンクとグラフの隣接ノードに出る |
| ページタイプ | /series/typescript が生成され、ノートが並ぶ |
| コンポーネント | サイトが import し、指定した位置に描画する |
| CSS とクライアント | スタイルが読み込まれ、ページ読み込み後にボタンが動く |
| エンドポイント | 開発サーバーが期待した JSON とキャッシュヘッダーを返す |
| SEO | ページのソース、サイトマップ、フィードが新しいメタデータを使う |
| 診断 | 想定したノートに警告が出る |
| キャッシュ | 2 回目のビルドで再利用され、内容を変えるとミスになる |
| 生成ファイル | 出力にファイルがあり、内容が期待どおり |
| 依存関係 | 提供側がないときに明確なエラーになる |
| ログ | debug レベルでのみデバッグメッセージが出る |
静的出力に影響するレシピは npm run build で確認します。ブラウザでの動作は npm run dev で確認し、コンソールとネットワークパネルを見てください。
はじめてのプラグイン作成 のテストの考え方は、どのレシピにも当てはまります。パッケージ開発のテスト規約は テスト を参照してください。
よくある間違い
- 公開出力で
manifest.entriesを読む。下書きも含まれるため、publicEntriesかdiscoverableEntriesを使う。 - 担当外の対象でレンダラーが空文字を返す。
nullを返して別のレンダラーに任せる。 - frontmatter、ファイル、リモート応答の値をエスケープしない。
publicConfigに秘密情報を入れる。ブラウザへ送られるのはこの値だけ。processedContentCacheなしで変換を追加する。処理済みコンテンツを再利用できなくなる。- エンドポイントが静的ファイルになると想定する。静的出力には生成ファイルを使う。
- 依存関係のない出力を計画する。実行時に拒否される。
- リダイレクトなしでパーマリンクを変える。古いリンクが壊れるため、公開していた URL ならリダイレクトを追加してください。
orderでケイパビリティの依存関係を覆そうとする。提供側は常に先に実行される。