關於 Gulp 就不過多囉嗦了。經常使用的 js 模塊打包工具主要有 webpack、rollup 和 browserify 三個,Gulp 構建 ES6 開發環境一般須要藉助這三者之一來合併打包 ES6 模塊代碼。所以,Gulp 構建 ES6 開發環境的方案有不少,例如:webpack-stream、rollup-stream 、browserify等,本文講述使用 gulp-better-rollup 的構建過程。gulp-better-rollup 能夠將 rollup 更深刻地集成到Gulps管道鏈中。node
GitHub地址:https://github.com/JofunLiang/gulp-translation-es6-demowebpack
首先,安裝 gulp 工具,命令以下:git
$ npm install --save-dev gulp
安裝 gulp-better-rollup 插件,因爲 gulp-better-rollup 須要 rollup 做爲依賴,所以,還要安裝 rollup 模塊和 rollup-plugin-babel(rollup 和 babel 之間的無縫集成插件):es6
$ npm install --save-dev gulp-better-rollup rollup rollup-plugin-babel
安裝 babel 核心插件:github
$ npm install --save-dev @babel/core @babel/preset-env
安裝完成後,配置 .babelrc 文件和 gulpfile.js文件,將這兩個文件放在項目根目錄下。web
新建 .babelrc 配置文件以下:npm
{ "presets": [ [ "@babel/env", { "targets":{ "browsers": "last 2 versions, > 1%, ie >= 9" }, "modules": false } ] ] }
新建 gulpfile.js 文件以下:json
const gulp = require("gulp"); const rollup = require("gulp-better-rollup"); const babel = require("rollup-plugin-babel"); gulp.task("babel", () => { return gulp.src("src/**/*.js") .pipe(rollup({ plugins: [babel()] },{ format: "iife" })) .pipe(gulp.dest("dist")) }) gulp.task("watch", () => { gulp.watch("src/**/*.js", gulp.series("babel")) }) gulp.task("default", gulp.series(["babel", "watch"]))
在 src 目錄下使用 ES6 語法新建 js 文件,而後運行 gulp 默認任務,檢查 dist 下的文件是否編譯成功。gulp
通過上面的構建過程,成功將 ES6 語法轉譯爲 ES5 語法,但也僅僅是轉換的語法,新的 api(如:Set、Map、Promise等) 並無被轉譯。關於 ployfill 兼容能夠直接在頁面中引入 ployfill.js 或 ployfill.min.js 文件實現,這種方式比較簡單,本文再也不贅述,下面講下在構建中的實現方式。api
安裝 @babel/plugin-transform-runtime 、@babel/runtime-corejs2 和 core-js@2(注意:core-js的版本要和@babel/runtime的版本對應,如:@babel/runtime-corejs2對應core-js@2)。@babel/plugin-transform-runtime 的做用主要是避免污染全局變量和編譯輸出中的重複。@babel/runtime(此處指@babel/runtime-corejs2)實現運行時編譯到您的構建中。
$ npm install --save-dev @babel/plugin-transform-runtime @babel/runtime-corejs2 core-js@2
修改 .babelrc 文件:
{ "presets": [ [ "@babel/env", { "targets":{ "browsers": "last 2 versions, > 1%, ie >= 9" }, "modules": false } ] ], "plugins": [ [ "@babel/plugin-transform-runtime", { "corejs": 2 } ] ] }
同時修改 gulpfile.js 文件,給 rollup-plugin-babel 配置 runtimeHelpers 屬性以下:
const gulp = require("gulp"); const rollup = require("gulp-better-rollup"); const babel = require("rollup-plugin-babel"); gulp.task("babel", () => { return gulp.src("src/**/*.js") .pipe(rollup({ plugins: [ babel({ runtimeHelpers: true }) ] },{ format: "iife" })) .pipe(gulp.dest("dist")) }) gulp.task("watch", () => { gulp.watch("src/**/*.js", gulp.series("babel")) }) gulp.task("default", gulp.series(["babel", "watch"]))
再安裝 rollup-plugin-node-resolve 和 rollup-plugin-commonjs,這兩個插件主要做用是注入 node_modules 下的基於 commonjs 模塊標準的模塊代碼。在這裏的做用主要是加載 ployfill 模塊。
$ npm install --save-dev rollup-plugin-node-resolve rollup-plugin-commonjs
在修改 gulpfile.js 文件以下:
const gulp = require("gulp"); const rollup = require("gulp-better-rollup"); const babel = require("rollup-plugin-babel"); const resolve = require("rollup-plugin-node-resolve"); const commonjs = require("rollup-plugin-commonjs"); gulp.task("babel", () => { return gulp.src("src/**/*.js") .pipe(rollup({ plugins: [ commonjs(), resolve(), babel({ runtimeHelpers: true }) ] },{ format: "iife" })) .pipe(gulp.dest("dist")) }) gulp.task("watch", () => { gulp.watch("src/**/*.js", gulp.series("babel")) }) gulp.task("default", gulp.series(["babel", "watch"]))
注意壓縮使用 rollup-plugin-uglify 插件,爲了提高打包速度,咱們把模塊文件放到 src/js/modules 文件夾下,將 gulp.src("src/js/*.js") 改成 gulp.src("src/js/*.js") 只打包主文件不打包依賴模塊。
安裝 gulp-sourcemaps 和 rollup-plugin-uglify 插件:
npm install --save-dev gulp-sourcemaps rollup-plugin-uglify
修改 gulpfile.js 文件以下:
const gulp = require("gulp"); const rollup = require("gulp-better-rollup"); const babel = require("rollup-plugin-babel"); const resolve = require("rollup-plugin-node-resolve"); const commonjs = require("rollup-plugin-commonjs"); const uglify = require("rollup-plugin-uglify"); const sourcemaps = require("gulp-sourcemaps"); gulp.task("babel", () => { return gulp.src("src/js/*.js") .pipe(sourcemaps.init()) .pipe(rollup({ plugins: [ commonjs(), resolve(), babel({ runtimeHelpers: true }), uglify.uglify() ] },{ format: "iife" })) .pipe(sourcemaps.write('./')) .pipe(gulp.dest("dist/js")) }) gulp.task("watch", () => { gulp.watch("src/**/*.js", gulp.series("babel")) }) gulp.task("default", gulp.series(["babel", "watch"]))