[关闭]
@FarmerZ 2016-08-15T00:33:59.000000Z 字数 4680 阅读 1678

gulp常用功能集合(开发和生产分离、静态资源压缩优化、代码优化、实时编译、hash)

gulp 前端自动化开发

1.功能需要

  1. html文件复制、自动更改hash文件链接、文件内容替换
  2. css文件复制与hash
  3. img文件的复制与hash
  4. js文件的复制、压缩、合并、重命名、hash
  5. 对文件的监视与自动更新
  6. 其他配合项包括compass/sas预编译,browser-sync实时预览

2.需要的gulp插件与详解

1.package.json 提取码:9687

  1. "devDependencies": {
  2. "del": "^2.2.1",
  3. "gulp": "^3.9.1",
  4. "gulp-cached": "^1.1.0",
  5. "gulp-changed": "^1.3.1",
  6. "gulp-clean-css": "^2.0.12",
  7. "gulp-concat": "^2.6.0",
  8. "gulp-csscomb": "^3.0.7",
  9. "gulp-htmlmin": "^2.0.0",
  10. "gulp-imagemin": "^3.0.2",
  11. "gulp-replace": "^0.5.4",
  12. "gulp-rev": "^7.1.0",
  13. "gulp-rev-collector": "^1.0.5",
  14. "gulp-uglify": "^2.0.0"
  15. }
1.del
该插件不是gulp的插件而是node的插件或者一个功能,作用是删除文件/文件夹。
2.gulp
这个就不用多说了,本地gulp插件
3.gulp-cached
这个插件用来对文件进行复制时,只是对那行更改过的文件进行复制,减少不必要的资源操作。在资源很多时,例如图片的复制,这个会加快gulp任务的执行速度,特别是需要实时预览时,减少延迟。
4.gulp-changed
这个插件跟gulp-cacahed插件类似,他主要是在对文件进行复制时,如果该文件没有改动过,那么就不允许该文件复制到目标文件件。(自己实测时看不出来,而且如果使用cached,就不用使用这个了)
5.gulp-clean-css
用来对css文件进行去注释,和压缩
6.gulp-concat
对文件进行合并,而且可以添加一个string参数,用来对合并的文件进行重命名
7.gulp-csscomb
对css进行版本支持
8.gulp-htmlmin
对html文件进行压缩,如去换行,去注释等
9.gulp-imagemin
对jpg、png等格式问的图片进行无损的压缩(特别有用,但是在你的node-modules中的插件过多时会存在图片压缩过慢的问题问题)
10.gulp-replace
用来替换文本文件中的内容
11.gulp-rev
对文件进行hash命名,并且生成对应的json文件
12.gulp-rev-collector
结合gulp-rev对hash的文件在html文件中进行引用路径更改
13.gulp-uglify
对js文件进行压缩,有人叫这个作“丑化”,确实挺丑的

本人没有在gulpfile.js文件使用实时预览的插件,因为这些任务已经很多了,gulp虽然速度很快,但是执行时也会有些迟缓,所以只是外部使用了browser-sync实时预览。
此外css预编译我使用的是sass,在集成到gulp预编译时如果出现了错误的语法,整个gulp监视任务就会完全停止,所以我是用的是外部sass监视。这个可以跟gulp一块使用,gulp只是监视css文件,然后进行自己的操作即可,二者各自做各自的事,出错了也不会有中断这样的影响。

3.gulpfile.js文件代码详解。

我的开发目录

我的目录

源文件gulpfile.js 提取码:aea6

1.需引入的插件

  1. var gulp = require('gulp');
  2. var changed = require('gulp-changed');
  3. var concat = require('gulp-concat');
  4. var htmlmin = require('gulp-htmlmin');
  5. var imagemin = require('gulp-imagemin');
  6. var uglify = require('gulp-uglify');
  7. var cleanCss = require('gulp-clean-css');
  8. var cache = require('gulp-cached');
  9. var rev = require('gulp-rev');
  10. var replace = require('gulp-replace');
  11. var del = require('del');
  12. var revCollector = require('gulp-rev-collector');

2.各个任务详解

1.复制html task : copyHtml

代码如下

  1. //对常用的东西进行变量化
  2. var dir = '../dist'; //对目标根目录进行变量
  3. gulp.task('copyHtml', function(){
  4. gulp.src('*.html') //当前目录的HTML文件
  5. .pipe(cache('copyHtml')) //只对修改的文件进行复制
  6. //.pipe(changed(dir))//只有变化的文件能够通过
  7. .pipe(htmlmin({collapseWhitespace: true,
  8. removeComments: true
  9. })) //对html文件进行压缩处理,去换行,去注释
  10. .pipe(replace('a.js','main.js')) //对html文件中的指定的文字进行替换
  11. .pipe(gulp.dest(dir)); //复制到目标文件
  12. });
