Gulp 快速入门

一、gulp介绍

gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器;它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成;使用它,我们不仅可以很愉快的编写代码,而且大大提高我们的工作效率。


二、工程化的作用

  1. 自动压缩JS文件
  2. 自动压缩CSS文件
  3. 自动合并文件
  4. 自动编译sass
  5. 自动压缩图片
  6. 自动刷新浏览器

三、Node环境安装

  1. window下,下载node安装即可。 node下载地址:http://nodejs.cn/download/ ,安装比较简单,基本一直下一步即可,安装路径随意。
  2. 安装完成后,终端输入如下命令 显示版本号即安装成功。
  3. node -v

四、gulp安装

(一) 推荐安装cnpm:

因为npm安装插件是从国外服务器下载,受网络影响大,可能出现异常,如果npm的服务器在中国就好了,所以我们乐于分享的淘宝团队干了这事。网址:http://npm.taobao.org

(二) 安装:命令提示符执行

npm install cnpm -g --registry=https://registry.npm.taobao.org

(三) 全局安装gulp

  1. 在com中执行
  cnpm install gulp –g
  1. 查看是否正确安装:命令提示符执行gulp –v,出现版本号即为正确安装

五、gulp插件安装(编译/压缩/合并/代码检查/即时刷新)

(一) 项目文件根目录新建package.json

注:package.json是基于nodejs项目必不可少的配置文件,它是存在项目根目录的普通json文件重点内容

  1. 进入你的项目文件

  2. 执行命令cnpm init来新建package.json

  3. 检测package.json是否成功新建查看项目文件根目录,是否新建package.json,且内容是否和你终端中输入的一致。 package.json内容如下:

{   
  "name": "test", 
  "version": "1.0.0", 
  "description": "我是描述", 
  "main": "index.js", 
  "scripts": {    "test": "echo \"Error: no test specified\" && exit 1"  },  
  "author": "",  
  "license": "ISC"
}

注:可不使用cnpm init方式,可选择手动创建package.json配置文件

  1. 在项目中新建配置文件package.json配置文件是为了将来项目迁移使用,测试demo时,可以不需要
 {
   “name”:”test”, //项目名称(必须)
   “version”: “1.0.0”, //项目版本(必须)
   “description”:”This is for study gulp project!”, //项目描述(必须)
   “author”:{ 
      //项目作者信息 
      “name”:”zzl”,
      “email”:[Hsu@xx.com](mailto:Hsu@xx.com)
    },

 “devDependencies”:{
    //项目依赖的插件,这个不用写,待会装完插件自动生成       
    “gulp”:”^3.8.11”,
    “gulp-less”:”^3.0.0”
  }
}

注:由于json文件里是不能写注释的,所以实际开发的时候,记得把注释去掉

  1. Package.json的作用 当有一个新的项目需要建立,或者有人跟你合作开发时,我们不需要把项目中所有用到的模块(文件大小可能上百兆)都上传到git,只需要给项目带上一个配置文件 而对方拿到项目后,只需要一个命令npm install Node就可以自动读取项目的配置文件,并将所有依赖模块自动下载,这样不是更快捷,更方便吗?

(二) 本地安装gulp插件

注:全局安装gulp是为了执行gulp任务,本地安装gulp则是为了调用gulp插件的功能

(三) 进入你的项目文件路径中后,执行

cnpm install gulp --save-dev

(四) 安装gulp-sass插件(拿该插件进行示例)进入你的项目文件路径中后,执行

cnpm install gulp-sass  --save-dev

