Gulp 自动化工具开发很是方便,便于上手,值得使用。 javascript
gulp是基于NodeJS运行的,因此须要想安装NodeJS. http://nodejs.org/download/css
安装gulphtml
# 安装全局环境
npm install gulp -g #安装本地环境
npm install gulp --save-dev
npm install browser-sync gulp-compass gulp-sass gulp-rename gulp-jshint gulp-uglify gulp-concat gulp-imagemin gulp-cache gulp-connect gulp-minify-css gulp-sourcemaps gulp-notify gulp-livereload gulp-clean gulp-load-plugins gulp-rev-append gulp-make-css-url-version --save-dev
插件可根据本身的需求安装,分别表明:前端
一、编译Sass,生成雪碧图(gulp-compass);java
二、编译sass(gulp-sass);node
三、sass浏览器地图(gulp-sourcemaps);web
四、重命名文件(gulp-rename);npm
五、JS语法检测(gulp-jshint);json
六、JS丑化(gulp-uglify);gulp
七、JS文件合并(gulp-concat);
八、图片压缩(gulp-imagemin);
九、缓存通知(gulp-cache);
十、web服务(gulp-connect);
十一、压缩CSS(gulp-minify-css);
十二、css文件引用URL图片加版本号(gulp-make-css-url-version);
1三、清空文件夹(gulp-clean);
1四、更新通知(gulp-notify);
1五、html文件引用加版本号(gulp-rev-append);
1六、web服务浏览器同步浏览(browser-sync); // 推荐使用这个做为web服务
一、引入插件
var gulp = require('gulp'), compass = require('gulp-compass'), // compass编译Sass, 生成雪碧图
sass = require('gulp-sass'), // sass编译
sourcemaps = require('gulp-sourcemaps'), // sass地图
rename = require('gulp-rename'), // 重命名文件
jshint = require('gulp-jshint'), // JS语法检测
uglify = require('gulp-uglify'), // JS丑化
concat = require('gulp-concat'), // JS拼接
imagemin = require('gulp-imagemin'), // 图片压缩
cache = require('gulp-cache'), // 缓存通知
connect = require('gulp-connect'), // web服务
minifycss = require('gulp-minify-css'), // 压缩CSS
cssver = require('gulp-make-css-url-version'), // css文件引用URL加版本号
clean = require('gulp-clean'), // 清空文件夹
notify = require('gulp-notify'), // 更新通知
rev = require('gulp-rev-append'), // html添加版本号
browserSync = require('browser-sync'), // 浏览器同步
reload = browserSync.reload; // 自动刷新
二、配置开发路径,结构为:
/*****项目结构***** * project(项目名称) * |–node_modules 组件目录 * |–dist 发布环境 * |–css 样式文件(压缩) * |–images 图片文件(压缩图片) * |–js js文件(压缩) * |–index.html 静态文件(压缩html) * |–dev 生产环境 * |–sass sass文件 * |–images 图片文件 * |–js js文件 * |–index.html 静态文件 * |–config.rb Compass配置文件 * |–package.json 项目信息 * |–gulpfile.js gulp任务文件 **/
gulpfile.js配置文件中的路径为:
// 路径变量
var path = { // 开发环境
dev: { html: './dev', js: './dev/js', sass: './dev/sass', css: './dev/css', image: './dev/images' }, // 发布环境
dist: { html: './dist', js: './dist/js', css: './dist/css', image: './dist/images' } };
三、构建gulp执行任务
// 定义web服务模块,增长浏览器同步浏览
gulp.task('browser-sync', function() { browserSync({ server: { baseDir: '.' } }); }); // 建立Compass任务,编译Sass生成雪碧图
gulp.task('compass', function() { gulp.src(path.dev.sass+'/*.scss') .pipe(compass({ config_file: './config.rb', // 配置文件
css: path.dev.css, // 编译路径
sass: path.dev.sass // sass路径
//image: path.dev.image // 图片路径,用于生成雪碧图
})) .pipe(cssver()) // CSS文件引用URl加版本号
.pipe(minifycss()) // 压缩CSS
.pipe(gulp.dest(path.dist.css)) // 发布到线上版本
.pipe(reload({stream: true})); }); // 压缩HTML
gulp.task('html', function() { gulp.src(path.dev.html+"/*.html") .pipe(rev()) // html 引用文件添加版本号
.pipe(gulp.dest(path.dist.html)) .pipe(reload({stream: true})); }); //检查脚本
gulp.task('lint', function() { gulp.src(path.dev.js+'/*.js') .pipe(jshint()) .pipe(jshint.reporter('default')); });// 图片压缩
gulp.task('image', function() { gulp.src(path.dev.image+'/*.*') .pipe(cache(imagemin())) .pipe(reload({stream: true})) .pipe(gulp.dest(path.dist.image)); //.pipe(notify({ message: '图片压缩'}));
}); // 合并压缩JS文件
gulp.task('script', function() { gulp.src(path.dev.js+'/*.js') //.pipe(concat('all.js')) // 合并
//.pipe(gulp.dest(path.dist.js))
//.pipe(rename('all.min.js')) // 重命名
.pipe(uglify()) // 压缩
.pipe(gulp.dest(path.dist.js)) //.pipe(notify({ message: 'JS合并压缩' }))
.pipe(reload({stream: true})); }); // 清空文件夹
gulp.task('clean', function() { gulp.src([path.dist.css, path.dist.js, path.dist.image], {read: false}) .pipe(clean()); }); // 默认任务
gulp.task("default", function() { gulp.run('browser-sync', 'lint', 'compass', 'script', 'image');
// 检测文件发送变化 - 分开监听为了执行对应的命令
gulp.watch(path.dev.html+'/*.*', ['html']); gulp.watch(path.dev.sass+'/*.scss', ['compass']); gulp.watch(path.dev.image+'/**', ['image']); gulp.watch(path.dev.js+'/*.js', ['lint', 'script']); });
注意:html文件引用增长版本号时,须要在html文件引用路径中增长 ?rev=@@hash 方可在编译时,自动添加版本号
<link rel="stylesheet" type="text/css" href="./css/main.css?rev=@@hash">
四、配置浏览器自动刷新问题
使用gulp的browser-sync插件能够实现浏览器自动刷新,同步浏览的功能,建立实现自动刷新,须要启动自动刷新的插件,在引入插件处
var browserSync = require('browser-sync'), // 浏览器同步
reload = browserSync.reload; // 自动刷新
以后,建立browser-sync的task任务,并在gulp的启用。
gulp.task('browser-sync', function() { browserSync({ server: { baseDir: '.' } }); });
baseDir 为默认的服务访问路径,默认访问为 http://localhost:3000, 配置信息为 http://localhost:3001
而后在发生变化要刷新的任务处,添加以下语句便可。详情参考: BrowserSync + Gulp.js
.pipe(reload({stream: true}));
gulpfile.js完整文件以下:
/** * *****组件安装***** * npm install gulp browser-sync gulp-compass gulp-sass gulp-rename gulp-jshint gulp-uglify gulp-concat gulp-imagemin gulp-cache gulp-connect gulp-minify-css gulp-sourcemaps gulp-notify gulp-livereload gulp-clean gulp-load-plugins gulp-rev-append gulp-make-css-url-version --save-dev * * *****项目结构***** * project(项目名称) * |–.svn 经过svn管理项目会生成这个文件夹 * |–node_modules 组件目录 * |–dist 发布环境 * |–css 样式文件(style.css style.min.css) * |–images 图片文件(压缩图片) * |–js js文件(main.js main.min.js) * |–index.html 静态文件(压缩html) * |–dev 生产环境 * |–sass sass文件 * |–images 图片文件 * |–js js文件 * |–index.html 静态文件 * |–config.rb Compass配置文件
* |-package.json 项目信息 * |–gulpfile.js gulp任务文件 **/ // 引入 Gulp插件 var gulp = require('gulp'), compass = require('gulp-compass'), // compass编译Sass, 生成雪碧图 sass = require('gulp-sass'), // sass编译 sourcemaps = require('gulp-sourcemaps'), // sass地图 rename = require('gulp-rename'), // 重命名文件 jshint = require('gulp-jshint'), // JS语法检测 uglify = require('gulp-uglify'), // JS丑化 concat = require('gulp-concat'), // JS拼接 imagemin = require('gulp-imagemin'), // 图片压缩 cache = require('gulp-cache'), // 缓存通知 connect = require('gulp-connect'), // web服务 minifycss = require('gulp-minify-css'), // 压缩CSS cssver = require('gulp-make-css-url-version'), // css文件引用URL加版本号 clean = require('gulp-clean'), // 清空文件夹 notify = require('gulp-notify'), // 更新通知 rev = require('gulp-rev-append'), // html添加版本号 browserSync = require('browser-sync'), // 浏览器同步 reload = browserSync.reload; // 自动刷新 // 路径变量 var path = { // 开发环境 dev: { html: './dev', js: './dev/js', sass: './dev/sass', css: './dev/css', image: './dev/images' }, // 发布环境 dist: { html: './dist', js: './dist/js', css: './dist/css', image: './dist/images' } }; // 定义web服务模块 gulp.task('webserver', function() { connect.server({ livereload: true, port: 8888 }); }); // 定义web服务模块,增长浏览器同步浏览 gulp.task('browser-sync', function() { browserSync({ server: { baseDir: '.' } }); }); // 建立Compass任务,编译Sass生成雪碧图 gulp.task('compass', function() { gulp.src(path.dev.sass+'/*.scss') .pipe(compass({ config_file: './config.rb', // 配置文件 css: path.dev.css, // 编译路径 sass: path.dev.sass // sass路径 //image: path.dev.image // 图片路径,用于生成雪碧图 })) .pipe(cssver()) // CSS文件引用URl加版本号 .pipe(minifycss()) // 压缩CSS .pipe(gulp.dest(path.dist.css)) // 发布到线上版本 .pipe(reload({stream: true})); }); // 压缩HTML gulp.task('html', function() { gulp.src(path.dev.html+"/*.html") .pipe(rev()) // html 引用文件添加版本号 .pipe(gulp.dest(path.dist.html)) .pipe(reload({stream: true})); }); //检查脚本 gulp.task('lint', function() { gulp.src(path.dev.js+'/*.js') .pipe(jshint()) .pipe(jshint.reporter('default')); }); // 图片压缩 gulp.task('image', function() { gulp.src(path.dev.image+'/*.*') .pipe(cache(imagemin())) .pipe(reload({stream: true})) .pipe(gulp.dest(path.dist.image)); //.pipe(notify({ message: '图片压缩'})); }); // 合并压缩JS文件 gulp.task('script', function() { gulp.src(path.dev.js+'/*.js') //.pipe(concat('all.js')) // 合并 //.pipe(gulp.dest(path.dist.js)) //.pipe(rename('all.min.js')) // 重命名 .pipe(uglify()) // 压缩 .pipe(gulp.dest(path.dist.js)) //.pipe(notify({ message: 'JS合并压缩' })) .pipe(reload({stream: true})); }); // 清空文件夹 gulp.task('clean', function() { gulp.src([path.dist.css, path.dist.js, path.dist.image], {read: false}) .pipe(clean()); }); // 默认任务 gulp.task("default", function() { gulp.run('browser-sync', 'lint', 'compass', 'script', 'image'); // 检测文件发送变化 - 分开监听为了执行对应的命令 gulp.watch(path.dev.html+'/*.*', ['html']); gulp.watch(path.dev.sass+'/*.scss', ['compass']); gulp.watch(path.dev.image+'/**', ['image']); gulp.watch(path.dev.js+'/*.js', ['lint', 'script']); });
gulp-compass 合并雪碧图使用的 config.rb 配置文件,内容以下:
# Set this to the root of your project when deployed: http_path = "/" css_dir = "./dev/css" sass_dir = "./dev/sass" images_dir = "./dev/images" javascripts_dir = "./dev/js" # You can select your preferred output style here (can be overridden via the command line): # 合并雪碧图的方式 # output_style = :expanded or :nested or :compact or :compressed # To enable relative paths to assets via compass helper functions. Uncomment: # 相对路径 relative_assets = true # To disable debugging comments that display the original location of your selectors. Uncomment: # line_comments = false # If you prefer the indented syntax, you might want to regenerate this # project again passing --syntax sass, or you can uncomment this: # preferred_syntax = :sass # and then run: # sass-convert -R --from scss --to sass sass scss && rm -rf sass && mv scss sass
在项目目录下执行 gulp
命令就会运行 default
任务,而且启动监听,之因此分开设置监放任务,是为了执行对应命令,若是合并在一块儿执行,会增长编译时间。
一、gulp.task()
gulp模块的task方法,用于定义具体的任务,第一个参数为任务名,第二个参数为任务函数,如image任务,调用直接运行 gulp image
gulp.task('image', function() { console.log('图片任务执行'); });
task方法也能够知道一组任务,如:
gulp.task('default',['html', 'sass', 'js']);
二、gulp.src()
gulp模块的src方法,用于产生数据流,表示要处理的文件,通常有如下几种格式:
src方法的参数能够是一个数组,如:
gulp.src(['./js/*.js', './sass/*.scss']);
三、gulp.watch()
gulp模块的watch方法,用于指点须要监视的文件,一旦文件发生变更,就运行指点任务。
gulp.watch('./js/*.js', ['lint', 'script']);
四、pipe
.pipe为每一个任务的链接,执行完一个任务以后,再次链接执行下一个任务,如:
.pipe(minifycss()) // 压缩CSS
.pipe(gulp.dest(path.dist.css)); // 发布到线上版本
先执行压缩,再发布到线上版本
一、Gulp.js:比 Grunt 更简单的自动化的项目构建利器
二、Gulp使用指南