gulp + gulp-better-rollup + rollup 構建 ES6 開發環境


gulp + gulp-better-rollup + rollup 構建 ES6 開發環境

關於 Gulp 就不過多啰嗦了。常用的 js 模塊打包工具主要有 webpackrollupbrowserify 三個,Gulp 構建 ES6 開發環境通常需要借助這三者之一來合並打包 ES6 模塊代碼。因此,Gulp 構建 ES6 開發環境的方案有很多,例如:webpack-stream、rollup-stream 、browserify等,本文講述使用 gulp-better-rollup 的構建過程。gulp-better-rollup 可以將 rollup 更深入地集成到Gulps管道鏈中。

GitHub地址:https://github.com/JofunLiang/gulp-translation-es6-demo

 

構建基礎的 ES6 語法轉譯環境

首先,安裝 gulp 工具,命令如下:

$ npm install --save-dev gulp

 

安裝 gulp-better-rollup 插件,由於 gulp-better-rollup 需要 rollup 作為依賴,因此,還要安裝 rollup 模塊和 rollup-plugin-babel(rollup 和 babel 之間的無縫集成插件):

$ npm install --save-dev gulp-better-rollup rollup rollup-plugin-babel

 

安裝 babel 核心插件:

$ npm install --save-dev @babel/core @babel/preset-env

 

安裝完成后,配置 .babelrc 文件和 gulpfile.js文件,將這兩個文件放在項目根目錄下。

 

新建 .babelrc 配置文件如下:

{
  "presets": [
    [
      "@babel/env",
      {
        "targets":{
          "browsers": "last 2 versions, > 1%, ie >= 9"
        },
        "modules": false
      }
    ]
  ]
}

 

新建 gulpfile.js 文件如下:

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 下的文件是否編譯成功。

 

使用 ployfill 兼容

經過上面的構建過程,成功將 ES6 語法轉譯為 ES5 語法,但也僅僅是轉換的語法,新的 api(如:Set、Map、Promise等) 並沒有被轉譯。關於 ployfill 兼容可以直接在頁面中引入 ployfill.js 或 ployfill.min.js 文件實現,這種方式比較簡單,本文不再贅述,下面講下在構建中的實現方式。

安裝 @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"]))

 

使用 sourcemaps 和壓縮

注意壓縮使用 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"]))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM