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,如今就能夠實時的保存,瀏覽器會實時的刷新,很是爽~