使用 gulp 实现图片压缩、CSS 压缩合并、JS 压缩合并

gulp

gulp 是一款 nodejs 应用,用于前端开发过程中对代码进行构建,是自动化项目的构建利器。她不仅能对网站资源进行优化,而且在开发过程中很多重复的任务,比如打包、压缩、合并、git、远程操作等,能够通过编写好配置文件后,配合使用合适的插件自动完成,提高我们的工作效率。

gulp 简单易用,基于数据流的处理方式,就像制造车间的一台进口车床(gulp),配合一系列高质量的刀具(gulp插件),来流水线般完成多道工序,最后再输出成品(文件)。

中间过程都是半成品(数据流)的形式,可以任意的定制不同工序(使用不同的插件), 一个车间里,也可以布置多个车床(创建多个task任务),用于生产不同产品(比如 图片压缩、CSS压缩合并、JS压缩合并等)。

在你正式使用 gulp 之前,首先你要安装 node.js 环境,自会赠送你 npm 包管理工具,然后 在命令行里:

# 安装 gulp-cli 命令行工具
npm install gulp-cli -g
# 安装本地依赖
npm install gulp -D
# 创建 gulpfile.js 文件
touch gulpfile.js
# 可以选择查看帮助
gulp --help

下面一起来看一个例子,使用 gulp 对图片、CSS 和 JS 进行处理:

(github 源码地址)

首先,创建一个 package.json 文件,把你认为需要用到的模块,通过 npm 安装到 node_modules 文件夹里,可以使用:

npm install -save-dev xxx xxx xxx

如此安装的同时,就写入到 package.json 的开发依赖字段中了,下次别人 clone 你的文件,拥有了你写的 package.json,就可以通过 npm install 快速在本地安装指定的依赖模块了。

因为通常我们是不会把 node_modules 文件夹也 push 到 github 上的,会在 .gitignore 文件中忽略它,这些模块存在于在 npm 的服务器中,(当然也存在淘宝镜像等第三方资源,为了提升我们的 install 速度)我们使用的时候,只需要依照 package.json 说的,安装指定版本即可。

假设你已经安装了需要用到的模块,下面我们就可以开始编写 gulpfile.js 文件了:

var gulp = require('gulp')

//引入组件
var concat = require('gulp-concat'), //合并文件 
  cssnano = require('gulp-cssnano'), //CSS压缩
  autoprefixer = require('gulp-autoprefixer'), //后编译,自动添加css兼容前缀
  jshint = require('gulp-jshint'), //js代码规范性检查
  uglify = require('gulp-uglify'), //js压缩
  imagemin = require('gulp-imagemin') //图片压缩

首先你要做的是引入 gulp 模块,接着引入 gulp 插件,这是CommonJs 的语法规范,因为 gulpfile.js 最终是运行在 node 环境下的。

gulp 有四个方法,gulp.src 、gulp.dest 、 gulp.task 、 gulp.watch,是不是超级简洁?没错,简单即是强大,你需要用干什么,就去下载使用相应的插件即可。

引入组件之后:

我们就开始通过 gulp.task 创建任务并制定任务名称,然后通过 gulp.src 指定输入路径,接着使用 .pipe (相当于管道,电路)串联不同的工具,以数据流(想象水流、电流,经过不同的阀门,闸口,电子元器件)的形式接力处理,最后传给 gulp.dest 输出到指定目录, 完成了我们的目的。

尽管如此,下面的用法初次遇见,可能还是会比较迷糊,但是理解了 gulp 的处理方式后, 阻碍你的只是某个插件的具体用法而已,至于具体怎么用, 那就千篇一律的同时不尽相同了,你只需要到 npm 去搜索相应的插件,仔细阅读 usage 即可,别人说怎么用你就怎么用,人家说了算,不要纠结。

对于 CSS ,我们可以:


