如何创建一个脚手架项目

日常开发中,团队可以创建自己的项目脚手架,本文将介绍脚手架创建的方法。

脚手架项目必备的基础目录结构

├── 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 忽略配置