Modern.js 生成器插件 Context API 深度解析
前言
Modern.js 是一个现代化的前端开发框架,提供了强大的生成器(Generator)功能,帮助开发者快速搭建项目结构。生成器插件的核心在于其 Context API,它为插件提供了丰富的操作能力和生命周期钩子。本文将深入解析 Modern.js 生成器插件中的 Context API,帮助开发者更好地理解和利用这一强大工具。
Context 概述
在 Modern.js 生成器插件中,context
是插件与生成器系统交互的核心接口。它提供了三大类功能:
- 获取生成器执行环境信息
- 操作用户输入
- 管理插件生命周期
环境信息获取 API
语言环境获取
locale
属性可以获取当前生成器执行环境的语言设置,支持 zh
(中文)和 en
(英文)两种值。插件可以根据不同语言返回不同的提示信息或配置。
文件系统检查
isFileExist
方法用于检查目标项目中是否存在指定文件。这是一个异步方法,返回 Promise。在插件开发中,我们经常需要根据目标项目的文件结构决定后续操作。
// 示例:检查 package.json 是否存在
const hasPackageJson = await context.isFileExist('package.json');
if (hasPackageJson) {
// 执行相关逻辑
}
目录读取
readDir
方法可以读取目标项目指定目录下的文件列表,返回一个包含文件名的数组。这对于需要分析项目结构的插件非常有用。
// 示例:读取 src 目录下的文件
const srcFiles = await context.readDir('src');
srcFiles.forEach(file => {
// 处理每个文件
});
输入操作 API
Modern.js 生成器通过交互式问答收集用户输入,插件可以通过 Context API 对这些输入进行定制。
添加输入问题
addInputBefore
和 addInputAfter
允许插件在指定问题前后插入新的问题。这两个方法都接收两个参数:参考问题的 key 和新的问题配置。
// 在 packageManager 问题后添加编程语言选择问题
context.addInputAfter('packageManager', {
type: 'object',
properties: {
language: {
type: 'string',
title: '请选择编程语言:',
enum: [
{ label: 'TypeScript', value: 'ts' },
{ label: 'JavaScript(ES6+)', value: 'js' },
],
},
},
});
注意事项:
- 新问题的 key 不能与 Modern.js 内置问题的 key 冲突
addInputAfter
的优先级高于addInputBefore
- 可以多次调用添加多个问题,顺序由调用顺序决定
修改输入属性
setInput
方法可以修改已有输入问题的属性,如标题、默认值等。
// 修改 packageName 问题的标题
context.setInput('packageName', 'title', "项目名称");
设置输入默认值
setInputValue
和 setDefaultConfig
都可以设置输入默认值,但行为不同:
setInputValue
: 设置默认值,但问题仍会显示setDefaultConfig
: 设置默认值并跳过该问题的交互
// 设置包管理器默认值为 npm
context.setInputValue({
packageManager: 'npm'
});
// 设置默认配置并跳过交互
context.setDefaultConfig({
packageManager: 'npm'
});
Git 提交信息设置
setGitMessage
可以修改 Modern.js 默认的 Git 初始化提交信息。
context.setGitMessage('chore: 初始化项目');
生命周期函数
Modern.js 生成器插件提供了两个关键的生命周期函数:
onForged
: 在生成文件前执行,适合准备操作afterForged
: 在生成文件后执行,适合安装依赖等后处理
这两个函数将在后续文章中详细讲解。
最佳实践
- 输入设计:合理设计问题顺序,将相关问题分组放置
- 错误处理:对文件操作添加适当的错误处理
- 国际化:根据 locale 返回不同语言的提示
- 性能优化:避免不必要的文件系统操作
结语
Modern.js 生成器插件的 Context API 提供了强大的项目生成控制能力。通过合理使用这些 API,开发者可以创建出功能丰富、用户体验良好的项目生成器插件。理解这些 API 的工作原理和使用场景,是开发高质量 Modern.js 插件的基础。