为什么要自动化
你好,切图仔!
现在的前端早已不是简单的静态页面开发,一些大型的 Web App 动辄几千行甚至上万行代码,所以如何构建本地开发环境尤为重要。本篇文章将以 gulp 为例,从编译、文件合并、文件压缩、单元测试等几个角度从零开始搭建一个简单的前端开发环境。
Github 地址:gulp-demo
最佳实践
抛开项目类型,一个项目 Js 文件和目录结构应该有以下几个特点:
- 一个文件只包含一个对象
- 相关的文件用目录分组
- 保持第三方代码的独立
- 确定创建文位置
- 保持测试代码的完整性
以 jQuery 项目的目录结构为例
build:用来放置最终构建后的文件(不应该被提交)
src:用来放置所有的源文件,包括用例进行文件分组的子目录
test:用来放置测试文件,包含一些同源代码目录对应的子目录或文件
external:用来存放一些外部拓展文件
Gruntfile.js:grunt 配置文件,用来配置或定义任务并加载 Grunt 插件
package.json:描述了一个 NPM 包的所有相关信息
.eslintrc:Eslint 配置文件
从零开始
创建一个 Gulp 项目
假设你已经安装了 Node,通过npm init
初始化一个package.json
文件 ,然后新建一个gulpfile.js
文件,执行npm install grunt --save-dev
安装 Gulp。
1 | //gulpfile.js |
运行 gulp
1 | $ gulp |
使用命令gulp
会使默认是的名为 default 的任务(task)将会被运行,此示例未做任何事情。
ESLint
在团队开发中,编程风格(style guideline)和编码规范(code convention)的一致性是及其重要的,即时是缩进统一,也会给后期维护节省大量的时间成本。所以使用像 ESLint 这样的工具是很有必要的,不仅可以找出代码中潜在的错误,而且能针对你的代码给出编程风格上的警告。
安装 gulp-eslint
1 | $ npm i --save-dev gulp-eslint |
给gulpfile
添加 lint 任务
1 | gulp.task('lint', function() { |
使用 gulp-concat 和 gulp-uglify 合并压缩
如果恰当的组织 javaScript 文件,那么每个文件就只包含一个对象,但是会带来一个问题,就是会增加网络请求数。所以应该将文件合并,合并之后进行压缩工作,尽可能的缩小文件大小。
安装 gulp-concat 和 gulp-uglify
1 | $ npm i --save-dev gulp-concat gulp-uglify |
添加 javaScript 任务到gulpfile.js
中
1 | gulp.task('javascript', ['lint'], function() { |
然后修改gulp.task(..)
1 | gulp.task('default', ['lint', 'javascript'], function() {}); |
合并和压缩任务添加结束之后我们可以在src
文件夹里尝试一下,添加add.js
和multiply.js
1 | //add.js |
1 | //multiply.js |
执行gulp
,控制台会输出如下内容,项目目录会生成dist
文件夹,里面存放压缩并合并后的all.js
文件
1 | $ gulp |
1 | //all.js |
自动化测试
安装 gulp-mocha 和 chai ,前者是一款测试框架,就是运行测试的工具,在浏览器和 Node 环境都可以使用,添加测试,从而保证代码的质量。chai 是一款 js 断言库,就是判断源码的实际执行结果与预期结果是否一致。
1 | $ npm i --save-dev gulp-mocha chai |
为add.js
和multiply.js
添加测试脚本add.test.js
和multiply.test.js
。
1 | //add.test.js |
1 | //multiply.test.js |
describe
块称为”测试套件”(test suite),表示一组相关的测试。它是一个函数,第一个参数是测试套件的名称(”加法函数的测试”),第二个参数是一个实际执行的函数。it
块称为”测试用例”(test case),表示一个单独的测试,是测试的最小单位。它也是一个函数,第一个参数是测试用例的名称(”1 加 1 应该等于 2”),第二个参数是一个实际执行的函数。
添加 gulp 任务
1 | gulp.task('test', function() { |
执行gulp test
,如下输出
1 | [21:37:31] Starting 'test'... |
表示测试通过
Webpack
Webpack 是一款优秀的前端模块打包器,它可以找到 JavaScript 模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript 等),并将其转换和打包为合适的格式供浏览器使用。与 Gulp/Grunt 相比,Gulp/Grunt 是一种能够优化前端开发流程的工具,Webpack 是一种模块化的解决方案,同时 Webpack 在很多场景下可以替代 Gulp/Grunt 这类工具。所以 Webpack 是非常值得学习的。
总结
这篇文章是在读完 《编写可维护的 JavaScript》 这本书之后,做的总结性实践类文章。总之,如今的前端工程化完善,本文的例子只是很简单的内容,gulp
的具体使用,复杂应用的测试等内容还有待深入。
Github 地址:gulp-demo
Reference:
Gulp 中文网
测试框架 Mocha 实例教程