webpack-plugin-authoring について
webpack 5 プラグインの作成とレビューに向けたベストプラクティスのスキルで、8 分野に 44 のルールを整理しています。フック、アセット、キャッシュ、診断、パフォーマンス、パッケージングを扱う開発者向けです。
主な機能
- 018 分野にわたるプラグインの 44 ルール
- 02フック選択と tap パターンの指針
- 03アセットパイプラインと source map の実践
- 04キャッシュ、ウォッチモード、ライフサイクルの指針
- 05オプション検証とビルド診断
- 06パフォーマンス、互換性、パッケージングの助言
活用シーン
- 01新しい webpack 5 プラグインの作成
- 02プラグインの正確性と性能のレビュー
- 03出力欠落やウォッチモードの古い状態の調査
- 04npm 公開に向けたプラグインの準備
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ pproenca/ dot-skills --skill webpack-plugin-authoringインストール後、Claude Code で/webpack-plugin-authoringを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
AGENTS.mdmetadata.jsonassets/templates/_template.mdreferences/_sections.mdasset-buffer-not-source-for-binary.mdasset-content-hash-via-output-options.mdasset-delete-then-emit-loses-info.mdasset-emit-asset-not-direct-assignment.mdasset-preserve-source-maps.mdasset-set-info-metadata.mdasset-source-from-compiler-webpack.mdcache-add-file-dependencies.mdcache-build-dependencies-for-persistent-cache.mdcache-context-dependencies-for-directories.mdcache-missing-dependencies-for-optional-files.mdcache-use-input-file-system.mdcompat-custom-hooks-via-weakmap.mdcompat-export-shape-and-cjs-esm.mdcompat-feature-detection-not-version-check.mdcompat-use-compiler-webpack-namespace.mdcompat-webpack-as-peer-dependency.mddiag-attach-loc-to-errors.mddiag-progress-reporting.mddiag-push-webpack-error-not-throw.mddiag-use-compilation-get-logger.mddiag-warnings-vs-errors-exit-codes.mdhook-bail-hook-return-semantics.mdhook-name-matches-class-name.mdhook-normal-module-factory-stages.mdhook-prefer-process-assets-over-emit.md詳細
dot-skills Webpack 5 プラグインのベストプラクティス
正確で高パフォーマンスな webpack 5 プラグインを作成するための包括的なガイドです。8 つのカテゴリにわたる 44 のルール(hook 8 件、asset 7 件、cache 5 件、life 5 件、schema 4 件、diag 5 件、perf 5 件、compat 5 件)を、作成時のライフサイクルに沿って並べています。まずフックの選択を土台とし、次にアセットの操作、キャッシュとウォッチモードの正確性、ライフサイクルの健全性、ユーザー向けの事項(スキーマ検証、エラー報告)、パフォーマンス、パッケージングへと進みます。
パターンは、webpack/webpack、webpack-contrib のプラグインスイート(mini-css-extract、terser、compression、copy、css-minimizer)、および vercel/next.js における Next.js の webpack 統合から導き出されています。
適用するタイミング
以下の場合に、これらのルールを参照してください。
- 新しいプラグインを作成するとき(
apply(compiler)の定義、タップするフックの選択) - 正確性やパフォーマンスの観点から既存のプラグインコードをレビューするとき
- 「プラグインの出力が表示されないのはなぜか」をデバッグするとき(通常、フックまたはステージの不一致が原因です)
- アセット操作ロジック(
processAssets、emitAsset、updateAsset)を追加するとき - ウォッチモードの古い状態や永続キャッシュの汚染を修正するとき
- プラグインを webpack 4 から webpack 5 に移行するとき(または両方をサポートするとき)
- プラグインを npm に公開するとき(エクスポート形式、peerDependencies、スキーマ)
優先度別のルールカテゴリ
| 優先度 | カテゴリ | 影響度 | プレフィックス |
|---|---|---|---|
| 1 | フックの選択とタップのパターン | CRITICAL | hook- |
| 2 | アセットパイプライン | CRITICAL | asset- |
| 3 | キャッシュとウォッチモード | HIGH | cache- |
| 4 | プラグインのライフサイクルと状態 | HIGH | life- |
| 5 | スキーマとオプションの検証 | MEDIUM-HIGH | schema- |
| 6 | エラー、警告、ログ | MEDIUM-HIGH | diag- |
| 7 | パフォーマンスと並列処理 | MEDIUM | perf- |
| 8 | 互換性とパッケージング | LOW-MEDIUM | compat- |
クイックリファレンス
1. フックの選択とタップのパターン(CRITICAL)
hook-tap-method-matches-hook-type—tap/tapAsync/tapPromiseをフックの Sync/Async タイプに合わせますhook-thiscompilation-vs-compilation— 子コンパイルをスキップするにはthisCompilationを使いますhook-process-assets-stage— 変更内容に適したPROCESS_ASSETS_STAGE_*を選びますhook-prefer-process-assets-over-emit—emitではなくprocessAssetsで変更しますhook-bail-hook-return-semantics— 意図的に処理を停止する場合を除き、bail フックからundefinedを返しますhook-tap-once-not-per-compilation— コンパイラーフックはコンパイル用フック内ではなく、applyで一度だけ登録しますhook-name-matches-class-name— クラス名と同じ、安定したタップ名を使いますhook-normal-module-factory-stages— 適切な解決ステージ(beforeResolve、resolve、afterResolve)でnormalModuleFactoryをタップします
2. アセットパイプライン(CRITICAL)
asset-emit-asset-not-direct-assignment—compilation.assets[name] = ...ではなく、emitAsset/updateAssetを使用しますasset-source-from-compiler-webpack— ソースクラスはcompiler.webpack.sourcesからインポートしますasset-preserve-source-maps— ソースマップを保持するため、SourceMapSource/ReplaceSourceを使用しますasset-set-info-metadata— 出力時にinfo.immutable、info.contenthash、info.relatedを設定しますasset-content-hash-via-output-options— ハッシュには、ハードコードした md5 ではなく、compilation.outputOptions.hashFunctionを使用しますasset-delete-then-emit-loses-info— 移動にはrenameAssetを使用します。deleteAssetとemitAssetの組み合わせではチャンク参照が切断されますasset-buffer-not-source-for-binary— バイナリアセットにはsource()ではなくbuffer()を使用します
3. キャッシュとウォッチモード(HIGH)
cache-add-file-dependencies— 読み込んだファイルをcompilation.fileDependenciesに追加しますcache-context-dependencies-for-directories— ディレクトリを走査する場合はcontextDependenciesを使用しますcache-missing-dependencies-for-optional-files— 存在しないことを確認したパスをmissingDependenciesに追加しますcache-build-dependencies-for-persistent-cache— 永続キャッシュの無効化に備え、buildDependenciesを宣言しますcache-use-input-file-system— Node のfsではなく、compiler.inputFileSystem経由で読み込みます
4. プラグインのライフサイクルと状態(HIGH)
life-constructor-stores-options-only— コンストラクターでは検証と保存のみを行い、副作用はapply()で発生させますlife-no-mutable-state-across-builds— ローカルのconstまたはWeakMapを使い、変更可能な状態をコンパイルごとに分離しますlife-multi-compiler-isolation— コンパイラーごとにプラグインインスタンスを1つ使用するか、WeakMap<Compiler, T>を使用しますlife-cleanup-in-shutdown-hook—compiler.hooks.shutdownでワーカー、ウォッチャー、ファイルディスクリプターをクリーンアップしますlife-defensively-copy-user-options— ユーザーのオプションオブジェクトは変更しないでください
5. スキーマとオプションの検証(MEDIUM-HIGH)
schema-validate-with-schema-utils—schema-utils.validate()と JSON Schema を使って検証しますschema-name-and-base-data-path— エラーメッセージをたどりやすくするため、nameとbaseDataPathを設定しますschema-additional-properties-false— タイプミスを検出するため、すべてのオブジェクトにadditionalProperties: falseを設定しますschema-tap-into-validate-hook— フィールド間の検証はcompiler.hooks.validateに委ねます(5.106+)
6. エラー、警告、ロギング(中〜高)
diag-push-webpack-error-not-throw—WebpackErrorをスローせずにcompilation.errorsに追加しますdiag-use-compilation-get-logger— console ではなく、compilation.getLogger('Plugin')を使ってログを記録しますdiag-attach-loc-to-errors— IDE から該当箇所をクリックして移動できるよう、エラーにlocとmoduleを設定しますdiag-warnings-vs-errors-exit-codes— エラーはビルドを失敗させますが、警告は失敗させません。意図して選択しますdiag-progress-reporting—context.reportProgressで進捗を報告します(context: trueで有効化します)
7. パフォーマンスと並列処理(中)
perf-jest-worker-for-cpu-bound-work— CPU 負荷の高い処理をjest-workerプールに委譲しますperf-cache-results-with-compilation-cache—compilation.getCache(name).providePromiseでコストの高い処理の結果をキャッシュしますperf-traverse-chunks-not-modules— 可能な場合はcompilation.modulesではなくcompilation.chunksを反復処理しますperf-avoid-source-toString-in-hot-paths— 調査するだけのアセットにはsource().toString()を使わないようにしますperf-respect-experimental-options—experiments.cacheUnaffected/incrementalを尊重します
8. 互換性とパッケージング(低〜中)
compat-webpack-as-peer-dependency—webpackはdependenciesではなくpeerDependenciesとして宣言しますcompat-use-compiler-webpack-namespace—require('webpack')ではなくcompiler.webpack.*を使いますcompat-custom-hooks-via-weakmap— 静的なgetCompilationHooksとWeakMapを介してカスタムフックを公開しますcompat-feature-detection-not-version-check— API を直接検出し、webpack/package.jsonのバージョンを解析しませんcompat-export-shape-and-cjs-esm— プラグインクラスをデフォルトエクスポートし、CJS/ESM の相互運用性を提供します
使用方法
プラグインのコードを記述またはレビューする際は、AGENTS.md で該当するカテゴリを確認してから、個別のルールファイルを読んで詳細なパターンと根拠を確認してください。
- カテゴリの定義と影響度については、
references/_sections.mdから確認してください - このスキルを拡張する場合は、ルールのテンプレートとして
assets/templates/_template.mdを参照してください - 簡潔なナビゲーションインデックスについては、
AGENTS.mdを読んでください
参考ファイル
| ファイル | 説明 |
|---|---|
| references/_sections.md | カテゴリの定義、影響度、説明 |
| assets/templates/_template.md | 新しいルールを作成するためのテンプレート |
| metadata.json | バージョン、分野、ソースの参照情報 |