如何创建一个脚手架项目
日常开发中,团队可以创建自己的项目脚手架,本文将介绍脚手架创建的方法。
脚手架项目必备的基础目录结构
├── template # 脚手架模板目录
│ ├── san.config.js # San CLI 的项目配置文件
└── meta.js/meta.json # 创建项目时的 prompt 交互问题
San CLI 使用 handlerbars 渲染 template 目录,所以脚手架请使用 handlerbars 语法。
meta.js/meta.json
回答的内容会作为模板数据来处理文件
meta.js
// meta 配置项
module.exports = {
// 生成器会将 handlerbars 语法填上 prompts 内容
// 扩展 handlerbars helper
helpers: {},
// 过滤符合 value 条件的目录 key,不做生成处理
filters: {
'mock/**': 'useMock'
},
// 脚手架交互问答
prompts: {
name: {
type: 'string',
required: true,
label: '项目名称',
// {{name}} 默认会使用执行 init 命令时的目录名
default: '{{name}}'
},
useMock: {
type: 'confirm',
message: '使用 mock 数据?'
}
},
// San CLI 默认使用 yarn 安装依赖,若要使用 npm,则需把 useYarn 置为 false
useYarn: false
};
meta.json
{
// meta 配置项
}
配置项
helpers
自定义 handlerbars 的块级 helper,cli 会调用 registerHelper,处理这段自定义
例如
// meta.js
{
helpers: {
if_or: (v1, v2, options) => {
if (v1 || v2) {
return options.fn(this);
}
return options.inverse(this);
};
}
}
filters
过滤符合 value 条件的目录 key,不做生成处理
例如
// meta.js
{
filters: {
'mock/**': 'tplEngine!=="smarty"',
'template/**': 'tplEngine!=="smarty"',
'template/demo-store/**': '!demo || (demo && demoType!=="store")',
'template/demo/**': '!demo || (demo && demoType!=="normal")',
'src/pages/demo-store/**': '!demo || (demo && demoType!=="store")',
'src/pages/demo/**': '!demo || (demo && demoType!=="normal")'
}
}
prompts
交互问答,key 为问题名称,value 为问题配置项(Object 类型)
例如
// meta.js
{
prompts: {
name: {
type: 'string',
required: true,
label: '项目名称',
default: '{{name}}'
},
tplEngine: {
type: 'list',
message: '选择模板引擎',
choices: [
{
title: 'Smarty(百度内部)',
value: 'smarty'
},
{
title: '纯 HTML',
value: 'html'
}
]
},
demo: {
type: 'confirm',
message: '安装demo示例?'
},
demoType: {
when: 'demo',
type: 'list',
message: '选择示例代码类型:',
choices: [
{
title: 'san-store (推荐)',
value: 'store'
},
{
title: 'normal',
value: 'normal'
}
]
}
}
}
san.config.js
san.config.js 是 San CLI 的项目配置文件,配置格式参考
相关 dot 文件
模板中的_xxx
文件会在安装之后,转换成.xxx
文件,例如template/_babelrc
经过san init
之后,会变成.babelrc
。
常见 dot 文件:
- babelrc:babel 配置
- editorconfig:常见规范类的配置
- npmrc:npm 配置
- prettierrc:格式化插件的配置
- gitignore:git 忽略配置