這篇文章最初發表在我自己折騰的部落格站點上:使用gulp和bable實現實時編譯ES6程式碼,該部落格用了一位前輩開源的原始碼,基於thinkjs和vuejs開發,歡迎大家來逛逛。
問題描述
> 專案開發中使用了一個大而全的java框架,框架整合了前後端,前端在這個框架的基礎上開發jsp頁面,並未做到前後端完全分離。現在我們有些js程式碼使用了ES6的語法,但後來遇到了IE相容性的問題,又不得不把程式碼轉換到ES5,ES6的模板字串是多麼好用呀。唉~
> ### 自己嘗試過哪些方法
> 目前簡單配置了下babel,用到ES6的原始碼放在一個目錄src,babel轉譯之後的程式碼放到一個目錄dist,但每次改程式碼後轉換都得手工敲命令,也挺麻煩。所以想問下對webpack比較熟的朋友,能不能通過webpack配合babel實現程式碼的自動編譯,也就是“熱更新”。但這裡需要注意的是,不是打包,只是一堆js檔案轉譯為另一堆js檔案。
這個問題我首先百度了下未果,然後在segmentfault上求助如何使用webpack將es6程式碼熱更新為es5程式碼?(注意不是打包),得到一位前端開發者的提醒,於是自己動手弄了下實現我的需求。基本過程如下:
用npm初始化專案,並建立程式碼輸入和輸出目錄
此過程略,初始化完成後,主要是生成package.json,用來管理依賴。
建立兩個目錄,比如一個src是原始檔目錄,編寫的js都放在這個目錄中,另一個是dist目錄,也就是babel轉譯後的目錄,頁面中也引用這個目錄中的檔案。
安裝gulp和bable工具
1. 安裝gulp
npm install --g gulp npm install gulp --save-dev
2. 安裝babel及相關外掛
npm install -g babel-cli // 注意版本為6.xx npm install babel-cli --save-dev npm install babel-preset-env --save-dev //babel編譯模板 npm install babel-plugin-transform-remove-strict-mode // 編譯時移除全域性嚴格模式
3. 安裝gulp-babel外掛,注意版本為7.xx,與babel版本有關,詳細見[github](https://github.com/babel/gulp-babel)
npm install gulp-babel@7 --save-dev
4. 安裝實時編譯外掛
npm install --save-dev gulp-watch
編寫相應的配置檔案
1. babel配置檔案.babelrc
在專案根目錄下新建該檔案,並編寫如下內容:
{ "presets": [ [ "env", { "modules": false } ] ], // 貌似這裡的modules為false才可以識別this,在瀏覽器環境中有用 "plugins": ["transform-remove-strict-mode"] }
2. gulp配置檔案gulpfile.js
1 var gulp = require("gulp"), 2 babel = require("gulp-babel"), 3 watch = require("gulp-watch"); 4 5 gulp.task("babeljs", function() { 6 return gulp.src("src/*.js") // 輸入目錄 7 .pipe(babel()) 8 .pipe(gulp.dest("dist/")); // 輸出目錄 9 }); 10 gulp.task("watch", function() { // 實時監聽 11 gulp.watch(`src/*.js`, [`babeljs`]); 12 }); 13 14 gulp.task(`default`, [`watch`, `babeljs`]);
OK,最後一步
在專案根目錄下,執行gulp,然後修改src下的js檔案,你就會發現會被實時轉譯到dist目錄中。
存在的問題
寫程式碼時如果有語法錯誤,gulp的實時監控就會退出,所以,這個解決方法還是不夠智慧。