gulp.task('css', function(){

  return gulp.src('src/css/*.css')  //读取待src/css 目录下所有的css文件
    .pipe(concat('merge.min.css')) //合并CSS,同时重命名为merge.min.css
    .pipe(cssnano()) //压缩 CSS
    .pipe(autoprefixer({  //自动给CSS 加前缀,用于兼容不同浏览器,不同版本
      browsers: ['last 10 versions'],  //具体参数含义,你应该去npm看文档
      cascade: false
    }))
    .pipe(gulp.dest('dist/css'))  //最后输出到 dist/css 目录下
})

对于JS,我们可以:

gulp.task('js', function(){
  return gulp.src('src/js/*.js') //读取待src/js 目录下所有的 JS 文件
    //.pipe(jshint())  这些都是可以按需使用,进行串联的
    //.pipe(jshint.reporter('default')) //检查如果出错,则在命令行以默认样式输出报告

    .pipe(concat('merge.min.js'))   //合并JS并重命名
    .pipe(uglify())  //压缩JS
    .pipe(gulp.dest('dist/js/'))  //输出到 dist/js 目录下(如果没有这个目录,会自动创建)
})

对于图片,我们可以:

gulp.task('img', function(){
  return gulp.src('src/imgs/*')  //进入
    .pipe(imagemin()) //压缩图片
    .pipe(gulp.dest('dist/imgs')) //输出
})

除了对 CSS、JS 和 图片处理以外,你还可以对 html 进行处理,还可以对版本号 的问题进行处理, 还可以启动一个实时刷新的静态服务器,然后通过 gulp.watch 监听指定目录、指定文件的变化,从而控制浏览器自动刷新, 为调试带来极大的便利性,尤其 CSS 这个大坑。

以上这些都是写在 gulpfile.js 文件中的,然后在命令行这样即可开动 gulp:

  gulp

如下图所示:

在当前项目目录下执行 gulp 时,gulp 会在当前目录下寻找 gulpfile.js 文件,然后执行里面所有的 task,这是gulp 默认行为。

另外,可以传入第二个可选参数,来指定依赖关系,这样当 gulp build 时,会先执行 css js img 三个任务,之后才执行build任务,但由于没有第三个参数,也就是没有回调函数,因此就结束了, 但我们实现了通过 gulp build 来个性化的执行我们指定的任务,而不是 gulp 一股脑的全部执行,当然你也可以直接 gulp css,指定执行 css

gulp.task('build', [ 'css', 'js', 'img']) // 或者把 build 改为 default

你也可以修改 gulp 的默认行为,将上面的 build 换为 default,当执行gulp 时,实际上就干了上面 gulp build 干的事情。

总之,单独执行 gulp ,会先查找文件里 有没有叫做 default 的任务名,他会默认执行default:

  • 有,则按你 default 中要求的来(也可以gulp default 执行)
  • 如果没有 default 的话,会报错:
[21:53:15] Task 'default' is not in your gulpfile
[21:53:15] Please check the documentation for proper gulpfile formatting

gulp xxx:gulp + 任务名 的形式,则执行指定任务。


最后,为什么直接 gulp 或者 gulp xxx 就可以工作了呢?

还记得最开始全局安装的gulp-cli吗?

# 安装 gulp-cli 命令行工具
npm install gulp-cli -g

其实由于我们在本地安装了gulp:

npm install gulp -D

即使不用安装 gulp-cli 工具,我们也能执行,只是很麻烦,
命令行里输入路径,找到 gulp 或者 gulp.cmd,自会执行:


bash终端

但这样有些反人类,还是走寻常路吧,毕竟 直接 gulp 来得更快。

结束语

以上就是对 gulp 的简单使用指南,更多的请访问官网查看文档。

另外在学这些工具的时候千万不要忘了我们的终极目的是什么:
是为了得到处理好的最终文件,因此现在的包括 gulp 等打包压缩处理的工具在内, 都是中间过程。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容