gulp的简单使用

参考链接:https://www.cnblogs.com/2050/p/4198792.html
在前端的工程化过程中,我们会有压缩代码,压缩图片,版本控制等需求。
那么我们该怎么解决这些问题呢?这时候我们就可以使用gulp。

一、gulp文件生成

原始项目结构
  1. 首先我们要生成一个package.json文件,这个文件用于管理本地安装的npm包。
  2. 其中的dependencies或devDependencies(开发环境)字段就是模块依赖的清单,每次npm update或者npm install都会自动把dependencies或devDependencies(开发环境)里面依赖的模块进行更新或下载安装。我们在接下来的例子中都以开发环境为例。
  3. 那么如何生成一个package.json呢?在终端中运行以下命令:
npm init

接下来会跳出一系列信息让你填写(name,version,description等),可以按照自己实际情况填写,没有就一直enter就行了。


生成package.json之后的项目结构
{
  "name": "gulptest",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

可以看到现在package.json里面还没有devDependencies,接下来我们安装gulp,运行以下命令:

npm install --save-dev gulp

如果希望全局安装,则运行:

npm install --global gulp

注意:记得加上--save-dev,如果不加,package.json里面不会自动添加模块清单,需要自己手动添加。

安装gulp之后的项目结构

  • node_modules里面就是已经安装的npm包。
  • package-lock.json用于锁定安装时的包的版本号,并且需要上传到git,以保证其他人在npm install时大家的依赖能保证一致。

可以看到package.json里面的devDependencies多了gulp模块以及其版本号。

{
  "name": "gulptest",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {},
  "devDependencies": {
    "gulp": "^3.9.1"
  }
}

接下来我们自己新建一个gulpfile.js。

新建gulp.js

至此,我们的gulp文件生成都已经完成啦!

二、gulpfile.js基本语法

在gulp中,使用的是Nodejs中的stream流,首先获取到需要的stream,然后可以通过stream的pipe()方法把流导入到下一步。

我们先了解一下gulp的几个重要的api。

  1. gulp.src(globs[, options]):用来获取流,用这个方法读取需要操作的文件。
    globs参数是文件匹配模式(类似正则表达式),用来匹配文件路径(包括文件名),这里也可以直接指定某个具体的文件路径。当有多个匹配模式时,该参数可以为一个数组,如gulp.src(['js/*.js','css/*.css','*.html'])。
匹配规则
匹配例子
  1. gulp.dest(path[,options]):定义文件输出的位置,是一个文件夹。
    path为写入文件的路径。给gulp.dest()传入的路径参数,只能用来指定要生成的文件的目录,而不能指定生成文件的文件名,它生成文件的文件名使用的是导入到它的文件流自身的文件名,所以生成的文件名是由导入到它的文件流决定的,即使我们给它传入一个带有文件名的路径参数,它也会把这个文件名当做是目录名。
  2. gulp.task(name[, deps], fn):用来定义任务。
    name 为任务名。deps 是当前定义的任务需要依赖的其他任务,为一个数组。当前定义的任务会在所有依赖的任务执行完毕后才开始执行。如果没有依赖,则可省略这个参数。fn 为任务函数,我们把任务要执行的代码都写在里面。该参数也是可选的。
  3. gulp.watch(glob[, opts], tasks):用来监视文件的变化,当文件发生变化后,我们可以利用它来执行相应的任务,例如文件压缩等。
    glob 为要监视的文件匹配模式,规则和用法与gulp.src()方法中的glob相同。opts 为一个可选的配置对象,通常不需要用到。tasks 为文件变化后要执行的任务,为一个数组。

接下来我们开始写代码:

var gulp = require('gulp')

gulp.task('default', function () {
  console.log('gulp!')
})

在终端中切换到项目根目录下,直接运行gulp命令,没有指定任务名字,就会执行default任务,输出'gulp!'字符串。

三、常用的插件

  1. gulp-load-plugins:要使用gulp的插件,首先得用require来把插件加载进来,如果我们要使用的插件非常多,gulpfile文件就会变得十分冗长。gulp-load-plugins这个插件能自动帮你加载package.json文件里的gulp插件。比如我们要使用gulp-rename和gulp-ruby-sass这两个插件的时候,就可以使用plugins.rename和plugins.rubySass来代替了,也就是原始插件名去掉gulp-前缀,之后再转换为驼峰命名。

安装:

npm install --save-dev gulp-load-plugins

引入并立即执行:

var plugins = require('gulp-load-plugins')()
  1. gulp-rename:给文件重命名。

安装:

npm install --save-dev gulp-rename

使用:

gulp.task('rename', function () {
  return gulp.src('./index.html')
  .pipe(plugins.rename('index-rename.html'))
  .pipe(gulp.dest('./dist'))
})

在终端中运行命令:

gulp rename

重命名文件

注意:我在这里使用了gulp-load-plugins插件,用法见第1点。如果不使用gulp-load-plugins,可以自己引入gulp-rename并使用,以下插件类似。

  1. gulp-minify-html:压缩html文件。

安装:

npm install --save-dev gulp-minify-html

使用:

gulp.task('minifyHtml', function () {
  return gulp.src('./index.html')
  .pipe(plugins.minifyHtml())
  .pipe(plugins.rename({suffix: '.min'}))
  .pipe(gulp.dest('./dist'))
})

在终端中运行命令:

gulp minifyHtml
压缩html并在dist生成

可以看到代码中先把html代码压缩,然后重命名加.min后缀,最后输出在dist文件夹。

  1. gulp-minify-css:压缩css文件。

安装:

npm install --save-dev gulp-minify-css

使用:

gulp.task('minifyCss', function () {
  return gulp.src('./css/*.css')
  .pipe(plugins.minifyCss())
  .pipe(plugins.rename({suffix: '.min'}))
  .pipe(gulp.dest('./dist/css'))
})

在终端中运行命令:

gulp minifyCss
压缩css文件,并在dist下面的css文件夹输出
  1. gulp-uglify:压缩js文件。

安装:

npm install --save-dev gulp-uglify

使用:

gulp.task('minifyJs', function () {
  return gulp.src('./js/*.js')
  .pipe(plugins.uglify())
  .pipe(plugins.rename({suffix: '.min'}))
  .pipe(gulp.dest('./dist/js'))
})

在终端中运行命令:

gulp minifyJs
压缩js文件,并在dist下面的js文件夹输出
  1. gulp-imagemin:压缩图片文件。

安装:

npm install --save-dev gulp-imagemin

使用:

gulp.task('minifyImg', function () {
  return gulp.src('./img/*')
  .pipe(plugins.imagemin())
  .pipe(gulp.dest('./dist/img'))
})

在终端中运行命令:

gulp minifyImg
压缩图片文件,并在dist下面的img文件夹输出
  1. gulp-clean:清空文件夹及其文件。

安装:

npm install --save-dev gulp-clean

使用:

gulp.task('clean', function () {
  return gulp.src('./dist')
  .pipe(plugins.clean())
})

在终端中运行命令:

gulp clean
clean之后清空了dist文件夹
  1. run-sequence:串行执行任务,也就是按顺序执行。
    我们之前的例子都可以并行执行,但是如果一个任务的执行依赖于另一个任务的执行结果,就需要串行执行任务。

安装:

npm install --save-dev run-sequence

使用:

var runSequence = require('run-sequence')
gulp.task('init', function () {
  runSequence(
    'clean',
    ['minifyCss', 'minifyJs', 'minifyImg'],
    'minifyHtml'
  )
})

在终端中运行命令:

gulp init
任务流

可以看到在任务流中,先执行了clean任务,再执行了minifyCss,minifyJs,minifyImg任务,最后执行minifyHtml任务。

  1. gulp-babelbabel-core:将ES6代码转化为ES5代码。

安装:

npm install --save-dev gulp-babel babel-preset-es2015
npm install --save-dev babel-core

使用:

gulp.task('babel', function () {
  return gulp.src('./js/*.js')
  .pipe(plugins.babel({presets: ['es2015']}))
  .pipe(gulp.dest('./dist/es5'))
})

在终端中运行命令:

gulp babel

编译前的ES6代码:

let [a, [b, c], d] = [1, [2, 3], 4]
console.log(a)
console.log(b)
console.log(c)
console.log(d)

编译后的ES5代码:

"use strict";

var a = 1,
    b = 2,
    c = 3,
    d = 4;

console.log(a);
console.log(b);
console.log(c);
console.log(d);
  1. gulp-revgulp-rev-collector:用于版本控制,原理是给js和css文件后面加hash字符串,生成一个json文件,并根据json文件在html里面替换。

安装:

npm install --save-dev gulp-rev
npm install --save-dev gulp-rev-collector

使用:

gulp.task('minifyJs', function () {
  return gulp.src('./js/*.js')
  .pipe(plugins.uglify())
  .pipe(plugins.rev())
  .pipe(gulp.dest('./dist/js'))
  .pipe(plugins.rev.manifest())
  .pipe(gulp.dest('./rev/js'))
})
gulp.task('minifyHtml', function () {
  return gulp.src(['./rev/**/*.json', './index.html'])
  .pipe(plugins.minifyHtml())
  .pipe(plugins.revCollector())
  .pipe(gulp.dest('dist'))
})

在终端中运行之前初始化命令:

gulp init
版本控制
  • rev()用于给js文件或者css文件加hash串后缀。
  • rev.manifest()用于生成json文件,这个json文件是后面替换html中路径的规则。
  • revCollector()根据json文件替换html中的资源路径。

————
前端·小w
纸上学来终觉浅,绝知此事要躬行

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

推荐阅读更多精彩内容