大前端的自动化工厂(1)——Yeoman
一.Yeoman是什么
Yeoman
是现代化前端项目的脚手架工具,用于生成包含指定框架结构的工程化目录结构。它是整个前端自动化工厂的第一站。
从个人使用者的角度来看,Yeoman
的地位有些鸡肋,因为流行框架自带的cli
工具都能够自动生成官方推荐的目录结构,而且一个项目持续少则几个月多则几年,而项目的初始化结构目录在此期间只需要生成一次。尽管工具的设计定位如此,但在组件化开发的潮流中,使用Yeoman
来生成符合项目编码规范的组件框架是非常有必要的。
为了降低项目的维护成本,将要求的组件结构和必要的使用说明生成组件模板,使用Yeoman
工具来直接生成,当项目的体积越来越大时,你就会体会到这种方式的好处。
二.Yeoman的一般使用方法
详情请参考【Yeoman官方网站】
1.使用包管理工具安装yo
使用npm:
npm install -g yo
使用yarn:
yarn global add yo
安装后在命令行输入
yo --version
,显示版本号则安装成功。
2.下载项目目录模板generator-XXX
开源社区有非常多的项目目录模板,在命令行输入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
生成器。
3.1 使用方法
你可以通过如下方式使用它:
- 通过在自己的项目中引用
yeoman-generator
,使用yeoman
的API
编写定制的模板文件(注意使用此种方法时,如果希望通过yo
来调用生成器,则需要按指定的方式编写package.json
文件)。 - 下载
generator-generator
模板并使用yo generator
在当前目录生成模板文件骨架,并完善其生命周期方法。
3.2 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】
3.3 generator的调用
本地开发的generator-XXX
未经过发布,需要在package.json
所在目录开启命令行,输入npm link
将其安装到本地的全局环境,然后通过yo XXX
或yo XXX:YYY
的方式来调用,也可以通过第四节中提及的工具链集成的方式绕开yo
命令执行生成器。
四. Yeoman与工具链集成
与前端工程化工具链的集成或许是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');
});
五. 实战:tiny-helper工具开发演示
在此演示如何制作一个小工具来生成标准化的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
作为脚手架工具的存在意义,远不及对于提升代码规范性的价值。
大前端的自动化工厂(1)——Yeoman的更多相关文章
- 大前端的自动化工厂(5)—— 基于Karma+Mocha+Chai的单元测试和接口测试
一. 前端自动化测试 大多数前端开发者对测试相关的知识是比较缺乏的,一来是开发节奏很快,来不及写,另一方面团队里也配备了"人肉测试机",完全没必要自己来.但随着项目体量的增大,许多 ...
- 大前端的自动化工厂(2)—— SB Family
原文链接:https://bbs.huaweicloud.com/blogs/53c0c3509b7a11e89fc57ca23e93a89f 我坦白我是标题党,SB只是SCSS-Bourbon的简写 ...
- 大前端的自动化工厂(3)—— babel
一. 关于babel babel是ES6+语法的编译器,官方网址:www.babeljs.io,用于将旧版本浏览器无法识别的语法和特性转换成为ES5语法,使代码能够适用更多环境. 最初的babel使用 ...
- 04. Web大前端时代之:HTML5+CSS3入门系列~HTML5 表单
Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 一.input新增类型: 1.tel:输入类型用于应该包 ...
- 05. Web大前端时代之:HTML5+CSS3入门系列~H5 多媒体系
Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 1.引入 概述 音频文件或视频文件都可以看做是一个容器文 ...
- 06. Web大前端时代之:HTML5+CSS3入门系列~HTML5 画布
Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 我们先看看画布的魅力: 初始画布 canvas默认是宽3 ...
- [web建站] 极客WEB大前端专家级开发工程师培训视频教程
极客WEB大前端专家级开发工程师培训视频教程 教程下载地址: http://www.fu83.cn/thread-355-1-1.html 课程目录:1.走进前端工程师的世界HTML51.HTML5 ...
- 一统江湖的大前端(3) DOClever——你的postman有点low
<一统江湖的大前端>系列是自己的前端学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.如果你对前端的理解还是写写页面绑绑事件,那你真的是有 ...
- 一统江湖的大前端(4)shell.js——穿上马甲我照样认识你
<一统江湖的大前端>系列是自己的前端学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.如果你对前端的理解还是写写页面绑绑事件,那你真的是有 ...
随机推荐
- 201771010118 马昕璐《面向对象程序设计java》第十周学习总结
第一部分:理论知识学习部分 泛型:也称参数化类型(parameterized type)就是在定义类.接口和方法时,通过类型参数 指示将要处理的对象类型. 泛型程序设计(Generic program ...
- 1、了解计算机与操作系统发展阶段 2、选择一个具体的操作系统,结合计算机与操作系统的发展阶段,详细了解其渊源、发展过程、趋势,整理成简洁美观的图文博客发布。 Windows Mac os x Unix Linux Android 等。
1.了解计算机与操作系统发展阶段 操作系统并不是与计算机硬件一起诞生的,它是在人们使用计算机的过程中,为了满足两大需求:提高资源利用率.增强计算机系统性能,伴随着计算机技术本身及其应用的日益发展,而逐 ...
- 小程序页面跳转传参参数值为url时参数时 会出现丢失
当参数的值为url的时候, ?号 _ 下划线 等等 都会被 截取掉,看不到, 这样在 另一个页面 options中 截取的url就不完全 let url="http://ba ...
- ES6 常用语法
1.let 定义变量 1.与var 类似 用于声明一个变量 let userName='kobe' 2.特点 1.在块作用域内有效 2.不会吃重复定义变量 3.应用 1.循环遍历加监听 2.使用let ...
- python Cookie Session 相关用法
Cookie一.前言1.http协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响 应情况直接影响,也不会直接影响后面的请 ...
- 【安富莱专题教程第5期】工程调试利器RTT实时数据传输组件,替代串口调试,速度飞快,可以在中断和多任务中随意调用
说明:1.串口作为经典的调试方式已经存在好多年了,缺点是需要一个专门的硬件接口.现在有了SEGGER的RTT(已经发布有几年了),无需占用系统额外的硬件资源,而且速度超快,是替代串口调试的绝佳方式.2 ...
- [Swift]LeetCode64. 最小路径和 | Minimum Path Sum
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...
- [Swift]LeetCode396. 旋转函数 | Rotate Function
Given an array of integers A and let n to be its length. Assume Bk to be an array obtained by rotati ...
- Python 使用图灵机器人实现微信聊天功能
首先需要去图灵官网创建一个属于自己的机器人然后得到apikey. 一.自动与指定好友聊天 # -*- coding: utf-8 -*- """ Created at 2 ...
- Docker中运行EOS FOR MAC
基本要求以及依赖 安装 docker for mac ➡️ https://www.docker.com/products/docker-desktop docker需要7GB+内存.电脑右上角doc ...