博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Gulp
阅读量:6857 次
发布时间:2019-06-26

本文共 5157 字,大约阅读时间需要 17 分钟。

Gulp官宣

  1. 易于使用
    • 通过代码优于配置的策略,Gulp 让简单的任务简单,复杂的任务可管理。
  2. 构建快速
    • 利用 Node.js 流的威力,你可以快速构建项目并减少频繁的 IO 操作。
  3. 插件高质
    • Gulp 严格的插件指南确保插件如你期望的那样简洁高质得工作。
  4. 易于学习
    • 通过最少的 API,掌握 Gulp 毫不费力,构建工作尽在掌握:如同一系列流管道。

看了一下gulp的入门指南,确实和webpack相比简单很多,gulp是基于task的,可以把较为复杂的逻辑处理分解成每个简单的task任务完成,它不像webpack,webpack相当于一个地球整体,所有的配置都整合在一起,使用webpack需要很清楚的理解它的运行机制,这样对于初学者来说是有一定困难的,从而gulp就友好很多。

Gulp Starting

  1. 全局安装gulp
npm install --g gulp复制代码
  1. 创建项目文件gulp_start
  2. 进入文件gulp_start,安装项目依赖
npm install --save-dev gulp复制代码
  1. 在项目根目录下创建一个名为 gulpfile.js 的文件

gulp也需要一个文件作为它的主文件,在gulp中这个文件叫做gulpfile.js。新建一个文件名为gulpfile.js的文件,然后放到你的项目目录中。之后要做的事情就是在gulpfile.js文件中定义我们的任务了。

var gulp = require('gulp');gulp.task('mytest', function() {  console.log('hello world');});这里定义一个简单任务`mytest`复制代码
  1. 执行任务

只需切换到存放gulpfile.js文件的目录,然后在命令行中执行gulp命令就行了,gulp后面可以加上要执行的任务名,例如gulp task1,如果没有指定任务名,则会执行任务名为default的默认任务。

gulp mytest复制代码

这里输出了"hello world"。

我们先来总结一下gulp是干什么的:gulp是基于Nodejs的自动任务运行器, 它能自动化地完成 javascript、coffee、sass、less、html/image、css 等文件的测试、检查、合并、压缩、格式化、浏览器自动刷新、部署文件生成,并监听文件在改动后重复指定的这些步骤。复制代码

Gulp API

1. gulp的工作方式

在gulp中,使用的是Nodejs中的stream(流),首先获取到需要的stream,然后可以通过streampipe()方法把流导入到你想要的地方。所以gulp是以stream为媒介的,它不需要频繁的生成临时文件,这也是我们应用gulp的一个原因。

gulp一般流程:

  1. gulp.src()方法获取到想要处理的文件流
  2. 把文件流通过pipe方法导入到gulp的插件中
  3. 把经过插件处理后的流再通过pipe方法导入到gulp.dest()
  4. gulp.dest()方法则把流中的内容写入到文件中
var gulp = require('gulp');gulp.src('script/jquery.js')         // 获取流的api    .pipe(gulp.dest('dist/foo.js')); // 写放文件的api复制代码

2. globs匹配规则

gulp内部使用了node-glob模块来实现其文件匹配功能。

* 能匹配 a.js,x.y,abc,abc/,但不能匹配a/b.js*.* 能匹配 a.js,style.css,a.b,x.y*/*/*.js 能匹配 a/b/c.js,x/y/z.js,不能匹配a/b.js,a/b/c/d.js** 能匹配 abc,a/b.js,a/b/c.js,x/y/z,x/y/z/a.b,能用来匹配所有的目录和文件**/*.js 能匹配 foo.js,a/foo.js,a/b/foo.js,a/b/c/foo.jsa/**/z 能匹配 a/z,a/b/z,a/b/c/z,a/d/g/h/j/k/za/**b/z 能匹配 a/b/z,a/sb/z,但不能匹配a/x/sb/z,因为只有单**单独出现才能匹配多级目录?.js 能匹配 a.js,b.js,c.jsa?? 能匹配 a.b,abc,但不能匹配ab/,因为它不会匹配路径分隔符[xyz].js 只能匹配 x.js,y.js,z.js,不会匹配xy.js,xyz.js等,整个中括号只代表一个字符[^xyz].js 能匹配 a.js,b.js,c.js等,不能匹配x.js,y.js,z.js复制代码

3. src获取流

gulp.src()方法正是用来获取流的,但要注意这个流里的内容不是原始的文件流,而是一个虚拟文件对象流,这个虚拟文件对象中存储着原始文件的路径、文件名、内容等信息。

语法:

gulp.src(globs[, options]);复制代码

globs:文件匹配模式,可以是数组或String形式

options:可选参数,

  • options.buffer:(true)若为false,那么将会以 stream 方式返回 file.contents 而不是文件 buffer 的形式。
  • options.base:设置输出路径以某个路径的某个组成部分为基础向后拼接。这里简单的理解就是,设置的options.base是输出路径要改的相应的基础目录,后续的路径和输入的一致。
  • options.read:(true)若为false,那么file.contents 会返回空值(null),也就是并不会去读取文件。

4. dest写

语法:

gulp.dest(path[,options])复制代码

path:为写入文件的路径 options:可选参数,

  • options.cwd
  • options.mode

gulp.dest(path)生成的文件路径是我们传入的path参数后面再加上gulp.src()中有通配符开始出现的那部分路径。

5. watch文件监听

gulp.watch()用来监视文件的变化,当文件发生变化后,我们可以利用它来执行相应的任务,例如文件压缩等。

语法:

gulp.watch(glob[, opts], tasks); 复制代码
  • glob:要监视的文件匹配模式
  • opts 为一个可选的配置对象,通常不需要用到。
  • tasks 为文件变化后要执行的任务,为一个数组。

另一种使用方式:

gulp.watch(glob[, opts, cb]);复制代码
  • cb:每当监视的文件发生变化时,就会调用这个函数,并且会给它传入一个对象,该对象包含了文件变化的一些信息,type属性为变化的类型,可以是added,changed,deleted;path属性为发生变化的文件的路径。
gulp.watch('js/**/*.js', function(event){    console.log(event.type); //变化类型 added为新增,deleted为删除,changed为改变    console.log(event.path); //变化的文件的路径}); 复制代码

