gulp是基于Nodejs的自动任务运行器, 她能自动化的完成javascript
、coffee
、sass
、less
、html
、image
、css
等文件的的测试、检查、合并、压缩、格式化、浏览器自动刷新、部署文件生成,并监听文件在改动后重复指定的步骤。在实现上,她借鉴了Unix操做系统的管道(pipe)思想,前一级的输出,直接变成后一级的输入,使得在操做上很是简单。经过本文,咱们将学习如何使用Gulp来改变开发流程,从而使开发更加快速高效。javascript
browserSync能让浏览器实时快速的响应文件的更改(htm、js、css),并自动刷新页面,更重要的是browserSync能够同时在pc、平板、手机等设备下进行调试。任何一次代码保存,浏览器设备都会同时显示您的改动。css
gulp是基于nodejs的,因此咱们能够用npm安装,首先须要项目中有npm的package.json
文件,若是没有,就先初始化:html
npm install
在项目中安装gulp:java
npm install gulp-less --save-dev
若是安装成功了,在package.json
中会存在以下节点:node
// 省去了多余的 { "devDependencies": { "gulp": "^3.9.1" } }
在根目录下建立文件gulpfile.js
:npm
var gulp = require('gulp'); gulp.task('default', function(){ console.log('test'); });
咱们建立了一个默认的gulp任务,在项目的终端输入命令:gulp
,会运行这个gulp命令,并输出对应的test
。json
项目中使用less编写样式很是的流利,可是浏览器不懂less的语法,咱们须要把less解释为css才能够在浏览器里使用。gulp
咱们这里用gulp-less
来把less
解释成css
,用gulp-minify-css
来压缩css
,用gulp-concat
将多个css合并为一个css文件,节省流量。浏览器
安装依赖:sass
npm install gulp-less --save-dev npm install gulp-minify-css --save-dev npm install gulp-concat --save-dev
而后建立任务编译Less:
var gulp = require('gulp'); var concat = require('gulp-concat'); var gulpless = require('gulp-less'); var minifycss = require('gulp-minify-css'); var path = { less: './less/*.less' }; gulp.task('less', function(){ gulp.src(path.less) .pipe(gulpless()) .pipe(minifycss()) .pipe(concat('build.min.css')) .pipe(gulp.dest('./css')); });
而后在终端运行命令:gulp less
,稍等几秒就能够看到将less文件夹下面的less打包并合并到css文件夹下,名字为:build.min.css
。
上面的命令能够解释为:建立任务less,将文件path.less
表明的文件先运行任务gulpless()
解析为css,而后继续将结果运行minifycss()
任务进行压缩,而后将压缩后的css文件合并到build.min.css
中,最后将这个文件输出到css文件夹下。
项目中的js会愈来愈多,可是代码量不是不少,依次下载也会耗费多余的流量,因此把js进行压缩打包也是不错的选择。
打包须要用到的插件:
gulp-ng-annotate
:可是当打包angular项目的时候,压缩的js会破坏angular的依赖注入,而gulp-ng-annotate
解决的就是angular中依赖注入的问题。gulp-uglify
:压缩jsgulp-sourcemaps
:生成source map。简单说,source map就是一个信息文件,里面储存着位置信息。也就是说,转换后的代码的每个位置,所对应的转换前的位置。依次安装:
npm install gulp-uglify --save-dev npm install gulp-ng-annotate --save-dev npm install gulp-sourcemaps --save-dev
建立gulp的打包js的任务:
// 压缩js var annotate = require('gulp-ng-annotate'); var uglify = require('gulp-uglify'); var sourcemaps = require('gulp-sourcemaps'); var path = { less: './less/*.less', js: './js/*.js', }; gulp.task('js', function () { return gulp.src(path.js) .pipe(annotate({single_quotes: true})) .pipe(uglify()) .pipe(concat('build.min.js')) .pipe(sourcemaps.write()) .pipe(gulp.dest('./src/js')); });
建立个启动任务:
gulp.task('serve',['less', 'js'], function(){ });
当在终端执行命令gulp serve
以后,会运行less
和js
任务。
每次修改后都须要去手动到浏览器里刷新才看到显示结果,对于调试来说是很痛苦的。幸运的是,有browserSync
这个插件可让代码保存后自动刷新。
依赖
browser-sync
:让浏览器自动刷新opn
:跨平台 ) 打开文件,网站,可执行文件等。安装
npm install browser-sync --save-dev npm install opn --save-dev
建立一个静态服务器:
browserSync.init({ server:{ baseDir: path.src }, port:3000, open:false }, function(){ var homepage = 'http://localhost:3000/'; opn(homepage); });
这样就建立了一个静态资源服务器,端口为3000,并默认打开首页。
browserSync.stream() 方法返回一个变换流,将输出的文件注入到浏览器,好比前面的less任务,添加语句让任务成功以后,将打包好的文件注入到浏览器。
gulp.task('less', function(){ gulp.src(path.less) .pipe(less()) .pipe(gulp.dest('./src/css')) .pipe(browserSync.stream()); });
能够和gulp任务结合,当任务结束后静态注入或者刷新浏览器。
// 编译完less后,无刷新方式更新页面 gulp.watch(path.less, ['less']); gulp.watch(path.js, ['js']); // 修改页面和js后,页面刷新,从新加载 gulp.watch([path.html, path.js]).on("change", function() { browserSync.reload(); });
所有的依赖package.js
:
// 省略多余的 "devDependencies": { "gulp": "^3.9.1", "gulp-concat": "^2.6.1", "gulp-less": "^3.3.0", "gulp-minify-css": "^1.2.4", "gulp-ng-annotate": "^2.0.0", "gulp-sourcemaps": "^2.6.1", "gulp-uglify": "^3.0.0", },
gulp任务gulpfile.js
:
// 引入定义工具 var gulp = require('gulp'); var concat = require('gulp-concat'); // less 编译用到 var less = require('gulp-less'); // 压缩css var minifyCss = require('gulp-minify-css'); // 压缩js var annotate = require('gulp-ng-annotate'); var uglify = require('gulp-uglify'); var sourcemaps = require('gulp-sourcemaps'); // 动态刷新 var browserSync = require('browser-sync'); var opn = require('opn'); // 定义路径 var path = { less: './src/app/components/**/*.less', css: './src/css/**/*.css', js: './src/app/**/*.js', html: './src/app/components/**/*.html', src: './' }; //合并html模板命令--gulp template var templateCache = require('gulp-angular-templatecache'); gulp.task('template', function () { gulp.src(path.html) .pipe(templateCache({module: 'templates'})) .pipe(gulp.dest('./src/js')); }); gulp.task('less', function(){ gulp.src(path.less) .pipe(less()) .pipe(minifyCss()) .pipe(concat('build.min.css')) .pipe(gulp.dest('./src/css')) .pipe(browserSync.stream()); }); gulp.task('js', function () { return gulp.src(path.js) .pipe(annotate({single_quotes: true})) .pipe(uglify()) .pipe(concat('build.min.js')) .pipe(sourcemaps.write()) .pipe(gulp.dest('./src/js')); }); gulp.task('serve',['less', 'js'], function(){ browserSync.init({ server:{ baseDir: path.src }, port:3000, open:false }, function(){ var homepage = 'http://localhost:3000/'; opn(homepage); }); // 编译完less后,无刷新方式更新页面 gulp.watch(path.less, ['less']); gulp.watch(path.js, ['js']); // 修改页面和js后,页面刷新,从新加载 gulp.watch([path.html, path.js]).on("change", function() { browserSync.reload(); }); });
ok,如今就能够实时的保存,浏览器会实时的刷新,很是爽~