跳至主要內容

Loaders

Mr.LRH大约 4 分钟

Loaders

loader 可以将所有类型的文件转换为 webpack 能够处理的有效模块,然后你就可以利用 webpack 的打包能力,对它们进行处理。

在处理模块时,将符合规则条件的模块,提交给对应的处理器来处理,通常用来配置 loader,其类型是一个数组,数组里每一项都描述了如何去处理部分文件。每一项 rule 大致可以由以下三部分组成:

  • 条件匹配:通过 testincludeexclude 等配置来命中可以应用规则的模块文件;
  • 应用规则:对匹配条件通过后的模块,使用 use 配置项来应用 loader,可以应用一个 loader 或者按照从后往前的顺序应用一组 loader,还可以分别给对应 loader 传入不同参数;
  • 重置顺序:一组 loader 的执行顺序默认是从后到前(或者从右到左)执行,通过 enforce 选项可以让其中一个 loader 的执行顺序放到最前(pre)或者是最后(post)

Loaders : https://webpack.docschina.org/loaders/open in new window

语法转换

module.exports = {
  module: {
    rules: [
      {
        test: /\.m?js$/,
        exclude: /(node_modules|bower_components)/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env'],
          },
        },
      },
      {
        test: /\.ts$/,
        use: 'ts-loader',
      },
    ],
  },
};

模板处理

module.exports = {
  module: {
    rules: [
      {
        test: /\.html$/i,
        loader: 'html-loader',
      },
    ],
  },
};

样式处理

module.exports = {
  module: {
    rules: [
      {
        // 对于 pure CSS - /\.css$/i,
        // 对于 Sass/SCSS - /\.((c|sa|sc)ss)$/i,
        // 对于 Less - /\.((c|le)ss)$/i,
        test: /\.((c|sa|sc)ss)$/i, // 匹配资源
        use: [
          'style-loader',
          {
            loader: 'css-loader',
            options: {
              // 每一个 CSS 的 `@import` 与 CSS 模块/ICSS 都会运行 `postcss-loader`,不要忘了 `sass-loader` 将不属于 CSS 的 `@import` 编译到一个文件中
              // 如果您需要在每个 CSS 的 `@import` 上运行 `sass-loader` 和 `postcss-loader`,请将其设置为 `2`。
              importLoaders: 2,
            },
          },
          {
            loader: 'postcss-loader',
            options: {
              postcssOptions: {
                plugins: [
                  [
                    // postcss-preset-env 允许将现代CSS转换为大多数浏览器可以理解的东西,根据设置目标浏览器或运行时环境确定所需的 Polyfill(垫片)。
                    // postcss-preset-env 包含 autoprefixer(添加李浏览器内核前缀),无需单独使用 autoprefixer
                    'postcss-preset-env',
                    {
                      /* postcss-preset-env pluginOptions */
                    },
                  ],
                ],
              },
            },
          },
          {
            loader: 'sass-loader', // 对于 less 使用 less-loader
            options: {
              // additionalData 在实际的文件之前要添加的 Sass / SCSS 代码。
              // 注意:在 sass-loader v8 中,这个选项名是 "prependData"
              // eg: additionalData: '$env: ' + process.env.NODE_ENV + ';',
            },
          },
        ],
      },
    ],
  },
};

文件处理

webpack 5 之前

module.exports = {
  module: {
    rules: [
      {
        // 处理图片文件
        test: /\.(png|jpe?g|gif|svg)$/i,
        use: [
          {
            loader: 'url-loader',
            options: {
              name: 'img/[name].[hash:6].[ext]',
              limit: 100 * 1024,
            },
          },
        ],
      },
      {
        // 处理字体文件
        test: /\.(eot|woff2|woff|ttf|svg)$/i,
        use: [
          {
            loader: 'url-loader',
            options: {
              name: 'font/[name].[hash:6].[ext]',
              limit: 100 * 1024,
            },
          },
        ],
      },
    ],
  },
};

webpack 5

在 webpack 5 之前,通常使用 url-loaderfile-loaderraw-loader 进行文件处理。webpack 5 新增 资源模块类型 (asset module type,允许使用资源文件(字体,图标等)而无需配置额外 loader ),通过添加 4 种新的模块类型,来替换所有这些 loader 。

  • asset/resource :发送一个单独的文件并导出 URL。之前通过使用 file-loader 实现。
  • asset/inline :导出一个资源的 data URI。之前通过使用 url-loader 实现。
  • asset/source :导出资源的源代码。之前通过使用 raw-loader 实现。
  • asset :在导出一个 data URI 和发送一个单独的文件之间自动选择。之前通过使用 url-loader,并且配置资源体积限制实现。
module.exports = {
  module: {
    rules: [
      {
        // 处理图片文件
        test: /\.(png|jpe?g|gif|svg)$/i,
        type: 'asset',
        generator: {
          filename: 'img/[name].[hash:6].[ext]',
        },
        parser: {
          dataUrlCondition: {
            maxSize: 100 * 1024,
          },
        },
      },
      {
        // 处理字体文件
        test: /\.(eot|woff2|woff|ttf|svg)$/i,
        type: 'asset/resource',
        generator: {
          filename: 'font/[name].[hash:6].[ext]',
        },
      },
    ],
  },
};
上次编辑于:
贡献者: lingronghai