gulp
做爲一個自動化構建工具,在前端開發中大大的提升了開發效率,前端開發者們能夠利用他減小許多繁複無腦的操做。
這裏簡單構建一個小環境,就能夠在之後的學習中,直接新建各類test.html測試咱們新學習的知識點啦~
【看不明白的,有疏漏的,歡迎指出,我更改措辭或者bug】css
入門就不講了,會用npm
的同窗應該都清楚,這裏貼一個既有的官方指南。gulp入門指南html
詳細的配置我就不講了,api文檔戳進去看。簡單作點通俗的講解。前端
gulp是由每一個小task組成的,咱們能夠相似函數同樣,把咱們須要的一個個小功能以各類task分開寫,而後能夠在cmd
裏使用gulp <task> <othertask>
方式來執行。node
固然任務多了,咱們就須要一鍵執行全部操做,因此通常狀況下,咱們只運行 gulp
命令,則會執行所註冊的名爲 default 的 task,而後在default這個任務後面,添加咱們寫好的其它task名的數組,則會挨個執行咱們寫好的各類task。否則只執行function。
若是沒有default
這個 task,那麼gulp
命令會報錯。npm
gulp.task('default', function() { // 將你的默認的任務代碼放在這 });
注意: 默認的,task 將以最大的併發數執行,也就是說,gulp 會一次性運行全部的 task 而且不作任何等待。若是你想要建立一個序列化的 task 隊列,並以特定的順序執行,嗯,戳文檔api文檔。gulp
其實說白了就是匹配咱們要處理的文件,src就是路徑。api
gulp.src('client/templates/*.jade')
*
天然是表示任意,所有。glob
請參考 node-glob
語法 或者,你也能夠直接寫文件的路徑。數組
其實就是把src匹配到的文件傳遞到後面來執行。括號裏就是咱們要進行的各類操做。瀏覽器
有點相似js語法,不難理解,用.
接起來,一步步執行。
通常咱們會一行行寫,可讀性好點,寫一行不友好。併發
gulp.src('client/templates/*.jade') .pipe(jade()) .pipe(minify()) .pipe(gulp.dest('build/minified_templates'));
生成處理好的文件。
你能夠將它 pipe 到多個文件夾。若是某文件夾不存在,將會自動建立它。
gulp.src('./client/templates/*.jade') .pipe(jade()) .pipe(gulp.dest('./build/templates')) .pipe(minify()) .pipe(gulp.dest('./build/minified_templates'));
監視文件,而且能夠在文件發生改動時候作一些事情。
gulp.watch(glob [, opts], tasks) 或 gulp.watch(glob [, opts, cb])
須要在文件變更後執行的一個或者多個經過 gulp.task() 建立的 task 的名字,
var watcher = gulp.watch('js/**/*.js', ['uglify','reload']); watcher.on('change', function(event) { console.log('File ' + event.path + ' was ' + event.type + ', running tasks...'); });
也能夠直接執行function,同樣的。
gulp.watch('js/**/*.js', function(event) { console.log('File ' + event.path + ' was ' + event.type + ', running tasks...'); });
gulp的不少操做都是用插件執行的,固然,詳細操做天然是每一個插件看做者文檔了!並且同一個功能的插件也層出不窮,你們能夠根據須要自行選擇。好了,開始咱們的構建,注意,提到的每個插件都要npm安裝
注意:每個插件都存在可配置的空間,因此關於最大化利用好每一個插件,也是參照文檔來的,這裏咱們取一些通用配置,具體視項目狀況而定。
無可厚非,代碼實時保存,瀏覽器實時刷新,是前端最想要的功能,手動刷新瀏覽器相信是每個前端新手要吐的操做。
採用gulp-connect插件。
根目錄下開啓服務,端口號爲2323,開啓實時刷新,局域網內可用。
var connect = require('gulp-connect'); var serverConfig = { root: "./", port: 2323, livereload: true, host: '::' } gulp.task('server',function(){ connect.server(serverConfig); });
採用gulp-livereload。
開啓刷新,監聽html變化,並實時刷新。
var livereload = require('gulp-livereload') gulp.task('watch', function () { livereload.listen(); gulp.watch(['*.html'],function(event){ livereload.changed(event.path); }) });
其實到這裏,一個微型的服務就搭建起來了,最後別忘了最根本的一句
var gulp = require('gulp');
否則是起不來的。
爲了簡便,能夠在gulpfiles.js裏添加一行,
gulp.task('default',['server','watch']);
直接運行gulp
就好,讓他們依次執行。
到這裏,其實就是一個小規模的調試環境,接下來,讓咱們升級一下,開始構造簡單的發佈環境
採用的是gulp-htmlmin插件。
抽取src目錄下的全部html文件,導入到htmlmin插件進行處理,並將結果輸出到public目錄,最後從新刷新已開啓的服務。
var htmlmin = require('gulp-htmlmin'); gulp.task('html', function(){ gulp.src('src/*.html') .pipe(htmlmin({ collapseWhitespace: true, removeComments: true })) .pipe(gulp.dest('public')) .pipe(connect.reload()); });
採用的是gulp-uglify插件,但同時,咱們也用到了另外一個插件gulp-concat,這個是用來鏈接各個文件組成一個文件。
抽取src/js下的全部js文件,將其合併,而後壓縮,輸出到public/js目錄,最後服務重載。
var uglify = require('gulp-uglify'); var concat = require('gulp-concat'); gulp.task('script',function(){ gulp.src('src/js/*.js') .pipe(concat('main.js')) .pipe(uglify({mangle:false})) .pipe(gulp.dest('public/js')) .pipe(connect.reload()); });
採用的是gulp-cssnano插件。相似js,不解釋了。
var cssnano = require('gulp-cssnano'); gulp.task('css',function(){ gulp.src('src/css/*.css') .pipe(concat('animate.css')) .pipe(cssnano()) .pipe(gulp.dest('public/css')) .pipe(connect.reload()); })
採起的是gulp-smushit插件,相似js,不解釋。
var smushit = require('gulp-smushit'); gulp.task('imagemin',function(){ gulp.src(['src/images/*.png','src/images/*.jpg']) .pipe(smushit({ verbose:true })) .pipe(gulp.dest('public/images')) .pipe(connect.reload()); });
這個gulp-watch在前面有講到,其實就是開啓監聽,並從新執行各個html
,js,css,imagemin壓縮任務。
相信你們對比前面的gulp-livereload可以看的出來,這裏二者是有衝突的,一個只是調試下刷新頁面,一個卻每次都要壓縮。
因此其實實際項目中是不會把壓縮任務配置到watch裏,會形成資源浪費,你每保存一次,就會壓縮。只會在最後調試完成,執行壓縮一次。
gulp.task('watch', function () { gulp.watch(['src/*.html'], ['html']); gulp.watch(['src/js/*.js'], ['script']); gulp.watch(['src/css/*.css'], ['css']); gulp.watch(['src/images/*.*'], ['imagemin']); });
作一個min的task就好,只須要gulp min
。
gulp.task('min',['html','script','css','imagemin']);