gulp是基于Nodejs的自动任务运行器, 她能自动化的完成javascript
、coffee
、sass
、less
、html
、image
、css
等文件的的测试、检查、合并、压缩、格式化、浏览器自动刷新、部署文件生成,并监听文件在改动后重复指定的步骤。在实现上,她借鉴了Unix操作系统的管道(pipe)思想,前一级的输出,直接变成后一级的输入,使得在操作上非常简单。通过本文,我们将学习如何使用Gulp来改变开发流程,从而使开发更加快速高效。
browserSync能让浏览器实时快速的响应文件的更改(htm、js、css),并自动刷新页面,更重要的是browserSync可以同时在pc、平板、手机等设备下进行调试。任何一次代码保存,浏览器设备都会同时显示您的改动。
gulp
gulp是基于nodejs的,所以我们可以用npm安装,首先需要项目中有npm的package.json
文件,如果没有,就先初始化:
在项目中安装gulp:
1
| npm install gulp-less --save-dev
|
如果安装成功了,在package.json
中会存在如下节点:
1 2 3 4 5 6
| { "devDependencies": { "gulp": "^3.9.1" } }
|
在根目录下创建文件gulpfile.js
:
1 2 3 4 5
| var gulp = require('gulp');
gulp.task('default', function(){ console.log('test'); });
|
我们创建了一个默认的gulp任务,在项目的终端输入命令:gulp
,会运行这个gulp命令,并输出对应的test
。
解析less并压缩合并
项目中使用less编写样式非常的流利,但是浏览器不懂less的语法,我们需要把less解释为css才可以在浏览器里使用。
我们这里用gulp-less
来把less
解释成css
,用gulp-minify-css
来压缩css
,用gulp-concat
将多个css合并为一个css文件,节省流量。
安装依赖:
1 2 3
| npm install gulp-less --save-dev npm install gulp-minify-css --save-dev npm install gulp-concat --save-dev
|
然后创建任务编译Less:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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会越来越多,但是代码量不是很多,依次下载也会耗费多余的流量,所以把js进行压缩打包也是不错的选择。
打包需要用到的插件:
gulp-ng-annotate
:但是当打包angular项目的时候,压缩的js会破坏angular的依赖注入,而gulp-ng-annotate
解决的就是angular中依赖注入的问题。
gulp-uglify
:压缩js
gulp-sourcemaps
:生成source map。简单说,source map就是一个信息文件,里面储存着位置信息。也就是说,转换后的代码的每一个位置,所对应的转换前的位置。
依次安装:
1 2 3
| npm install gulp-uglify --save-dev npm install gulp-ng-annotate --save-dev npm install gulp-sourcemaps --save-dev
|
创建gulp的打包js的任务:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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')); });
|
创建个启动任务:
1 2
| gulp.task('serve',['less', 'js'], function(){ });
|
当在终端执行命令gulp serve
之后,会运行less
和js
任务。
browserSync
每次修改后都需要去手动到浏览器里刷新才看到显示结果,对于调试来讲是很痛苦的。幸运的是,有browserSync
这个插件可以让代码保存后自动刷新。
依赖
browser-sync
:让浏览器自动刷新
opn
:跨平台 ) 打开文件,网站,可执行文件等。
安装
1 2
| npm install browser-sync --save-dev npm install opn --save-dev
|
创建一个静态服务器:
1 2 3 4 5 6 7 8 9 10
| browserSync.init({ server:{ baseDir: path.src }, port:3000, open:false }, function(){ var homepage = 'http://localhost:3000/'; opn(homepage); });
|
这样就创建了一个静态资源服务器,端口为3000,并默认打开首页。
browserSync.stream() 方法返回一个变换流,将输出的文件注入到浏览器,比如前面的less任务,添加语句让任务成功之后,将打包好的文件注入到浏览器。
1 2 3 4 5 6
| gulp.task('less', function(){ gulp.src(path.less) .pipe(less()) .pipe(gulp.dest('./src/css')) .pipe(browserSync.stream()); });
|
可以和gulp任务结合,当任务结束后静态注入或者刷新浏览器。
1 2 3 4 5 6 7
| gulp.watch(path.less, ['less']); gulp.watch(path.js, ['js']);
gulp.watch([path.html, path.js]).on("change", function() { browserSync.reload(); });
|
汇总
全部的依赖package.js
:
1 2 3 4 5 6 7 8 9 10
| "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
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| var gulp = require('gulp'); var concat = require('gulp-concat');
var less = require('gulp-less');
var minifyCss = require('gulp-minify-css');
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: './' };
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); });
gulp.watch(path.less, ['less']);
gulp.watch(path.js, ['js']); gulp.watch([path.html, path.js]).on("change", function() { browserSync.reload(); }); });
|
ok,现在就可以实时的保存,浏览器会实时的刷新,非常爽~