书写模板
模板是 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 将会被使用。
- 得到转换后的文件目录结构,根据
move
copy
进行文件的移动和复制; - 写入输出文件夹后,触发 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 可以参考。
利用不同的分支进行管理。