项目构建是指项目上线之前对项目源代码进行一系列处理,使其以最佳的形式运行于线上服务器。常见处理任包括以下几方面:
1、模块化开发可以实现功能的复用并解决模块间的依赖关系,但带来好处的同时也使得功能代码的碎片化(若干文件)程度增加。
2、使用less、sass等预处理器,可以降低CSS的维护成本,最终需要将这些预处理器编译成css文件;
3、对静态资源(css、js、html、images)压缩合并可以提升网页打开速度,提高性能;
以上任务完如果完全靠手动来完成是非常耗时耗力的且容易出错,实际开发通常借助构建工具来实现。
所谓构建工具是指通过一系简单配置就可以帮我们实现合并、压缩、校验、预处理等一系列任务的软件工具。
常见的构建工具包括:Grunt、Gulp、F.I.S(百度出品)、webpack等。
Gulp是基于 Nodejs 开发的一个构建工具,借助 gulp 插件可以实现不同的构建任务,其以简洁的配置和卓越的性能成为目前主流的构建工具。
全局安装
|
|
Gulp基础
1、本地安装 gulp
进入项目根目录执行
|
|
2、全局安装
|
|
添加–save-dev会在package.json记录依赖关系.
3、任务清单
在项目根目录中创建 gulpfile.js,gulp会参考这个配置文件执行构建任务。
4、定义任务
在 gulpfile.js
定义构建任务,如压缩、合并等。
gulp 是通过调用插件来完成具体构建任务的,并且这些插件也都基于 Nodejs.
以编译 LESS 为例,安装
|
|
使用 gulp, 定义了一个名称为 less 的任务,用来完成 less 编译成 css 的任务。
|
|
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
例子
|
|
seajs 的配置文件中加 vars 键修改引入 seajs 文件的路径
|
|
重新配置生产环境(项目上线)文件路径:
|
|
bulid 的一个示例
|
|
缓存、性能优化
<link href="base.css?v=1">
后面的参数用来解决浏览器缓存
浏览器会将静态资源(CSS、images、js)缓存到本地浏览器中,下次请求时就读取本地资源来显示,缓存可以带来性能的提升,但是也会给前端开发者带来问题。往往这种问题是由缓存构成的。
怎么解决呢?分析浏览器缓存机制问题。什么情况下不需要浏览器缓存?
浏览器默认缓存按资源路径进行的缓存 ./css/base.css,因此每次开发加个参数 ./css/base.css?v=1 或者 ./css/base.css?v=20141123 加了一个时间戳;
前端性能优化:协商缓存,雅虎 13 条
当内容的确改变后才需要,就意味着我们需要知道内容是否改变了,利用 md5 可以处理。当更改后会形成新的值
,利用这个值充当文件名称。把文件加密成 md5 串,这种方式就是指纹
不同 js 文件合并
需要注释: ./libs/all.js
就是合并之后的名称
|
|
移除一些上线不需要的文件。
|
|
合并之后压缩
.pipe(gulpif('*.js', uglify()))
gulp 构建过程总结
- touch gulpfile.js
- 全局安装 gulp
- 本地安装 gulp
- 处理 css
- gulp-less
- gup-cssmin
- gup-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
- 处理一些其它内容
监视文件变化
|
|
文件合并时需要对每一个模块娶一个名字
需要一个工具
seajs 在上线做合并处理的时候,并不是将所有文件合并才是最佳方式,
有一些公共第三方模块可以不做合并处理,利用浏览器缓存功能更会使得性能更好;
define(‘当前模块路径’, [‘依赖模块相对路径’], function() {});
要实现上述操作,需要在合并前