关于 webpack-plugin-authoring
用于编写和审查 webpack 5 插件的最佳实践技能,按八类组织了 44 条规则。面向需要处理钩子、资源、缓存、诊断、性能和打包的插件开发者。
主要功能
- 01涵盖八类插件主题的 44 条规则
- 02钩子选择与 tap 模式指南
- 03资源流水线和 source map 实践
- 04缓存、监视模式和生命周期指南
- 05选项验证与构建诊断
- 06性能、兼容性和打包建议
适用场景
- 01编写新的 webpack 5 插件
- 02审查插件的正确性和性能
- 03排查插件输出缺失或监视模式过期问题
- 04准备将插件发布到 npm
安装
复制下面的命令,在终端中运行。
$
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 条规则(8 条 hook + 7 条 asset + 5 条 cache + 5 条 life + 4 条 schema + 5 条 diag + 5 条 perf + 5 条 compat = 44),按编写生命周期排序:hook 选择是基础,然后是 asset 操作、缓存和监视模式正确性、生命周期规范,接着是面向用户的问题(schema 验证、错误报告),最后是性能和打包。
这些模式源自 webpack/webpack、webpack-contrib 插件套件(mini-css-extract、terser、compression、copy、css-minimizer),以及 vercel/next.js 中 Next.js 的 webpack 集成。
适用场景
在以下情况下,参考这些规则:
- 编写新插件(定义
apply(compiler)、选择要 tap 的 hook) - 检查现有插件代码的正确性或性能
- 调试“为什么我的插件没有输出”——通常是 hook/stage 不匹配
- 添加 asset 操作逻辑(
processAssets、emitAsset、updateAsset) - 修复监视模式下的数据过时问题或持久缓存污染
- 将插件从 webpack 4 迁移到 webpack 5(或同时支持两者)
- 将插件发布到 npm(导出形式、peerDependencies、schema)
按优先级划分的规则类别
| 优先级 | 类别 | 影响 | 前缀 |
|---|---|---|---|
| 1 | Hook 选择与 Tap 模式 | CRITICAL | hook- |
| 2 | Asset 管线 | CRITICAL | asset- |
| 3 | 缓存与监视模式 | HIGH | cache- |
| 4 | 插件生命周期与状态 | HIGH | life- |
| 5 | Schema 与选项验证 | MEDIUM-HIGH | schema- |
| 6 | 错误、警告与日志记录 | MEDIUM-HIGH | diag- |
| 7 | 性能与并行处理 | MEDIUM | perf- |
| 8 | 兼容性与打包 | LOW-MEDIUM | compat- |
快速参考
1. Hook 选择与 Tap 模式(CRITICAL)
hook-tap-method-matches-hook-type— 根据 hook 的 Sync/Async 类型匹配tap/tapAsync/tapPromisehook-thiscompilation-vs-compilation— 使用thisCompilation跳过子编译hook-process-assets-stage— 根据你的修改选择合适的PROCESS_ASSETS_STAGE_*hook-prefer-process-assets-over-emit— 在processAssets中修改,而不是在emit中修改hook-bail-hook-return-semantics— 除非有意停止,否则从 bail hooks 返回undefinedhook-tap-once-not-per-compilation— 在apply中注册 compiler hooks 一次,而不是在 compilation hooks 中注册hook-name-matches-class-name— 使用与类名一致的稳定 tap 名称hook-normal-module-factory-stages— 在正确的解析阶段(beforeResolve、resolve 或 afterResolve)tapnormalModuleFactory
2. 资源管线(关键)
asset-emit-asset-not-direct-assignment— 使用emitAsset/updateAsset,绝不要执行compilation.assets[name] = ...asset-source-from-compiler-webpack— 从compiler.webpack.sources导入 source 类asset-preserve-source-maps— 使用SourceMapSource/ReplaceSource保留映射asset-set-info-metadata— 发出资源时设置info.immutable、info.contenthash、info.relatedasset-content-hash-via-output-options— 通过compilation.outputOptions.hashFunction计算哈希,而不是硬编码 md5asset-delete-then-emit-loses-info— 使用renameAsset移动资源;deleteAsset+emitAsset会断开分块引用asset-buffer-not-source-for-binary— 二进制资源使用buffer(),而不是source()
3. 缓存与监视模式(高)
cache-add-file-dependencies— 将读取的文件添加到compilation.fileDependenciescache-context-dependencies-for-directories— 扫描目录时使用contextDependenciescache-missing-dependencies-for-optional-files— 将已探测但不存在的路径添加到missingDependenciescache-build-dependencies-for-persistent-cache— 声明buildDependencies,以便持久化缓存失效cache-use-input-file-system— 通过compiler.inputFileSystem读取,而不是使用 Nodefs
4. 插件生命周期与状态(高)
life-constructor-stores-options-only— 构造函数只负责验证和存储;副作用应放在apply()中life-no-mutable-state-across-builds— 使用局部const或WeakMap,将可变状态限定在每次编译中life-multi-compiler-isolation— 每个编译器使用一个插件实例;或使用WeakMap<Compiler, T>life-cleanup-in-shutdown-hook— 在compiler.hooks.shutdown中清理工作线程、监视器和文件描述符life-defensively-copy-user-options— 绝不要修改用户的 options 对象
5. Schema 与选项验证(中高)
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— 通过compilation.getLogger('Plugin')记录日志,而不是使用 consolediag-attach-loc-to-errors— 为错误附加loc和module,以支持 IDE 点击跳转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.chunks,而不是compilation.modulesperf-avoid-source-toString-in-hot-paths— 对只需检查的资源,避免调用source().toString()perf-respect-experimental-options— 遵循experiments.cacheUnaffected/incremental设置
8. 兼容性与打包(低至中)
compat-webpack-as-peer-dependency— 将webpack声明为peerDependencies,而不是dependenciescompat-use-compiler-webpack-namespace— 使用compiler.webpack.*,而不是require('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 | 版本、领域、来源参考 |
评论
支持 Markdown