2.复制css task:copyCss

代码如下

  1. gulp.task('copyCss',function(){
  2. del([dir+'/css/**/*'],{force: true}); // 由于每次更改css文件,进行hash的话旧的文件就会残留,因此每次写入前需要进行清空。
  3. gulp.src('css/main.css')
  4. // .pipe(changed(dir+'/css'))
  5. .pipe(cleanCss({conpatibility: 'ie8'})) //进行压缩
  6. .pipe(rev()) //进行hash
  7. .pipe(gulp.dest(dir+'/css'))
  8. .pipe(rev.manifest()) //产生hash对应的json文件
  9. .pipe(gulp.dest(dir+'/css'));
  10. });
3.复制图片 task:copyImg

代码如下

  1. gulp.task('copyImg', function () {
  2. gulp.src('img/*')
  3. .pipe(cache('copyImg'))
  4. // .pipe(changed(dir+'/img'))
  5. .pipe(imagemin()) //对图片进行压缩
  6. .pipe(rev())
  7. .pipe(gulp.dest(dir+'/img'))
  8. .pipe(rev.manifest())
  9. .pipe(gulp.dest(dir+'/img'));
  10. });
4.复制js文件 task:copyJs

代码如下

  1. gulp.task('copyJs', function(){
  2. del([dir+'/js/**/*'],{force: true}); //与css同理删除
  3. gulp.src('js/*.js')
  4. .pipe(cache('copyJs'))
  5. .pipe(concat('main.js')) //对js文件进行合并和重命名
  6. .pipe(uglify()) //对合并后的文件进行压缩
  7. .pipe(rev())
  8. .pipe(gulp.dest(dir+'/js'))
  9. .pipe(rev.manifest())
  10. .pipe(gulp.dest(dir+'/js'));
  11. });
5.对html中的静态资源(css,js,image)进行hash后的文件引用替换

代码如下

  1. gulp.task('rev',function(){
  2. gulp.src([dir+'/**/*.json', dir+'/*.html']) //找到json,和目标html文件路径
  3. .pipe(revCollector({
  4. replaceReved: true,
  5. // dirReplacements: {
  6. // 'a.js':'main.js'
  7. // }这里主要是对文件路径中的文字进行修改
  8. })) //进行替换
  9. .pipe(gulp.dest(dir));
  10. });
6.监视文件,并进行自动操作 task : watch

代码如下

  1. gulp.task('watch',function(){
  2. gulp.watch('*.html', ['copyHtml']); //监视html文件,如果发生变化就进行复制
  3. gulp.watch('css/main.css', ['copyCss']); //监视css文件,如果发生变化就进行复制
  4. gulp.watch('img/*.{jpg,png}',['copyImg']); //监视图片,如果发生变化就进行复制
  5. gulp.watch('js/*.js', ['copyJs']); //监视js文件,如果发生变化就进行复制
  6. gulp.watch(dir+'/{**/*.json,/*.html}', ['rev']) //监视json文件和html文件,如果发生变化就进行hash命名,和引用更改
  7. });
7.设置默认任务 task : default

代码如下

  1. gulp.task('default',['copyHtml','copyCss','copyImg','copyJs','watch']
  2. );
8.lastWorks 最后的任务

代码如下

  1. gulp.task('cleanCache', function(){
  2. delete cache.caches['copyHtml','copyImg','copyJs'];
  3. }) //由于cache不会自动清除缓存的东西,所以需要手动消除
  4. gulp.task('lastWorks',['cleanCache'] );
9.其他任务——清除开发文件夹(dist)

代码如下慎用

  1. gulp.task('clean', function(){
  2. del(['../dist/**/*'],{force: true});
  3. }); //清除dist中所有的文件和文件夹,适合新的项目开始时使用
10.新任务开始前的旧任务打包 task:packageProject

代码如下

  1. gulp.task('packageProject',function(){
  2. var zip = require('gulp-zip');
  3. var fileName = 'projectNew_0.zip';
  4. gulp.src(['../dist/**/*','!../dist/{css,js,img}/*.json']) //找到目标文件夹并且进行去除json文件处理
  5. .pipe(zip(fileName)) //对文件进行压缩和重命名
  6. .pipe(gulp.dest('../../projectNew')); //压缩到指定文件夹
  7. });

4.总结

现在流行的webpack包管理软件又要读前端进行革命了。但是gulp作为个入门短时间内还是不能够被取代得了的。

5.附件

如果需要能够实时预览的gulp.file,请点击这里 提取码:aea6

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注