# gulp
gulp是当下最流行的自动化工具,可以自动化完成我们开发过程中大量的重复工作。
为什么要用自动化构建工具? 主要是用来自动完成一系列重复的操作,如:
- 编译:
- less->css
- sass->css
- coffeescript->js
- es6->es5
- 合并: css, js
- 压缩 :css, js, html
- 优化:图片优化
# 安装与运行
前提是安装了nodejs环境
- 全局安装 gulp
npm install --global gulp
说明:全局安装gulp目的是为了通过它执行gulp任务
本地安装gulp
作为项目的开发依赖(devDependencies)安装npm install --save-dev gulp
- 本地安装gulp是为了调用gulp插件的功能,
- –save-dev 保存配置信息至 package.json 的 devDependencies 节点
- 这步操作前先新建package.json文件(npm init)
- 这步完成后就可以安装各种gulp插件了
创建gulpfile.js文件
在项目根目录下创建一个名为 gulpfile.js 的文件(重要)
说明:gulpfile.js是gulp项目的配置文件,是位于项目根目录的普通js文件,内容如下:var gulp = require('gulp'); gulp.task('default', function() { // 将你的默认的任务代码放在这 });
运行 gulp
在命令行执行以下命名,如果不写任务名称,则自动运行default任务(如果有)gulp <任务名称>
# gulp工作流程
- 选通过 gulp.src() 方法获取到想要处理的文件,并返回文件流
- 然后文件流通过 pipe 方法导入到 gulp 的插件中
- 经过插件处理后的文件流再通过pipe方法导入到 gulp.dest() 方法中
- 最后通过gulp.dest() 方法把流中的内容写入到文件中
PS:文件流=>文件在内存中的状态
# gulp API
- 创建任务
gulp.task('buildsass',function(){ });
- 匹配要处理的文件
gulp.src(globs[, options])
- globs匹配语法:https://github.com/isaacs/node-glob
- options 有3个属性buffer、read、base
- 输出文件
gulp.dest(path[, options])
把文件流中的内容中输出到指定目录 - 监听文件修改,并执行相应任务
- gulp.watch(glob [, opts], tasks)
- gulp.watch(glob [, opts, cb])
# gulp插件
大部分插件都可以在http://www.npmjs.com找到,任何插件的使用都要经历以下三步:
- 安装插件:npm
npm install --save gulp-htmlmin
PS:可一次性安装多个插件,插件间用空格隔开
- 引包:require()
var htmlmin = require('gulp-htmlmin')
- 使用:pipe()
gulp.task('htmlmin',function(){
gulp.src('src/html/*.html')
.pipe(htmlmin())
.pipe(gulp.dest('dist/html'));
});
# 常用gulp插件
- htmml压缩:gulp-htmlmin
- css压缩:gulp-clean-css
- js压缩:gulp-uglify
- 合并文件:gulp-concat
- 文件重命名:gulp-rename
- 编译Sass: gulp-sass
- 编译 Less:gulp-less
# 其他常用插件
- 浏览器同步测试:browser-sync
- 创建node服务器:http-server
# globs语法
globs需要处理的源文件匹配符路径,语法如下
- 匹配单个文件:
gulp.src('src/js/index.js')
- 匹配多个文件:
gulp.src(['src/js/index.js','src/js/detail.js'])
//多个文件以数组形式传入 - 匹配所有文件
gulp.src('src/js/*.js')
- 匹配符:
!
:排除文件,*
:匹配所有文件,**
:匹配0个或多个子文件夹,{}
:匹配多个属性
# 使用案例
- 压缩src/js目录下的所有js文件
- 除了test1.js和test2.js(**匹配src/js的0个或多个子文件夹)
gulp.src(['src/js/*.js', '!src/js/**/{test1,test2}.js'])