Modern.js 模块工具插件钩子机制详解
2025-07-08 07:13:56作者:虞亚竹Luna
Modern.js 的模块工具(module-tools)提供了一套完善的插件钩子(Hooks)机制,让开发者能够在构建和开发流程的不同阶段介入和扩展功能。本文将全面解析这套钩子系统,帮助开发者更好地理解和运用这些扩展点。
钩子类型概述
Modern.js 模块工具的钩子主要分为四大类:
- 配置钩子(Config hooks):用于修改用户配置
- 构建钩子(Build hooks):在执行
build
命令时触发 - 平台构建钩子(buildPlatform hooks):在执行
build --platform
命令时触发 - 开发钩子(Dev hooks):在执行
dev
命令时触发
配置钩子详解
resolveModuleUserConfig
这是一个异步瀑布流(AsyncWaterfall)类型的钩子,允许插件修改用户配置。
export const myPlugin = (): CliPlugin<ModuleTools> => ({
name: 'my-plugin',
setup() {
return {
resolveModuleUserConfig(config: ModuleUserConfig): ModuleUserConfig {
// 在这里修改配置
return modifiedConfig;
},
};
},
});
这个钩子在配置解析阶段被调用,非常适合需要根据用户配置进行动态调整的场景。
构建钩子详解
构建钩子在执行build
命令时按顺序触发:
beforeBuild
- 整体构建开始前beforeBuildTask
- 每个构建子任务开始前afterBuildTask
- 每个构建子任务结束后afterBuild
- 整体构建结束后
beforeBuild
这是一个并行工作流(ParallelWorkflow)钩子,在整体构建流程开始前触发。
beforeBuild(options: {
options: {
config: BaseBuildConfig[];
cliOptions: BuildCommandOptions;
};
}): void
开发者可以在这里进行全局性的构建前准备工作。
beforeBuildTask/afterBuildTask
这对钩子分别在每个构建子任务前后触发:
beforeBuildTask(config: BaseBuildConfig): BaseBuildConfig
afterBuildTask(options: BuildTaskResult): void
beforeBuildTask
允许修改单个任务的配置,而afterBuildTask
可以获取任务执行结果。
afterBuild
整体构建完成后触发:
afterBuild(options: BuildResult): void
可以在这里进行构建后的清理工作或结果分析。
平台构建钩子详解
平台构建钩子专为build --platform
命令设计,执行顺序为:
registerBuildPlatform
- 注册平台构建任务beforeBuildPlatform
- 平台构建开始前buildPlatform
- 每个平台构建任务执行前afterBuildPlatform
- 平台构建结束后
registerBuildPlatform
这是核心钩子,用于注册平台特定的构建逻辑:
registerBuildPlatform(): RegisterBuildPlatformResult {
return {
platform: 'doc', // 平台标识
build(currentPlatform, context) {
// 平台构建逻辑
}
}
}
其他平台钩子
其他平台钩子提供了构建过程的生命周期管理:
beforeBuildPlatform
:获取所有注册的平台任务buildPlatform
:每个平台任务执行前afterBuildPlatform
:所有平台任务完成后
开发钩子详解
开发钩子在执行dev
命令时按顺序触发:
registerDev
- 注册开发工具beforeDev
- 开发流程开始前beforeDevMenu
- 开发菜单显示前afterDevMenu
- 开发菜单选择后beforeDevTask
- 开发任务执行前afterDev
- 开发流程结束后
registerDev
这是开发工具注册的核心钩子:
registerDev(): DevToolData {
return {
name: 'storybook',
menuItem: {
name: 'Storybook',
value: 'storybook'
},
subCommands: ['storybook', 'story'],
async action() {
// 开发工具启动逻辑
}
}
}
开发流程管理
其他开发钩子提供了完整的开发流程管理:
beforeDev
:获取所有注册的开发工具beforeDevMenu
/afterDevMenu
:管理开发工具选择菜单beforeDevTask
:开发任务执行前afterDev
:开发流程结束时
最佳实践建议
- 合理选择钩子类型:根据需求选择瀑布流(顺序执行)或并行工作流(并行执行)钩子
- 保持钩子轻量:避免在钩子中执行耗时操作
- 错误处理:在关键钩子中添加适当的错误处理逻辑
- 性能监控:可以利用
afterBuild
和afterDev
钩子添加性能监控逻辑
通过合理利用这些钩子,开发者可以深度定制Modern.js模块工具的构建和开发流程,满足各种复杂场景的需求。