资讯专栏INFORMATION COLUMN

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

silvertheo / 1517人阅读

摘要:在资源很多时,例如图片的复制,这个会加快任务的执行速度,特别是需要实时预览时,减少延迟。但是作为个入门短时间内还是不能够被取代得了的。

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

tags: gulp 前端自动化开发

npm仓库下载地址
https://www.npmjs.com/package/cddgulp

[TOC]
本人自用在此基础上的一个完整自用框架——cddgulp
npm点这里
github点这里
另一个基于vuepack改写的自用的webpack2.x+vue2.x的实时预览前端脚手架,点这里

1.功能需要

html文件复制、自动更改hash文件链接、文件内容替换

css文件复制与hash

img文件的复制与hash

js文件的复制、压缩、合并、重命名、hash

对文件的监视与自动更新

其他配合项包括compass/sas预编译,browser-sync实时预览

2.需要的gulp插件与详解
 "devDependencies": {
    "del": "^2.2.1",
    "gulp": "^3.9.1",
    "gulp-cached": "^1.1.0",
    "gulp-changed": "^1.3.1",
    "gulp-clean-css": "^2.0.12",
    "gulp-concat": "^2.6.0",
    "gulp-csscomb": "^3.0.7",
    "gulp-htmlmin": "^2.0.0",
    "gulp-imagemin": "^3.0.2",
    "gulp-replace": "^0.5.4",
    "gulp-rev": "^7.1.0",
    "gulp-rev-collector": "^1.0.5",
    "gulp-uglify": "^2.0.0"
  }

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.需引入的插件
var gulp = require("gulp");
var    changed = require("gulp-changed");
var    concat = require("gulp-concat");
var    htmlmin = require("gulp-htmlmin");
var    imagemin = require("gulp-imagemin");
var    uglify = require("gulp-uglify");
var    cleanCss = require("gulp-clean-css");
var cache = require("gulp-cached");
var rev = require("gulp-rev");
var replace = require("gulp-replace");
var del = require("del");
var revCollector = require("gulp-rev-collector");
2.各个任务详解 1.复制html task : copyHtml

: 代码如下

//对常用的东西进行变量化


var dir = "../dist";    //对目标根目录进行变量

gulp.task("copyHtml", function(){
    gulp.src("*.html")      //当前目录的HTML文件
    .pipe(cache("copyHtml"))       //只对修改的文件进行复制
    //.pipe(changed(dir))//只有变化的文件能够通过
    .pipe(htmlmin({collapseWhitespace: true,
        removeComments: true
    }))     //对html文件进行压缩处理,去换行,去注释
    .pipe(replace("a.js","main.js"))        //对html文件中的指定的文字进行替换
    .pipe(gulp.dest(dir));      //复制到目标文件
});
2.复制css task:copyCss

: 代码如下

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

: 代码如下

gulp.task("copyImg", function () {
    gulp.src("img/*")
    .pipe(cache("copyImg"))     
    // .pipe(changed(dir+"/img"))
    .pipe(imagemin())   //对图片进行压缩
    .pipe(rev())
    .pipe(gulp.dest(dir+"/img"))
    .pipe(rev.manifest())
    .pipe(gulp.dest(dir+"/img"));
});
4.复制js文件 task:copyJs

: 代码如下

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

: 代码如下

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

: 代码如下

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

: 代码如下

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

: 代码如下

gulp.task("cleanCache", function(){
    delete cache.caches["copyHtml","copyImg","copyJs"];
})      //由于cache不会自动清除缓存的东西,所以需要手动消除


gulp.task("lastWorks",["cleanCache"] );
9.其他任务——清除开发文件夹(dist)

: 代码如下慎用

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

: 代码如下

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

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

5.github项目地址:

点击这里

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/81806.html

相关文章

  • 基于 Gulp 的简易前端自动化工程搭建

    摘要:生成的文件如下由于给文件添加了哈希值,所以每次编译出来的和都是不一样的,这会导致有很多冗余文件,所以我们可以每次在生成文件之前,先将原来的文件全部清空。中也有做这个工作的插件,因此我们可以在编译压缩添加哈希值之前先将原文将清空。 原文链接:http://mrzhang123.github.io/2016/09/07/gulpUse/项目链接:https://github.com/MrZ...

    Blackjun 评论0 收藏0
  • webpack4.x升级摘要

    摘要:以为例,编写来帮助我们完成重复的工作编译压缩我只要执行一下就可以检测到文件的变化,然后为你执行一系列的自动化操作,同样的操作也发生在这些的预处理器上。的使用是针对第三方类库使用各种模块化写法以及语法。 showImg(https://segmentfault.com/img/bVbtZYK); 一:前端工程化的发展 很久以前,互联网行业有个职位叫做 软件开发工程师 在那个时代,大家可能...

    levinit 评论0 收藏0
  • webpack4 的生产环境优化

    摘要:的生产环境优化完整配置的可以参考本文主要介绍了生产环境我都做了哪些优化文章的结构如下静态资源路径。分配不同的关于稳定性的坑注意区分整个项目有变动时,变化。而生产环境可以这一项,因为我们不需要在生产环境调试代码。 webpack4 的生产环境优化 webpack4完整配置的可以参考: https://github.com/ziwei3749/... 本文主要介绍了 webpack4 生产...

    bang590 评论0 收藏0
  • 聊聊webpack

    摘要:但是由于缺乏规范化管理,出现了很多种模块化规范,从针对的规范,到针对浏览器端的,终于在里规范了前端模块化。可以通过两种方式之一终端或。导出多个配置对象运行时,所有的配置对象都会构建。在阶段又会发生很多小事件。 随着前端的迅速发展,web项目复杂度也是越来越高。为了便捷开发和利于优化,将一个复杂项目拆分成一个个小的模块,于是模块化开发出现了。但是由于缺乏规范化管理,出现了很多种模块化规范...

    Ashin 评论0 收藏0
  • 前端面试之webpack篇

    摘要:面试你一般问你的原理,的原理,你有用那些优化措施前端开发已经模块化,它改进了代码库的封装和结构。这么说负责的是处理源文件的如,一次处理一个文件。小心的运用他们。因为随着项目的增长,它们会变得很难驯服。 还是以前一样,有些概念面试可能会考,我都用*标记了出来,两句话就总结清楚其余的地方如果你想了解webpack,就仔细看看,虽然本教程不能让你webpack玩的很6,但是懂操作流程够了。面...

    cangck_X 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<