(五) 常用插件

  1. sass的编译(gulp-sass

  2. less编译 (gulp-less

  3. 重命名(gulp-rename

  4. 自动添加css前缀(gulp-autoprefixer

  5. 压缩css(gulp-minify-css

  6. js代码校验(gulp-jshint

  7. 合并js文件(gulp-concat

  8. 压缩js代码(gulp-uglify

  9. 压缩图片(gulp-imagemin

  10. 自动刷新页面(gulp-livereload,谷歌浏览器亲测,谷歌浏览器需安装livereload插件)

  11. 图片缓存,只有图片替换了才压缩(gulp-cache

  12. 更改提醒(gulp-notify

(六) 安装以上插件

$ npm install gulp-ruby-sass gulp-autoprefixer gulp-minify-css gulp-jshint gulp-concat gulp-uglify gulp-imagemin gulp-clean gulp-notify gulp-rename gulp-livereload gulp-cache --save-dev

六、gulp使用

(一)创建一个gulpfile.js在根目录下,gulp只有四个API:tast,watch,srcdest

  1. Task:这个API用来创建任务,在命令下可以输入gulp test来执行test任务。

  2. Watch: 这个API用来监听任务。

  3. Src: 这个API设置需要处理的文件的路径,可以是多个文件以数组的形式[main.scss,vender.scss],也可以是正则表达式/**/*.scss

4.Dest: 这个API设置生成文件的路径,一个任务可以有多个生成路径,一个可以输出未压缩的版本,另一个可以输出压缩后的版本

(二) 载入插件

  1. 接下来,我们需要建立一个gulpfile.js档案,并且载入这些插件:
var gulp = require('gulp'), 
sass = require('gulp- sass'),
autoprefixer = require('gulp-autoprefixer'),
minifycss = require('gulp-minify-css'),
jshint = require('gulp-jshint'),
uglify = require('gulp-uglify'),
imagemin = require('gulp-imagemin'),
rename = require('gulp-rename'),
concat = require('gulp-concat'),
notify = require('gulp-notify'),
cache = require('gulp-cache'),
livereload = require('gulp-livereload');

七、 Gulp API

(一) 工作方式

gulp的使用流程一般是:
首先通过gulp.src()方法获取到想要处理的文件流,
然后把文件流通过pipe方法导入到gulp的插件中,
最后把经过插件处理后的流再通过pipe方法导入到gulp.dest()中,gulp.dest()方法则把流中的内容写入到文件中。
例如:

var gulp = require('gulp');
gulp.src('script/jquery.js') // 获取流的api
.pipe(gulp.dest('dist/foo.js')); // 写放文件的api

(二)globs的匹配规则

我们重点说说gulp用到的globs的匹配规则以及一些文件匹配技巧,我们将会在后面用到这些规则。  gulp内部使用了node-glob模块来实现其文件匹配功能。我们可以使用下面这些特殊的字符来匹配我们想要的文件:

匹配符 说明
* 匹配文件路径中的0个或多个字符,但不会匹配路径分隔符,除非路径分隔符出现在末尾
** 匹配路径中的0个或多个目录及其子目录,需要单独出现,即它左右不能有其他东西了。如果出现在末尾,也能匹配文件。
? 匹配文件路径中的一个字符(不会匹配路径分隔符)
[...] 匹配方括号中出现的字符中的任意一个,当方括号中第一个字符为^或!时,则表示不匹配方括号中出现的其他字符中的任意一个,类似js正则表达式中的用法
!(pattern|pattern|pattern) 匹配任何与括号中给定的任一模式都不匹配的
?(pattern|pattern|pattern) 匹配括号中给定的任一模式0次或1次,类似于js正则中的(pattern|pattern|pattern)?
+(pattern|pattern|pattern) 匹配括号中给定的任一模式至少1次,类似于js正则中的(pattern|pattern|pattern)+
*(pattern|pattern|pattern) 匹配括号中给定的任一模式0次或多次,类似于js正则中的(pattern|pattern|pattern)*
@(pattern|pattern|pattern) 匹配括号中给定的任一模式1次,类似于js正则中的(pattern|pattern|pattern)

下面以例子来加深理解

匹配符 能匹配 不能匹配
*.* 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.js
a/**/z a/z, a/b/z ,a/b/c/z, a/d/g/h/j/k/z
a/**b/z a/b/z,a/sb/z, a/x/sb/z, 因为只有单**单独出现才能匹配多级目录
?.js a.js,b.js,c.js
a?? 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

(三) src:获取流(源文件路径)

gulp.src()方法正是用来获取流的,但要注意这个流里的内容不是原始的文件流,而是一个虚拟文件对象流(Vinyl files),这个虚拟文件对象中存储着原始文件的路径、文件名、内容等信息。其语法为:gulp.src(globs[, options]);
globs参数是文件匹配模式(类似正则表达式),用来匹配文件路径(包括文件名),当然这里也可以直接指定某个具体的文件路径。当有多个匹配模式时,该参数可以为一个数组;类型为StringArray。当有多种匹配模式时可以使用数组

//使用数组的方式来匹配多种文件
gulp.src(['js/\*.js', 'css/*.css', '\*.html'])

(四) dest:写文件(目标文件路径)

gulp.dest()方法是用来写文件的,其语法为:

gulp.dest(path[,options])

path为写入文件的路径

(五) watch:监听文件

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

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

如:

gulp.task(“one”,function(){

});
gulp.task(“two”,function(){
});
gulp.watch('js/\*\*/*.js', [“one”,”two”]);

(六) task:定义任务

gulp.task方法用来定义任务,其语法为:

gulp.task(name[, deps], fn)

name任务名
deps 是当前定义的任务需要依赖的其他任务,为一个数组。当前定义的任务会在所有依赖的任务执行完毕后才开始执行。如果没有依赖,则可省略这个参数;
fn任务函数,我们把任务要执行的代码都写在里面。该参数也是可选的。
当你定义一个简单的任务时,需要传入任务名字执行函数两个属性。
如:

gulp.task('greet', function () {
     console.log('Hello world!');
});

八、 结合sass的使用

(一) 建立任务

  1. 编译sass,Autoprefix缩小化
  2. 首先,我们设置编译Sass。我们将编译Sass、接着通过Autoprefixer,最后储存结果到我们的目的地。接着产生一个缩小化的.min版本自动重新整理页面通知任务已经完成
gulp.task('styles', function() {  
//编译sass
  return gulp.src('src/styles/main.scss')
    .pipe(sass({ style: 'expanded' }))
//添加前缀
    .pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4'))
//保存未压缩文件到我们指定的目录下面
    .pipe(gulp.dest('dist/assets/css'))
//给文件添加.min后缀
    .pipe(rename({suffix: '.min'}))
//压缩样式文件
    .pipe(minifycss())
//输出压缩文件到指定目录
    .pipe(gulp.dest('dist/assets/css'))
//提醒任务完成
    .pipe(notify({ message: 'Styles task complete' }));
});
  1. 说明:
    gulp.task('styles', function() { ... )};
    这个gulp.taskAPI用来建立任务。可以透过终端机输入$ gulp styles指令来执行上述任务。
  2. return gulp.src('src/styles/main.scss') 用来定义一个或多个来源档案。
  3. .pipe(sass({ style: 'expanded' })) 使用pipe()来找到哪个插件
  4. .pipe(gulp.dest('dist/assets/css')); 这个是用来设定目的路径

(二) JS代码校验、合并和压缩

//发布任务
gulp.task(“scripts”,function(){
     //js代码校验
     return gulp.src(“javascripts/*.js”)
     .pipe(jshint())
     .pipe(jshint.reporter(“default”))
     //js代码合并
     .pipe(concat(“all.js”))
     //给文件添加.min后缀
     .pipe(rename({suffix:”.min”}))
     //压缩脚本文件
     .pipe(uglify())
     //输出压缩文件到指定目录
     .pipe(gulp.dest(“assets”))
     //提醒任务完成
     .pipe(notify({message : “Scripts task complete”}));
});

(三) 图片压缩

Gulp.task(“images”,function(){
    return gulp.src(“images/*”)
      .pipe(cache(imagemin({optimizationLeve1: 3,progressive:true, interlaced:true})))
      .pipe(gulp.dest(“images”))
      .pipe(notify({message : “Images task complete”}));
});

(四) 事件监听

Gulp.task(“watch”,function(){
   gulp.watch(“stylesheets/\*.scss”,[‘styles’]);
   gulp.watch(“javascripts/\*.js”,[“scripts”]);
   gulp.watch(“images/\*”,[‘images’]);
   livereload.listen();
   gulp.watch([“assets/\*”]).on(“change”,livereload.changed);
});

(五) 运行

  1. Gulp default
  2. Gulp watch
  3. 运行整个任务gulp

(六) 总结

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

推荐阅读更多精彩内容

  • gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学...
    MC丶逗逼嘿阅读 672评论 0 3
  • Gulp使用node.js流,由于它不需要将临时文件/文件夹写入磁盘,构建起来速度更快。Gulp允许你输入你的源文...
    vincent_z阅读 447评论 0 1
  • gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学...
    井皮皮阅读 1,292评论 0 10
  • Sass&Gulp 一、sass介绍 (一) SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计...
    锋享前端阅读 1,494评论 0 3
  • 1、gulp的安装 首先确保你已经正确安装了nodejs环境。然后以全局方式安装gulp: npm install...
    F_imok阅读 2,365评论 1 11