书写模板
模板是 Edam 一个重要的概念,可以说核心就是模板处理。
流程如下:
- 根据模板配置中的
prompts数组字段来进行用户输入交互,获取用户输入;
使用 inquirer.js - 模板配置中的
root值,root 为模板文件夹的目录,默认为./template; - 读取
root中的文件数据,忽略掉ignore字段中的文件,规则同.gitignore 分析配置中的 loader,对文件数据进行处理转换
关于 Loader 描述请转至书写 Loader规则一(最高优先):文件文本,如首行匹配如下任意一种语法:
// @loader ${LOADER_NAME}?${QUERY} /* @loader ${LOADER_NAME}?${QUERY} */ # @loader ${LOADER_NAME}?${QUERY} <!-- @loader ${LOADER_NAME}?${QUERY} -->则将使用 LOADER_NAME 进行处理,LOADER_NAME 对应与
loaders中定义的 loader- 规则二:匹配
mappers中的test,第一个匹配到的 loader 将会被使用。
- 得到转换后的文件目录结构,根据
movecopy进行文件的移动和复制; - 写入输出文件夹后,触发 usefulHook,调用 post 钩子。
注意:在 edam 模板项目 package.json 中,匹配 fields 优先顺序为 edam:main > main (>=3.1)
官方模板可见:edam-vendor
配置项
允许直接 exports 配置,或者 module.exports = edam => ({ /*config*/ })
类型提醒
const { defineConfig } = require('edam')
module.exports = defineConfig({
})prompts
用户输入值的交互定义
type:
[]
process
edam >= 2.0.1 返回除去 prompts 配置以外的所有配置项
- type:
function
如:
{
process(answer) {
return {
ignore: [],
root: 'anc'
}
}
}root
type:
string模板文件夹的目录,默认为
./template或者answer => './template'
ignore
忽略哪些文件
type:
string[]或者
(answers) => []
variables
type
{}example
{ date: new Date(), val: 'abc' } // 或者 (answers) => ({})
hooks
一些生命周期绑定的钩子,常用的是 post (在输出文件之后触发). 允许 function 或者 script
hooks: {
'post': ['touch Readme.md']
}或者 (answers) => ({})
loaders 和 mappers
与 Loader 相关,请转至书写 Loader查看详情。
move
移动文件
- type:
{}
{
"package.json.js": "package.json",
"test/**": "tests/",
// 特殊含义的占位符: [path] / [name] / [ext] / [base]
// 如 root/abc.js ->
// path: `root/`
// name: `abc`
// ext: `.js`
// base: `abc.js`
// root/a.js.hbs => root/a.js
"**/*.hbs": "[path][name]"
}或者 (answers) => ({})
copy
复制文件,同 move
usefulHook
一些常用的 hook 快捷方式
gitInit
是否
git init- type:
boolean - default:
false
- type:
installDependencies
是否安装
package.json中的 Dependencies 使用npm或yarn由用户配置中的pull.npmClient指定- type:
boolean - default:
false
- type:
installDevDependencies
是否安装
package.json中的 Dev Dependencies- type:
boolean - default:
false
- type:
或者 (answers) => ({})
尾声
官方已经有的一个模板 repo: edam-vendor 可以参考。
利用不同的分支进行管理。