安装及使用

  1. // 安装
  2. yarn add webpack webpack-cli --dev
  3. // 运行
  4. yarn webpack

配置文件

4版本以上的 webpack 支持零配置,webpack 默认以项目根目录下的 webpack.config.js 文件作为配置文件。

工作模式

webpack 4 新增了工作模式的用法,在运行时加上 “—mode mode”, 或者在配置文件中指定 mode。webpack 有三种工作模式:

  • production : 生产模式,也是默认的模式。
  • development :开发模式,添加一些调试的辅助信息。
  • none :不做任何处理。

    资源加载

    借助于 Loader,Webpack 几乎可以打包前端项目所有类型的文件。JS 文件的 Loader 是默认的。
    比如打包 CSS 文件用到的加载器是 css-loader 和 style-loader。如果指定多个 loader,Webpack 加载的顺序是从最后一个开始。style-loader 将样式通过 style 标签注入。
    1. // webpack.config.js
    2. module: {
    3. rules: [ // 加载规则
    4. {
    5. test: /.css$/, // 匹配 css 文件
    6. use: [
    7. 'style-loader', // 将样式通过 style 标签注入
    8. 'css-loader' // 先加载
    9. ]
    10. }
    11. ]
    12. }

导入资源模块

使用 Webpack 打包, 可以通过 import 在 JS 文件中引入其他非 JS 的文件。

  1. import './main.css' // 引入 css

文件资源加载器

file-loader 用于加载图片、字体等非文本文件。

  1. // webpack.config.js
  2. module: {
  3. rules: [ // 加载规则
  4. {
  5. test: /.png$/,
  6. use: 'file-loader'
  7. }
  8. ]
  9. }
  10. // 导入一张图片并使用
  11. import icon from './icon.png'
  12. const img = new Image()
  13. img.src = icon

URL 加载器

对于一些小文件,比如将一些小型图片,可以将其转为 dataurl ,减少用 http 地址请求资源的请求次数。

  1. // webpack.config.js
  2. module: {
  3. rules: [ // 加载规则
  4. {
  5. test: /.png$/,
  6. use: {
  7. loader: 'url-loader',
  8. options: {
  9. limit: 10 * 1024 // 10 KB,当资源小于 10 KB,实行转化,大于 10KB 依然返回 http 地址
  10. }
  11. }
  12. }
  13. ]
  14. }

打包结果:
image.png

ES 2015

除 import、export外,Webpack 并不支持其他 ES 2015 特性,如果需要转化ES5,需要指定其他的 Loader。常用的是 babel-loader。

  1. // webpack.config.js
  2. module: {
  3. rules: [ // 加载规则
  4. {
  5. test: /.js$/,
  6. use: {
  7. loader: 'babel-loader',
  8. options: {
  9. presets: ['@babel/preset-env'] // 必须指定用于转化用的presets
  10. }
  11. }
  12. },
  13. ]
  14. }

Webpack 加载资源的方式

  • 遵循 ES Modules 的 import 声明
  • 遵循 CommonJS 标准的 require 函数
  • 遵循 AMD 标准的 define 函数和 require 函数
  • 样式代码中的 @import 命令和 url 函数
  • HTML 代码中的图片标签的 src 属性

Loader 原理

loader 获取到源文件,对文件内容加以处理。无论经过多少个 loader 处理,最终返回的必须是一段 JS 代码。