dcli install gen-tpl
核心处理流程如下:
先判断是否硬盘缓存目录 ~/.maoda 下是否已经有安装过 gen-tpl 包
如果没有,则接下来进行安装 (相当于在 ~/.maoda 目录下执行 npm install) 如果有,且版本低,则提示升级 如果有,且版本最新,则不作为安装过程即 execSync('npm i gen-tpl@latest -S', { cwd: '~/.maoda' })
我们可以为「模板插件包」的名称做一个约定,即具备固定的前缀,诸如 gen-xxx
5.4 init命令: 选一个「模板插件包」来初始化一个新工程
这是一个脚手架高频而核心的功能
dcli init
此时会分发去执行 script/init.js 文件,我们看看其逻辑
查询硬盘缓存目录 ~/.maoda 下的 package.json 文件,读取其中 dependacies 字段,拿到已安装的「模板插件包」
如果一个都没安装,则提示用户要先 install让用户选择一套模板
利用 inquery 库发起对话,罗列出已装模板,让用户选择,比如上图的 gen-pc gen-h5 gen-tpl触发模板初始化流程
比如用户选择了 gen-tpl 这个模板,则用 yeoman-environment 这个库去执行缓存目录里的这个包 ~/.maoda/gen-tpl/index.js 注:这里相当于跨目录的两个 js 文件引用执行,用到了之前说的 import-from 这个库「模板插件包」被执行,则启动了常规的模板拷贝过程 (后面展开细说)
这里直接用包名称做选项,为了演示更直观,实际通常用包的 description 做选项,更友好一些,比如 gen-pc 包可能描述为 生成PC模板
5.5 build命令:在工程里执行构建
dcli build
确定工程目录
工程目录即执行目录,通过 process.cwd() 获取读取该工程所用的构建插件
读取工程中约定的配置文件,本demo中为 maoda.js (采用约定式的配置,类似 webpack.config.js .babelrc .prettierrc) 读取 maoda.js 中 builder 配置项 (即指定的构建插件包),比如本 demo 中指定为 build-tpl 如果有的话,读取自定义 webpack 配置 (约定为 webpackCustom 字段,后续会被合并/覆盖到默认 webpack 配置上)使用制定的构建插件包来进行 webpack 打包
判断工程中是否已经安装 build-tpl 未安装,则在工程中路径中执行 npm install (或 yarn add,此处有个小技巧,可根据用户工程中 lock 文件的类型,判断用户使用的 npm 还是 yarn) 已安装,则直接执行 build-tpl通常,我们用配置文件指明「构建插件包」,也可以直接在命令里指明,比如 dcli build --builder=build-h5;后者往往适用于一套代码打包出多种结果,如京东的 Taro cli
平时大家用惯了 npm run build yarn build,只需在我们的模板中的 package.json 添加一行:
{ "script": {++ "build": "dcli build" }}
5.6 dev命令:启动 devServer 进行调试
类似 build 只不过 webpack 配置不同,此处略
6 模板插件包
核心功能:提供模板文件夹 + 文件夹的拷贝。这里同样提供了一个样例工程 gen-tpl (仅 50 行代码)
处理流程如下:
询问用户,并获取反馈的答案
比如工程名是什么,描述一下你的工程,是否使用 TypeScript,是否使用 Sass/Less/Stylus 等根据用户的答案,拷贝对应的模板,细分两种拷贝