npm init cabloy背后的故事
背景
我们知道许多框架会提供一个脚手架工具,我们先下载安装脚手架工具,然后再通过脚手架命令行来创建项目。在npm@6.1.0
中引入了npm init <initializer>
的语法。简单来说就是你执行npm init cabloy
的话,npm会补全模块名为create-cabloy
,并执行npx create-cabloy
CabloyJS提供的命令
我们知道,在CabloyJS中创建一个项目,使用如下命令:
npm init cabloy cabloy-demo --type=cabloy
在项目中创建一个业务模块,使用如下命令:
npm init cabloy src/module/test-todo --type=module-business
npm init cabloy具体流程
下面我们具体说一下这一行npm init cabloy
具体做了哪些事情:
-
关于
npm init cabloy
:npm会自动下载模块create-cabloy
,然后执行create-cabloy
,顺便把后面的参数传入 -
模块
create-cabloy
会自动执行模块egg-born
,顺便把后面的参数传入。(为什么这样跳转一次?是因为egg-born
命令行工具早就实现了,而npm init cabloy
的机制是npm后期引入的)egg-born
就是我们在上面提到的脚手架工具 -
模块
egg-born
会下载模块egg-born-init-config
-
模块
egg-born-init-config
的package.json
文件中定义了三个模版:每个模版对应一个npm模块。比如模版module-business
对应模块egg-born-template-module-business
-
如果用户通过
--type
指定了module-business
,那么就会自动下载模块egg-born-template-module-business
-
模块
egg-born-template-module-business
包含两部分:index.js
文件:定义了一些变量,egg-born
会使用这些变量收集当前模版的参数,如name/description等等boilerplate
目录:包含一套文件模版,egg-born
会自动替换文件模版里面的参数,然后输出到预定的目录,在这个例子中就是src/module/test-todo