gulp.js是一个自动化构建工具,开发者可以使用它在项目开发过程中自动执行常见任务。Gulp是基于Node.js构建的,利用 Node.js 流的威力,你可以快速构建项目并减少频繁的 I/O 操作。Gulp.js 源文件和你用来定义任务的 Gulp 文件都是通过 JavaScript源码来实现的。
Gulp侧重于前端开发的整个过程的控制管理(像是流水线),我们可以通过给gulp配置不同的task(通过Gulp中的gulp.task()方法配置,比如启动server、sass/less预编译、文件的合并压缩等等)来让gulp实现不同的功能,从而构建整个前端开发流程。
首先gulp是依赖在node环境下的。关于Node的环境安装这里就不在赘述。
全局安装gulp:
npm install -g gulp
首先初始化package.json
npm init -y
在项目中安装gulp
npm i --save-dev gulp // --save-dev或者—D都表示作为开发依赖进行安装
**注意:**全局安装的gulp只是让您的系统(电脑)增加了一个叫做gulp的命令,这个命令会调用当前目录下的 gulpfile.js 文件,并根据该文件的内容来执行相应的任务,而真正起到提供API功能的却是本地安装的gulp。
gulp所处理的任务大多都是以插件的形式存在的,所以在使用前,需要先安装我们需要的一些插件到项目中
这里列举一些常用的插件:
- gulp-rename:重命名文件
- gulp-concat:合并文件
- gulp-filter:过滤文件
- gulp-uglify:压缩Js
- gulp-csso:压缩优化CSS
- gulp-html-minify:压缩HTML
- gulp-imagemin:压缩图片
- gulp-zip:zip压缩文件
- gulp-autoprefixer:自动为css添加浏览器前缀
- gulp-sass:编译sass
- gulp-babel:将ES6代码编译成ES5
这里将本文所用到的插件都安装进去:
cnpm i gulp gulp-less gulp-sass gulp-imagemin gulp-concat gulp-connect gulp-content-includer gulp-jslint gulp-minify-css gulp-uglify gulp-watch gulp-rename gulp-autoprefixer gulp-run-sequence -S-dev
这里可以看到package.json中已经有了相关依赖
"dependencies": {
"gulp": "^4.0.2",
"gulp-autoprefixer": "^7.0.1",
"gulp-concat": "^2.6.1",
"gulp-connect": "^5.7.0",
"gulp-content-includer": "^0.0.7",
"gulp-imagemin": "^7.1.0",
"gulp-jslint": "^1.0.10",
"gulp-less": "^4.0.1",
"gulp-minify-css": "^1.2.4",
"gulp-rename": "^2.0.0",
"gulp-run-sequence": "^0.3.2",
"gulp-sass": "^4.1.0",
"gulp-uglify": "^3.0.2",
"gulp-watch": "^5.0.1"
}
}
该文件需要配置在项目根目录下,作用是配置Gulp。文件名必须为gulpfile.js,否则无法执行。
接着我们可以学习几个关于gulp的api,方便我们继续往下看:
// 定义一个 task,声明它的名称, 任务依赖, 和任务内容.
gulp.task(name[, deps], fn)
// 读取文件,参数为文件路径字符串或数组, 支持通配符.
gulp.src(globs[, options])
// 写入文件, 作为pipe的一个流程.文件夹不存在时会被自动创建.
gulp.dest(path[, options])
// 监控文件,执行任务.
gulp.watch(glob [, opts], tasks) or gulp.watch(glob [, opts, cb])
创建一个简单的实例:
var gulp = require('gulp');
gulp.task('default', function() {
// 将你的默认的任务代码放在这
});
想要执行只需要在终端输入:gulp default/gulp(名称为default时可省略名称)
学习完后我们来正式开始配置一些复杂的任务。
const GulpClient = require("gulp");
const autoPrefixer = require("gulp-autoprefixer");
const less = require("gulp-less");
const minifyCSS = require("gulp-minify-css");
const rename = require("gulp-rename");
const sass = require('gulp-sass');
const concat = require('gulp-concat');
const GulpUglify = require("gulp-uglify");
const imagemin = require("gulp-imagemin");
const runsequence = require('gulp-run-sequence');
const connect = require('gulp-connect');
需要用到的插件:
// 编译less文件
GulpClient.task('less',() => {
return GulpClient.src('./css/**/*.less')
.pipe(less())//编译less
.pipe(minifyCSS())//简化css
.pipe(autoPrefixer({
overrideBrowserslist: ['last 2 version'], // 兼容最新的两个版本
cascade: false
}))
.pipe(rename({
suffix: '.min' // 将压缩后的css文件名添加上.min
}))
.pipe(GulpClient.dest('dist/css'))
})
GulpClient.task('sass',() => {
return GulpClient.src('./css/**/*.{sass,scss}')
.pipe(sass())
.pipe(minifyCSS())
.pipe(rename({
suffix:'.min'
}))
.pipe(GulpClient.dest('dist/css'))
})
GulpClient.task('css',() => {
return GulpClient.src('./css**/*.css')
.pipe(minifyCSS())
.pipe(rename({
suffix:'.min'
}))
.pipe(GulpClient.dest('dist/css'))
})
GulpClient.task('js',() => {
return GulpClient.src('./js/**/*.js')
.pipe(concat('vender.js'))//合并
.pipe(GulpUglify())//丑化
.pipe(GulpClient.dest('./dist/js'))//目标文件
})
GulpClient.task('images',() => {
return GulpClient.src('./img/**/*.{jpg,png,gif}')
.pipe(imagemin())//压缩图片
.pipe(GulpClient.dest('./dist/img'))
})
GulpClient.task('data',() => {
return GulpClient.src('./data/**/*.{json,xml}')
.pipe(imagemin())//压缩图片
.pipe(GulpClient.dest('./dist/data'))
})
GulpClient.task('copy-index',() => {
return GulpClient.src('index.html')
.pipe(GulpClient.dest('./dist/'))
})
直接在终端运行gulp build即可
GulpClient.task('build',GulpClient.series(['less','sass','css','js','images','data','copy-index','html']),() => {
runsequence('concat');
console.log('编译成功');
})
GulpClient.task('watch',async () => {
GulpClient.watch('./css/**/*.less',GulpClient.series(['less']))
GulpClient.watch('./css/**/*.{sass,scss}',GulpClient.series(['sass']))
GulpClient.watch('./css**/*.css',GulpClient.series(['css']))
GulpClient.watch('./js/**/*.js',GulpClient.series(['js']))
GulpClient.watch('./img/**/*.{jpg,png,gif}',GulpClient.series(['images']))
GulpClient.watch('./data/**/*.{json,xml}',GulpClient.series(['data']))
GulpClient.watch('index.html',GulpClient.series(['copy-index']))
GulpClient.watch('./html/**/*.html',GulpClient.series(['html']))
})
GulpClient.task('server',async () => {
connect.server({
root:'dist',
livereload:'true'//热加载
})
})
GulpClient.task('default',GulpClient.series('build','server'))