通常一个前端构建流程包括:
- 文件清理: gulp-clear
- 文件拷贝: gulp-copy
- 文件转换: gulp-webpack
- 文件合并: gulp-concat
- 文件压缩: gulp-minify
- 文件服务: gulp-connect
- 文件监控: gulp-watch
- css 相关:
- less, sass 转换(gulp-less, gulp-sass)
- css 自动添加前缀(gulp-autoprefixer)
- js 相关:
- jslint(gulp-jshint)
- html 转换
- html 模板(gulp-jade, gulp-ejs)
- html prettify
- html validator
- html min
Gulp 通过定义gulpfile.js
配置文件的方式定义流程, gulp.js 会通过调用 Node.js 来执行流程.
引入插件
var gulp = require("gulp"), ...
`</pre>
### 设定路径
<pre>`var paths = {
styles:{
src: "src/styles/**/*.less",
dest: "assets/styles/"
},
scripts:{
src: "src/scripts/**/*.js",
dest: "assets/scripts/"
}
};
`</pre>
### 设定任务
<pre>`gulp.task("taskName", function(){
gulp.src(paths.styles.src)
.pipe(task())
.pipe(gulp.dest(paths.styles.dest));
});
`</pre>
一个 gulpfile.js 文件只是一个 Node 程序, 在 gulpfile 中可以使用任何 npm 中的模块或者其他 Node.js
并非所有的任务都是基于流, 例如删除文件
<pre>`function clean(){
//del 也可以和 gulp.src 一样基于模式匹配的文件路径定义方式
return del(["assets"]);
}
`</pre>
如果要控制 task 顺序, 可以通过回调函数实现
gulp.task(taskName, function(fn){})
现在新增加了串行和并行 API
- gulp.parallel: 并行执行
- gulp.series: 串行执行
e.g.
<pre>`gulp.task("one", function(done){
//do stuff
done(); //回调函数
})
gulp.task("two", function(done){
//do stuff
done();
});
//并行执行任务, 执行完后可以添加回调函数
gulp.task("parallelTask", gulp.parallel("one", "two", function(done){
done();
}));
//串行任务
gulp.task("seriesTask", gulp.series("one", "two", function(done){
done();
}));
`</pre>
### 前端常用插件
gulp-sass: 编译 SASS
browser-sync: 保持多浏览器, 多设备同步
gulp-imagemin: 压制 png/jpg/git/svg 图片
gulp-minify-css: 压缩 CSS
gulp-rename
gulp-concat: 合并 JS
gulp-uglify: 压缩 JS
gulp-autoprefixer: 添加前缀
gulp-css-spriter: 生成雪碧图
gulp-htmlmin
gulp-server-livereload
拥有 live-reloading 的服务器
使用 BrowserSync 和 gulp, 你可以轻松创建一个开发服务器, 然后同一个 WiFi 中的任何设备都可以方便访问.
BrowserSync 同时集成了 live-reload, 所以不需要做另外的配置.首先安装模块
npm install brower-sync --save-dev
假设目前目录结构为`gulpfile.js app/ styles/ main.css scripts/ main.js index.html `
配置 gulpfile.js, 将 app 目录中的文件加入到服务器中, 并且所有的浏览器会在文件发生变化后自动刷新
`var gulp = requrie("gulp"); var browserSync = require("browser-sync").create(); var reload = browerSync.reload; //监视文件改动并重新载入 gulp.task("browser-sync", function(){ browserSync.init({ server:{ baseDir: 'app' } }); gulp.watch(['*.html', 'styles/**/*.css', 'scripts/**/*.js'], {cwd: 'app'}, browserSync.reload); }); `
CSS 预处理
指定浏览器无需刷新即可重载 CSS
假设目录如上`var gulp = require("gulp"); var sass = require("gulp-ruby-sass"); var browserSync = require("browser-sync").create(); gulp.task("sass", function(){ return sass("styles/**/*.scss") .pipe(gulp.dest("app/css") .pipe(reload({stream:true})); {); /* gulp.task("sass", function(){ gulp.src("styles/**/*.scss") .pipe(sass({outputstyle: 'compressed'}).on('error',sass.logError)) .pipe(gulp.dest("app/css"); }); */ gulp.task("browser-sync", ["sass"], function(){ browserSync({ server: { baseDir: "app"; } }); gulp.watch("app/styles/**/*.scss", ["sass"], browserSync.reload); });
设置tunnel: true
来使用一个公开的 URL 来访问本地站点