自动化构建工具

  1. Webpack 基于模块化打包工具,适用于大型复杂前端项目构建
  2. Grunt
    • 基于Node、上手容易、插件齐全、社区活跃
    • 早期产物: 每次操作都是文件读写、配置相对繁琐
  3. Gulp
    • 基于任务运行的工具 工作流
    • 配置相对简单、基于文件流操作
  4. Rollup 适用于基础库的打包
  5. Parcel

Webpack v4

Webpack 官网
Webpack 中文文档

  1. 初始化合并参数
  2. run 编译,从 entry 入口,使用 loader 递归编译模块
  3. 输出资源,根据入口和 Module 之间的依赖关系,组装成一个个包含多个模块的 Chunk,再把每个 Chunk 转换成一个单独的文件 Bundle.

在以上过程中,Webpack 会在特定的时间点广播出特定的事件,插件在监听到感兴趣的事件后会执行特定的逻辑,并且插件可以调用 Webpack 提供的 API 改变 Webpack 的运行结果

分别介绍 bundle, chunk, module 是什么?

  • module是开发中的单个模块,在 webpack 的世界,⼀切皆模块,⼀个模块对应⼀个⽂件,webpack 会从配置的 entry 中递归地构建一个依赖关系图
  • chunk代码块,⼀个 chunk 由多个模块组成,⽤于代码的合并和分割Code Splitting
  • bundle包,是由 webpack 打包出来的⽂件

loader 加载模块

让 webpack 拥有了加载和解析非 JavaScript 文件的能力

  • babel-loader 加载 ES2015+ 代码,然后使用 Babel 转译为 ES5
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // npm install -D babel-loader @babel/core @babel/preset-env webpack
    module: {
    rules: [
    {
    test: /\.m?js$/,
    include: [resolve('src')],
    exclude: /(node_modules|bower_components)/,
    use: {
    loader: 'babel-loader?cacheDirectory=true',
    options: {
    presets: ['@babel/preset-env'],
    plugins: ['@babel/plugin-proposal-object-rest-spread']
    }
    }
    }
    ]
    }
  • file-loader 将文件发送到输出文件夹,并返回(相对)URL
  • url-loader 像 file loader 一样工作,但如果文件小于限制,可以返回 data URL(Base64)
  • image-loader 加载并且压缩图⽚⽂件
  • source-map-loader 加载额外的 sourcemap ⽂件,以⽅便断点调试
  • html-loader 导出 HTML 为字符串,需要引用静态资源
  • css-loader 加载 CSS,⽀持模块化、压缩、⽂件导⼊等特性
  • style-loader 把 CSS 代码注⼊到 JavaScript 中,通过 DOM 操作去加载 CSS
  • eslint-loader 通过 ESLint 检查 JavaScript 代码
  • vue-loader 加载和转译 Vue 组件

plugin 扩展能力

在 webpack 运行的生命周期中会广播出许多事件,plugin 可以监听这些事件,调用 webpack 提供的 API 改变输出结果: 打包优化,资源管理,注入环境变量,压缩、从 js 中分离 css…

  • define-plugin 定义全局变量
  • clean-webpack-plugin 清理文件
  • html-webpack-plugin 简化 HTML ⽂件创建
  • uglifyjs-webpack-plugin 通过 UglifyJS 压缩 ES6 代码
  • mini-css-extract-plugin 为每个引入 CSS 的 JS 文件创建一个 CSS 文件, ⽀持按需加载
  • webpack-parallel-uglify-plugin 多核压缩,提⾼压缩速度
  • hot-module-replacement-plugin 模块热替换 HMR
  • webpack-bundle-analyzer 可视化 webpack 输出⽂件的体积