项目构建是指项目上线之前对项目源代码进行一系列处理,使其以最佳的形式运行于线上服务器。常见处理任包括以下几方面:
1、模块化开发可以实现功能的复用并解决模块间的依赖关系,但带来好处的同时也使得功能代码的碎片化(若干文件)程度增加。
2、使用less、sass等预处理器,可以降低CSS的维护成本,最终需要将这些预处理器编译成css文件;
3、对静态资源(css、js、html、images)压缩合并可以提升网页打开速度,提高性能;
以上任务完如果完全靠手动来完成是非常耗时耗力的且容易出错,实际开发通常借助构建工具来实现。
所谓构建工具是指通过一系简单配置就可以帮我们实现合并、压缩、校验、预处理等一系列任务的软件工具。
常见的构建工具包括:Grunt、Gulp、F.I.S(百度出品)、webpack等。
Gulp是基于 Nodejs 开发的一个构建工具,借助 gulp 插件可以实现不同的构建任务,其以简洁的配置和卓越的性能成为目前主流的构建工具。
全局安装
1 | $ npm install -g gulp |
Gulp基础
1、本地安装 gulp
进入项目根目录执行
1 | $ npm install gulp --save-dev |
2、全局安装
1 | $ npm install -g gulp |
添加–save-dev会在package.json记录依赖关系.
3、任务清单
在项目根目录中创建 gulpfile.js,gulp会参考这个配置文件执行构建任务。
4、定义任务
在 gulpfile.js
定义构建任务,如压缩、合并等。
gulp 是通过调用插件来完成具体构建任务的,并且这些插件也都基于 Nodejs.
以编译 LESS 为例,安装
1 | $ npm install gulp-less |
使用 gulp, 定义了一个名称为 less 的任务,用来完成 less 编译成 css 的任务。
1 | var gulp = require('gulp'); |
5、执行任务
打开命令行窗口并切换到项目根目录下,执行命令 gulp less
,这时全局安装的 gulp 便以我们定义好的 gulpfile.js
执行构建任务了。
这样LESS文件便会编译成CSS文件,并保存在了./public/css目录下。
各种插件的使用:
Gulp工作原理
通过不同的插件实现构建任务,Gulp只是按着配置文件调用执行了这些插件。
Gulp API
Gulp是基于NodeJS的,通过require可以引入一个NodeJS的包(模块),其作用类似于浏览器中的script标签引入资源,被引入的包存放在node_modules目录下。
引入gulp包(模块)后返回一个对象(习惯赋值给变量gulp),通过该对象提供的方法(API)完成任务的配置。
1、gulp.task()
定义各种不同的任务,不同任务间存在依赖关系时,可以指定依赖。
2、gulp.src()
需要构建资源的路径,字符串或数组(可以正则方式书写)
2、gulp.pipe()
管道,将需要构建的资源“输送”给插件。
3、gulp.dest()
构建任务完成后资源存放的路径(会自动创建)
4、gulp.watch()
通过监视某静态资源的修改,然后可以调用相应任务。
常用Gulp插件
gulp-less
- 编译LESS文件
gulp-autoprefixer
- 添加CSS私有前缀
gulp-cssmin
- 压缩CSS
gulp-rname
- 重命名
gulp-imagemin
- 图片压缩
gulp-uglify
- 压缩Javascript
gulp-concat
- 合并
gulp-htmlmin
- 压缩HTML
gulp-rev
- 添加版本号
gulp-rev-collector
- 内容替换
gulp-useref
gulp-if
gulp-seajs-transport
例子
1 | // 引包 |
seajs 的配置文件中加 vars 键修改引入 seajs 文件的路径
1 | seajs.config({ |
重新配置生产环境(项目上线)文件路径:
1 | <script> |
bulid 的一个示例
1 | <!-- build:js ./libs/all.js --> |
移除一些上线不需要的文件。
1 | <!-- 并没有实际合并,而是利用 build:css 来改名称 --> |
合并之后压缩
.pipe(gulpif('*.js', uglify()))
gulp 构建过程总结
- touch gulpfile.js
- 全局安装 gulp
- 本地安装 gulp
- 处理 css
- gulp-less
- gulp-cssmin
- gulp-autoprefixer
- gulp-rev
- rev.minifest() 改名称了
- gulp-rename
- 图片处理
- gulp-imagemin
- gulp-rename
- 改名
- gulp-useref
- gulp-manifest
- gulp-uglify
- gulp-if
- 路径替换
- gulp-rev-collector
- 压缩 html
- gulp-htmlmin
- 处理一些其它内容
监视文件变化
1 | gulp.task('watch', function(){ |
文件合并时需要对每一个模块娶一个名字
需要一个工具
seajs 在上线做合并处理的时候,并不是将所有文件合并才是最佳方式,
有一些公共第三方模块可以不做合并处理,利用浏览器缓存功能更会使得性能更好;
define(‘当前模块路径’, [‘依赖模块相对路径’], function() {});
要实现上述操作,需要在合并前