1、簡介css
以前瞭解了自動化構建相關工具,而後今天有時間就把學習過程碰到的坑寫下來。首先是前端自動化構建三大工具gulp\grunt\webpack。其實說是三大工具,但也只是我的主觀想法。由於本身常見的並有所瞭解的就這三個。至於其餘的,暫不在討論範圍。html
2、gulp、grunt、webpack對比前端
一、Grunt和Gulp屬於任務流工具Tast Runner
, 而 webpack屬於模塊打包工具 Bundler
。node
二、Grunt的出現早於Gulp,Gulp是後起之秀。他們的本質都是經過 JavaScript 語法實現了shell script 命令的一些功能。好比利用jshint
插件 實現 JavaScript 代碼格式檢查這一個功能。早期須要手動在命令行中輸入 jshint test.js
,而 Grunt 則經過文件 Gruntfile.js 進行配置webpack
三、 Gulp吸收了Grunt的優勢,擁有更簡便的寫法,經過流(Stream
)的概念來簡化多任務之間的配置和輸出,讓任務更加簡潔和容易上手。經過配置gulpfile.js文件來實現。web
四、webpack是後起之秀,它支持了AMD 和 CommonJS 類型,經過loader
機制也可使用ES6模塊格式。還有強大的 code splitting
。webpack 是個十分強大的工具,它正在想一個全能型的構建工具發展。shell
五、gulp和grunt是流管理工具,經過一個個task配置執行用戶須要的功能,如格式檢驗,代碼壓縮等,值得一提的是,通過這二者處理的代碼只是局部變量名被替換簡化,總體並無發生改變,仍是你的代碼。npm
而webpack則進行了更完全的打包處理,更加偏向對模塊語法規則進行轉換。主要任務是突破瀏覽器的鴻溝,將本來瀏覽器不能識別的規範和各類各樣的靜態文件進行分析,壓縮,合併,打包,最後生成瀏覽器支持的代碼,所以,webapck打包事後的代碼已經json
不是你寫的代碼了,或許你再去看,已經看不懂啦gulp
var gulp = require("gulp"); var browserSync = require("browser-sync"); var sass = require("gulp-sass"); gulp.task("browserSync",function(){ browserSync.init({ server:"app" }) // }) gulp.task("sass",function(){ return gulp.src("app/scss/style.scss") .pipe(sass()) .pipe(gulp.dest("app/css")) }) gulp.task("watch",function(){ gulp.watch("app/**/*.scss",["browserSync","sass"]) gulp.watch("app/**/*.scss").on("change",browserSync.reload); })
以上是利用sass插件和browser-sync插件製做的編譯sass並異步刷新的功能
6、須要注意的地方
一、nodejs會自動安裝gulp最新版本,可是4.0在語法與3.9一下版本有些不一樣。 安裝自定義版本gulp命令:npm install gulp@3.9
二、使用插件以前先使用命令安裝插件,而後在gulpfile.js引入。以後再定義任務使用。
7、其餘參考
https://www.cnblogs.com/Tom-yi/p/8036730.html
八、使用browser-sync作pc移動端調試的時候,按照步驟走到打開localhost:3001的設置頁面時,不知道爲何沒有找到相對應的開關
https://segmentfault.com/q/1010000013649934
https://blog.csdn.net/u013063153/article/details/52787421
9、後期完善的gulpfile
//經過browser-sync插件,並經過自帶watch插件監聽sass編譯實現熱更新 // var browserSync = require("browser-sync"); // gulp.task("browserSync",function(){ // browserSync.init({ // server:"app" // }) // }) // gulp.task("watch",function(){ // gulp.watch("app/**/*.scss",["browserSync","sass"]) // gulp.watch("app/**/*.scss").on("change",browserSync.reload); // }) //引入html並刷新 // gulp.task("html",function(){ // gulp.src("app/*.html"); // .pipe(webServer.reload()) // }) // --------------------------------------------------------------------分割線---------------------------------------------------------------------- //引入 var gulp = require("gulp"); var sass = require("gulp-sass"); var tinypng_nokey = require('gulp-tinypng-nokey'); var webServer = require('gulp-connect'); var rename = require("gulp-rename"); var plumber = require("gulp-plumber"); //var watch = require('gulp-watch'); //定義任務 控制檯執行例如:gulp sass //編譯css、壓縮等操做 gulp.task("sass",function(){ //引入源文件 return gulp.src("app/**/*.scss") //執行sass編譯 .pipe(sass()) //修改文件路徑 .pipe(rename({ dirname:"" })) //執行輸出 .pipe(gulp.dest("app/css1")) .pipe(webServer.reload()) }) //醜化、壓縮js等操做,但我這裏由於沒處理因此只是簡單的複製 gulp.task("js",function(){ //引入源文件 return gulp.src("app/**/*.js") //修改文件路徑 .pipe(rename({ dirname:"", basename:"main" })) //執行輸出 .pipe(gulp.dest("app/js1")) .pipe(webServer.reload()) }) function handler (err){ console.log('Less Error!', err.message); this.emit('end'); } //壓縮html等操做但我這裏由於是測試,因此只是簡單的複製沒有作處理 gulp.task("html",function(){ return gulp.src("app/**/*.html") .pipe(gulp.dest("app")) .on("error",handler) .pipe(webServer.reload()) }) //監聽 gulp.task("watch",function(){ gulp.watch("app/**/*.scss",["sass"]) gulp.watch("app/**/*.js",["js"]) gulp.watch("app/**/*.html",["html"]) }) gulp.task("connect",function(){ webServer.server({ root:"./app", port: 80, host: 'jiangqi.dev', livereload: true, }); }) gulp.task("default",["sass","connect","watch"])