Modern.js 提供了 @modern-js/create
工具和 new
命令分别用于初始化创建项目和提供开启一些插件功能的能力,这些工具都是基于微生成器也就是 codesmith 实现的。
codesmith 致力于提供一套微生成器的运行机制,并维护微生成器执行过程中的上下文信息,从而实现各种基于文件、命令等操作,完成复杂的操作。
codesmith 还将常用的方法进行了封装,可以直接使用其提供的 API 函数,可以更方便的实现自身的微生成器。
GeneratorCore 是 codesmith 运行生成器的核心,维护这生成器执行过程中的上下文及运行方法。
class GeneratorCore {
logger: ILogger; // 日志
materialsManager: MaterialsManager; // 资源
outputPath: string; // 输出路径
output: {
// 输出方法
fs: (
file: string | number,
data: any,
options?: fs.WriteFileOptions | string,
) => Promise<void>;
};
_context: GeneratorContext; // 上下文信息
addMaterial(key: string, material: FsMaterial): void; // 添加资源
runGenerator(
generator: string,
config?: Record<string, unknown>,
): Promise<void>; // 运行生成器
runSubGenerator(
subGenerator: string,
relativePwdPath?: string,
config?: Record<string, any>,
): Promise<void>; // 运行子生成器
}
微生成器资源信息,目前只包含文件资源(fsMaterials),通过该字段可以获取到生成器执行过程中的 template 资源,并通过 API 对其进行操作。
class MaterialsManager {
materialMap: {
// 资源映射关系
[materialUri: string]: FsMaterial;
};
loadLocalGenerator(generator: string): Promise<FsMaterial>; // 加载本地生成器资源(绝对路径)
loadRemoteGenerator(generator: string): Promise<FsMaterial>; // 加载远程生成器资源(npm 包)
}