6. task任务

语法:

gulp.task(name[, deps], fn)复制代码
  • name:任务名
  • fn:任务函数

如何控制多个任务执行:

可以通过任务依赖来实现。例如我想要执行one,two,three这三个任务,那我们就可以定义一个空的任务,然后把那三个任务当做这个空的任务的依赖就行了:

gulp.task('default',['one','two','three']);复制代码

:如果任务相互之间没有依赖,则会按照你书写的顺序依次执行,若有依赖,则会先执行依赖的任务。那么问题来了,某个任务所依赖的任务是异步的

gulp并不会等待那个所依赖的异步任务完成,而是会接着执行后续的任务。

举个栗子:

运行结果:

  • 那如果我们想等待异步任务中的异步操作完成后再执行后续的任务,该怎么做呢? 三种实现方法:
  1. 在异步操作完成后执行一个回调函数来通知gulp这个异步任务已经完成,这个回调函数就是任务函数的第一个参数。
    结果:
  2. 定义任务时返回一个流对象。适用于任务就是操作gulp.src获取到的流的情况。
  3. 返回一个promise对象。
var Q = require('q');gulp.task('one', function() {  var deferred = Q.defer();   // 执行异步的操作  setTimeout(function() {    deferred.resolve();  }, 1);  return deferred.promise;}); gulp.task('two',['one'],function(){  console.log('two is done');});复制代码

:这里的Q需要install q 模块,它是一个第三方模块,使用它可以让你的异步代码逻辑看起来更清晰。具体使用自己教程,本篇重点在Gulp。

My Task

通过gulp把我们自己所编写的JS文件合并压缩、CSS文件进行压缩后,并且生成新的文件。

需要下载的插件: CSS压缩gulp-minify-css,文件合并gulp-concat,js压缩插件gulp-uglify,重命名gulp-rename

这里要注意: js如果是es6语法,则要下载gulp-uglify-es进行js压缩

var gulp = require('gulp'),    minifycss = require('gulp-minify-css'),  //CSS压缩    concat = require('gulp-concat'),         // 文件合并    uglify = require('gulp-uglify-es').default,        //js压缩插件    rename = require('gulp-rename');         // 重命名//css压缩gulp.task('minifycss', function() {    return gulp.src('src/css/*.css')         //压缩的文件        .pipe(minifycss())                   //执行压缩        .pipe(gulp.dest('dist/css'));        //输出文件夹});//js合并压缩gulp.task('minifyjs', function() {    return gulp.src('src/js/*.js')        .pipe(concat('all.js'))               //合并所有js到main.js        .pipe(gulp.dest('dist/js'))           //输出main.js到文件夹        .pipe(rename({
suffix: '.min'})) //rename压缩后的文件名 .pipe(uglify()) //压缩 .pipe(gulp.dest('dist/js')); //输出});gulp.task('build', ['minifycss', 'minifyjs']);// 监视文件的变化,当文件有更新时执行build任务gulp.task('watch', function () { gulp.watch(['src/js/*.js', 'src/css/*.css'], ['build']);});gulp.task('default', ['build', 'watch']);复制代码

最后生成的目录结构:(忽略其他文件)

Gulp入门就到这结束了,希望大家可以通过这篇对gulp有了初步的了解,如果有描述不当或者错误的地方请多指教

:本人也是小白,本篇主要参照链接:

转载于:https://juejin.im/post/5c05e80e6fb9a04a0164163b

你可能感兴趣的文章
[数分笔记]用Dedekind切割定理证明确界定理
查看>>
电子商城实录------项目目录的结构搭建及其说明
查看>>
Everyday Update
查看>>
企业内部信息化项目管理之我所见
查看>>
There is an overlap in the region chain修复
查看>>
手动配置网卡配置文件ifcfg-eth0
查看>>
重载(初学)
查看>>
《陶哲轩实分析》——给读者的一点建议
查看>>
python IO编程-StringIO和BytesIO
查看>>
线程同步中的锁
查看>>
Ubuntu 14.04安装Matlab 2013b
查看>>
【百度地图API】如何制作“从这里出发”“到这里去”——公交篇
查看>>
服务器请求
查看>>
java实现屏幕截屏功能
查看>>
实验四--恶意代码技术
查看>>
Golang 并发简介
查看>>
操作系统的启动(以Linux为例)
查看>>
课后作业
查看>>
laravel ORM 命令2
查看>>
java笔记javaweb部分
查看>>