Yeoman
是现代化前端项目的脚手架工具,用于生成包含指定框架结构的工程化目录结构。它是整个前端自动化工厂的第一站。javascript
从我的使用者的角度来看,Yeoman
的地位有些鸡肋,由于流行框架自带的cli
工具都可以自动生成官方推荐的目录结构,并且一个项目持续少则几个月多则几年,而项目的初始化结构目录在此期间只须要生成一次。尽管工具的设计定位如此,但在组件化开发的潮流中,使用Yeoman
来生成符合项目编码规范的组件框架是很是有必要的。html
为了下降项目的维护成本,将要求的组件结构和必要的使用说明生成组件模板,使用Yeoman
工具来直接生成,当项目的体积愈来愈大时,你就会体会到这种方式的好处。前端
详情请参考【Yeoman官方网站】java
1.使用包管理工具安装yo
node
使用npm:npm install -g yo
angularjs
使用yarn:yarn global add yo
web
安装后在命令行输入yo --version
,显示版本号则安装成功。npm
2.下载项目目录模板generator-XXX
json
开源社区有很是多的项目目录模板,在命令行输入npm install generator-fountain-webapp
或yarn add generator-fountain-webapp
安装项目模板。Fountain
能够定制安装各种集成的javascript
框架和CSS
框架。前端工程化
3.用指定模板初始化项目目录
在当前文件夹开启命令行,输入yo XXX
(XXX
为generator模板后缀的名称,例如yo fountain-webapp
),根据交互式命令行信息填写参数,最终便可生成项目目录。
[使用fountain-webapp模板示意图]
4. 子模板的使用
若是模板支持子模板功能,用户经过yo XXX:YYY
便可生成项目组件,例如yo angular : controller
生成一个angularjs
项目中控制器的代码骨架)。
你的团队极可能有本身封装的框架,没法使用现有的generator
,同时yo
的速度不是很稳定(听说是由于内置的generator搜索机制和墙的缘由),庆幸地是其官方团队开源了yeoman
代码,并有详细的文档解释其运行原理和机制,让开发者能够根据团队需求定制合适的generator
生成器。
你能够经过以下方式使用它:
yeoman-generator
,使用yeoman
的API
编写定制的模板文件(注意使用此种方法时,若是但愿经过yo
来调用生成器,则须要按指定的方式编写package.json
文件)。generator-generator
模板并使用yo generator
在当前目录生成模板文件骨架,并完善其生命周期方法。generator
的本质是一个继承自yeoman-generator
的匿名类,其代码架构以下:
const Generator = require('yeoman-generator'); module.exports = class extends Generator{ initianlizing(){ //获取当前项目状态,获取基本配置参数等 } prompting(){ //向用户展现交互式问题收集关键参数 } configuring(){ //保存配置相关信息且生成配置文件(名称多为'.'开头的配置文件,例如.editorconfig) } default(){ //未匹配任何生命周期方法的非私有方法均在此环节*自动*执行 } writing(){ //依据模板进行新项目结构的写操做 } conflicts(){ //处理冲突(内部调用,通常不用处理) } install(){ //使用指定的包管理工具进行依赖安装(支持npm,bower,yarn) } end(){ //结束动做,例如清屏,输出结束信息,say GoodBye等等 } }
Yeoman-generator
提供了不少封装好的方法,文档详细且源码注释很是详细,详情可参见【Yeoman-generator官方API】
本地开发的generator-XXX
未通过发布,须要在package.json
所在目录开启命令行,输入npm link
将其安装到本地的全局环境,而后经过yo XXX
或yo XXX:YYY
的方式来调用,也能够经过第四节中说起的工具链集成的方式绕开yo
命令执行生成器。
与前端工程化工具链的集成或许是Yeoman
最恰当的归宿,为此Yeoman
团队索性开源开到底,直接公开了其核心库yeoman-enviroment
,使得generator
模板能够没必要经过yo
工具就能够被调用,引用的方式比较简单:
var yeoman = require('yeoman-environment'); var env = yeoman.createEnv(); //generator-XXX模块地址查询 var generatorPath = require.resolve('generator-XXX','XXX:app'); //若是generator未使用npm link进行链接,须要将其拷贝至工程依赖中按以下方式获取地址 var generatorPath = path.resolve(process.cwd(),'node_modules','generator-XXX','generators','app'); //注册generator env.register(generatorPath, 'XXX:app'); //调用generator生成项目骨架或组件骨架 env.run('XXX:app', {'skip-install': true}, function (err) { console.log('done'); });
在此演示如何制做一个小工具来生成标准化的Component
,示例工具使用generator-generator
生成,为方便学习使用,放置在本地node_modules
目录中,示例generator
中只进行了两项基本操做:
在configuring
阶段将.editorconfig
文件直接拷贝至当前目录
在writing
阶段将controller.tpl.js
模板中的占位符替换为用户输入的关键词,而后生成新的controller.js
文件
generator
中关键示例代码:
//保存配置相关信息且生成配置文件(名称多为'.'开头的配置文件,例如.editorconfig) configuring(){ //生成.editorconfig this.fs.copy( this.templatePath('.editorconfig'), this.destinationPath('.editorconfig') ); } //依据模板进行新项目结构的写操做 writing(){ //替换关键字生成Controller.js var controllerTpl = this.fs.read(this.templatePath('controller.tpl.js')); this.fs.write(this.destinationPath('controller/'+ this.props.keyWords + 'Controller.js'),controllerTpl.replace(/__PLACEHOLDER__TINY__/g, this.props.keyWords)); }
在命令行输入npm run tiny
运行:
[使用tiny-helper小工具]
controller.tpl.js
模板:
[转换前的模板]
转换后的loginPageController.js
:
[转换后的js文件]
能够看到咱们已经使用关键词替换掉占位符并获得了新的controller.js
框架文件。除了演示的功能外,yeoman
内置支持ejs
模板引擎,咱们能够利用它生成各类html
模板,包括常见样式的通用写法,包含固定类名的组件DOM结构等等,这对于统一团队代码风格有着重要的意义。
笔者认为总体而言,
Yeoman
做为脚手架工具的存在乎义,远不及对于提高代码规范性的价值。