一、Babel

JS 编译器,用于将采用 ECMAScript 2015+ 语法编写的代码转换为向后兼容的 JavaScript 语法:

  • 语法转换;
  • 通过 Polyfill 方式在目标环境中添加缺失的特性;
  • 源码转换 codemods
  • 转换 React 中的 JSX 语法;

01 - 安装

  • npm install --save-dev @babel/core @babel/cli @babel/preset-env

02 - 配置:babel.config.json

{
  // 预设
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "edge": "17",
          "firefox": "60",
          "chrome": "67",
          "safari": "11.1"
        },
        "useBuiltIns": "usage", // 只包含所需要的 polyfill
        "corejs": "3.6.5"
      }
    ]
  ],
  // 插件
  "plugins": [
  ]
}

03 - 编译

  • npx babel src --out-dir lib

04 - 预设 Presets 和插件 Plugins

  • npm install --save-dev @babel/plugin-transform-arrow-functions 转换为ES5的官方插件
  • npm install --save-dev @babel/preset-env 预设,启用一组插件

官方提供的预设:

  • @babel/preset-env for compiling ES2015+ syntax
  • @babel/preset-typescript for TypeScript
  • @babel/preset-react for React
  • @babel/preset-flow for Flow

05 - Polyfill

// 建议使用:
import "core-js/stable";

二、Browserify

JS 编译打包工具,使浏览器可以支持 CommodJS 模块化规范。

01 - 安装

  • npm install -g browserify

02 - 编译

  • browserify main.js -o bundle.js

三、Grunt

自动化构建工具,支持大量插件。

01 - 安装

  • npm install -g grunt-cli
  • npm install grunt --save-dev

02 - 配置 Gruntfile.js

  • "wrapper" 函数
  • 项目与任务配置
  • 加载 grunt 插件和任务
  • 自定义任务
// 举例:
module.exports = function(grunt) {

  // Project configuration.
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    uglify: {
      options: {
        banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
      },
      build: {
        src: 'src/<%= pkg.name %>.js',
        dest: 'build/<%= pkg.name %>.min.js'
      }
    }
  });

  // 加载包含 "uglify" 任务的插件。
  grunt.loadNpmTasks('grunt-contrib-uglify');

  // 默认被执行的任务列表。
  grunt.registerTask('default', ['uglify']);
};

03 - 选择插件

四、Gulp

自动化构建工具,支持大量插件。

01 - 安装

  • npm install --g gulp-cli
  • npm install --save-dev gulp

02 - 配置 gulpfile.js

// 举例:
const { src, dest } = require('gulp');
const uglify = require('gulp-uglify');
const rename = require('gulp-rename');

exports.default = function() {
  return src('src/*.js')
    // gulp-uglify 插件并不改变文件名
    .pipe(uglify())
    // 因此使用 gulp-rename 插件修改文件的扩展名
    .pipe(rename({ extname: '.min.js' }))
    .pipe(dest('output/'));
}

03 - 选择插件

五、Parcel

Web 应用打包工具,零配置,内置服务支持热更新

01 - 安装

  • npm install parcel-bundler --save-dev

02 - 热更新的服务

  • 设置一个入口文件:parcel index.html

03 - 打包到生产模式

  • parcel build index.js

六、Rollup

JS模块打包器,可以将小块代码编译成大块复杂代码,使用 ES6 模块规范

01 - 安装

  • npm install --save-dev rollup

02 - 打包

# UMD format requires a bundle name
$ rollup main.js --file bundle.js --format umd --name "myBundle"

03 - 配置文件 roullup.config.js

七、Webpack

JS应用程序静态模块打包器,可以不引入配置文件,但 webpack 仍然是高度可配置的,有一个或多个文件作为打包入口,输出的文件叫做 bundle

01 - 安装

  • npm install webpack-cli webpack --save-dev

02 - 打包:

  • development 开发环境

  • production 生产环境

  • 默认打包至 dist 目录下:npx webpack ./src/main --mode=development

03 - 配置

  • 入口 entry
  • 输出 output
  • 加载器 loader
  • 插件 plugins
  • 模式 mode 开发、生产
const path = require('path')

module.exports = {
  // 入口
  entry: './src/main.js', // 使用相对路径
  // 输出
  output: {
    // 输出的路径
    path: path.resolve(__dirname, 'dist'), // 使用绝对路径
    // 入口文件输出的文件名和位置
    filename: 'build.js',
  },
  // 加载器
  module: {
    rules: [
      // loader 的配置
    ],
  },
  // 插件
  plugins: [
    // plugin 的配置
  ],
  // 模式
  mode: 'development',
}