Gulp的那些事

Posted web前端与开发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gulp的那些事相关的知识,希望对你有一定的参考价值。

Gulp

  • https://gulpjs.com/

  • http://www.gulpjs.com.cn/

  • https://github.com/gulpjs/gulp

WHY

Gulp 是一个自动化构建工具,可以用来帮助你提高你的开发效率。

  • 自动化

  • 流程控制

  • 网页性能优化

    • 减少页面请求数量

    • 如果一个页面引用的静态资源太多,例如 javascript 则可以把他们合并一下

    • 把 css 合并

    • 压缩:减小文件体积,提高页面响应速度

    • 图片压缩,减小文件体积

    • html 页面也可以压缩

    • 开发过程中需要频繁的修改代码刷新浏览器,也可以使用工具来解决

    • 页面中通用的部分很麻烦

    • 编译 less

    • 编译 sass

GET STARTED

https://github.com/gulpjs/gulp/blob/master/docs/getting-started.md

全局安装 gulp-cli

$ npm install --global gulp-cli

初始化 package.json 文件

$ npm init -y

gulp 安装到本地项目

# --save-dev$ npm install --save gulp

在项目根目录下创建一个名字为 gulpfile.js 文件并写入以下内容

// 0. 引包var gulp = require('gulp')// 1. 定义任务

gulp.task('chifan',
function () {
 console.log('吃饭任务被执行了')})

gulp.task('shuijiao',
function () {
 console.log('睡觉任务被执行了')})

gulp.task('default',
function () {
 console.log('默认任务被执行了')})

然后就可以测试你的 gulp 任务了

在命令行中,分别输入以下命令进行测试(注意,一定要在项目目录下)

$ gulp chifan$ gulp shuijiao$ gulp$ gulp chifan shuijiao default

API

https://github.com/gulpjs/gulp/blob/master/docs/API.md

  • gulp.src

  • gulp.dest

  • gulp.task

  • gulp.watch

  • pipe 方法是承上启下的数据连接管道,在构建的过程中需要使用

gulp.src(globs[, options])

用于读取文件

globs

// 读取的是空目录 js

gulp.src('./src/js')

// 读取的是单文件

gulp.src('./src/js/main.js')

// 读取的是 js 根目录下的所有文件

gulp.src('./src/js/*')

// 读取的是 js 根目录下的所有以 .js 结尾的文件

gulp.src('./src/js/*.js')

// 递归读取 js 目录(所有的)

gulp.src('./src/js/**/*')

// 递归读取 js 目录(所有的)中所有的以 .js 结尾的文件

gulp.src('./src/js/**/*.js')

// 读取 ./src/js/main.js 和 ./src/css/**/*.css

gulp.src(['./src/js/main.js', './src/css/**/*.css'])

// 读取 client 里面所有以 .js 结尾的文件// 排除 client 中所有以 b 开头,
以 .js 结尾的文件
// 但是在排除的条件之外,读取 client/bad.js 文件

gulp.src(['client/*.js', '!client/b*.js', 'client/bad.js'])

options

gulp.task('copy-js', function () {  // gulp.src(['src/js/*.js', 
'!src/js/b*.js', 'src/js/ba.js'])
 
 // gulp.src(['src/js/*.js', '!src/js/b*.js'],
{
 //     base: './src/' // 默认会直接拷贝到 dist 根目录,
如果希望让拷贝到 dist 中的 js 目录保持原来的文件结构,则把 js 的父目录
src 配置到 base 选项中就可以了
 //   })  //  
.pipe(gulp.dest('./dist'))
 
 gulp.src('./src/js/helper/*.js',
 {
     base: './src/' // 默认会直接拷贝到 dist 根目录,如果希望让拷贝
到 dist 中的 js 目录保持原来的文件结构,则把 js 的父目录 src 配置到 base
选项中就可以了
   })    .pipe(gulp.dest('./dist'))})

gulp.dest(path[, options])

path

要写入的目标路径目录,路径始终是目录

gulp.task(name , deps)

没有任何行为的任务:

gulp.task('aaa')

具有行为的任务:

gulp.task('aaa', function () {  // 任务代码})

具有依赖的任务:

gulp.task('a', function () {  console.log('aaa')})gulp.task('b', 
function () {
 console.log('bbb')})gulp.task('c', function () {  
 console.log('ccc')
})// d 任务把 a、b、c 三个任务集合到一起了/
/ 执行 d 任务就会先指向 a、b、c 三个任务
// 当 a、b、c 三个任务执行结束
,开始执行 d 任务
gulp.task('d', ['a', 'b', 'c'], function () {
 console.log('ddd end')
})

流程控制之:callback

第一种情况(1 3 4 2):

gulp.task('a', function () {  console.log(1)  setTimeout(function () 
 {
   console.log(2)    console.log('a 任务的 1s 时间执行到了')  },
  1000)
 console.log(3)})gulp.task('default', ['a'], function ()
{
 console.log(4)  console.log('default end')})// function f1() {

//   console.log(1)//   setTimeout(function () {//    
console.log(2)
//   }, 1000)//   console.log(3)// }// function f2()
{
//   f1()//   console.log(4)// }// f2()

第二种情况(通过 cb 来控制异步任务)(1 3 2):

// 任务函数的 cb 参数用来异步流程控制// 如果该任务没有调用 cb ,则依赖该
任务的任务永远执行不到
// 如果该任务调用了 cb ,则依赖该任务的任务才会被执
行到

gulp.task('a', function (cb) {  console.log(1)  setTimeout(
 function () {
   console.log(2)  }, 1000)  console.log(3)})

gulp.task('default', ['a'], function () {  console.log(4)})

第三种情况(通过 cb 来控制异步任务)(1 3 4 2):

// 任务函数的 cb 参数用来异步流程控制// 如果该任务没有调用 cb ,则依赖该任
务的任务永远执行不到
// 如果该任务调用了 cb ,则依赖该任务的任务才会被执行到

gulp.task('a', function (cb) {  console.log(1)  setTimeout(function
 () {
   console.log(2)  }, 1000)  console.log(3)  cb()})

gulp.task('default', ['a'], function () {  console.log(4)})

正确情况(通过 cb 来控制异步任务)(1 3 2 4):

// 任务函数的 cb 参数用来异步流程控制// 如果该任务没有调用 cb ,则依赖该任
务的任务永远执行不到
// 如果该任务调用了 cb ,则依赖该任务的任务才会被执行到

gulp.task('a', function (cb) {  console.log(1)  setTimeout(function
 () {
   console.log(2)    // 注意:在这里调用,才能保证 a 任务中的定时
器执行结束了才执行依赖 a 任务的任务
   cb()  }, 1000)  console.log(3)})

gulp.task('default', ['a'], function () {  console.log(4)})

依赖任务是并行执行的

gulp.task('a', function (cb) {  console.log(111)  setTimeout(
 function () {
   console.log('aaa')    cb()  }, 1000)})

gulp.task('b', function (cb) {  console.log(222)  setTimeout(
 function () {
   console.log('bbb')    cb()  }, 500)})

gulp.task('c', function (cb) {  console.log(333)  setTimeout(
 function () {
   console.log('ccc')    cb()  }, 3000)})

// default 依赖的所有任务,只要任何一个任务写了 cb 没有调用,则 default
就永远执行不到

gulp.task('default', ['a', 'b', 'c'], function () {  console.log

('default end')
})

流程控制之 return

gulp.task('less', function () {  console.log('less 任务开始编译了') 
 // 这里加 return
 // 那么依赖 less 的任务就一定会等待 less 任务编译执
行结束才会执行自己
 
 return gulp.src('./src/less/**/*.less')
   
   .pipe(less())
   
   .pipe(gulp.dest('./dist/css'))
})// 将 dist/css/**/*.css 压缩写入
dist/build

gulp.task('mini-css', ['less'], function () {  
 gulp.src('./dist/css/**/*.css')
   
   .pipe(cssMinify())
   
   .pipe(gulp.dest('./dist/build'))
})

经验:

任务中的 gulp.src() 都称之为流任务,如果流任务是被某个任务依赖的,则我们在 gulp.src() 之前加上一个 return 就能保证一个在这个流任务执行结束之后,依赖该任务的任务才会执行。

在 gulp 中,常见的任务都是流任务,就是读取文件,然后使用插件,最后写入文件。所以这种流任务中是否加 return 取决于依赖该任务的任务是否需要该任务的构建结果。

对于依赖任务而言,如果是流任务:

  • 需要依赖的构建结果,就加 return

  • 不需要依赖的构建结果,就不用加 return

如果是类似于定时器的任务,则使用 cb 来控制。

gulp.watch(glob [, opts], tasks) or gulp.watch(glob [, opts, cb])

gulp.watch(glob[, opts], tasks)

gulp.watch(glob[, opts, cb])

插件

编译和压缩 less

安装两个插件:$ npm i -S gulp-less gulp-csso

以上是关于Gulp的那些事的主要内容,如果未能解决你的问题,请参考以下文章

转载关于烂代码的那些事

关于烂代码的那些事(中)

laravel 中 与前端的一些事2 之使用Gulp编译sass

laravel 中 与前端的一些事3 之使用Gulp编译less

关于烂代码的那些事(下)

关于代码调试de那些事