官网链接:https://webpack.js.org/concepts/loaders/

这一章节讲述了 loaders 的配置方法

一、一个简单的例子

command-line 安装 css-loader 和 ts-loader

  1. yarn add -D css-loader ts-loader

配置 webpack.config.js

  1. module.exports = {
  2. module: {
  3. rules: [
  4. { test: /\.css$/, use: 'css-loader' },
  5. { test: /\.ts$/, use: 'ts-loader' },
  6. ],
  7. },
  8. };

通过这种方式,webpack 能够使用 css-loader 作用到每个 .css 文件,使用 ts-loader 作用到每个 .ts 文件

二、使用方法

有两种方式使用 loaders

  • 配置方式(更推荐):在 webpack.config.js 文件中指定
  • 内联方式:使用 import 语句明确指定

1. 配置方式

module.rule 指定 loaders 的配置项目

  • 它使用简洁的方式展示 loaders,让我们对每个 loader 有一个概览
  • loaders 的执行顺序从右到左,下面的例子中,.css 文件先经过 sass-loader 处理,然后是 css-loader,最后是 style-loader
  1. module.exports = {
  2. module: {
  3. rules: [
  4. {
  5. test: /\.css$/,
  6. use: [
  7. { loader: 'style-loader' },
  8. {
  9. loader: 'css-loader',
  10. options: {
  11. modules: true
  12. }
  13. },
  14. { loader: 'sass-loader' }
  15. ]
  16. }
  17. ]
  18. }
  19. };

2. 内联方式

我们可以使用 import 语句或者其他等价的 importing 方法来指明 loaders

  • 通过 ! 来将资源和 loaders 分隔,每个部分只于当前目录相关

    1. import Styles from 'style-loader!css-loader?modules!./styles.css';

    这种方式可以让我们在 import 语句使用简单的前缀来重写任何 loaders、preLoaders 和 postLoaders

  • ! 前缀将禁用所有配置的 normal loaders

  • !! 前缀将禁用所有配置的 loaders(preLoaders、loaders、postLoaders)
  • -! 前缀将禁用所有配置的 preLoaders 和 loaders,不包括 postLoaders ```javascript import Styles from ‘!style-loader!css-loader?modules!./styles.css’;

import Styles from ‘!!style-loader!css-loader?modules!./styles.css’;

import Styles from ‘-!style-loader!css-loader?modules!./styles.css’; `` options 的传递方式可以是 query parameter ——?key=value&foo=bar,也可以是 JSON object ——?{“key”:”value”,”foo”:”bar”}`

三、Loader 特性

  • Loaders 可以像链条一样串起来用,每个在链条中的 loader 都将自己的转换作用于资源上。第一个 loader 传递自己处理过后的结果给下一个,一个接着一个,最后 webpack 等待着链条中最后一个 loader 返回出的 JavaScript
  • Loaders 可以是异步的,也可以是同步的
  • Loaders 运行于 Node.js,所以它能做很多事情
  • Loaders 是可配置的,通过 options 对象即可(query 的方式被废弃了)
  • 除了 package.json 中的 main,normal modules 可以通过 loader field 导出一个 loader
  • 插件可以给 loaders 更多的特性
  • Loaders 可以触发其他任意的文件

Loaders 提供了一种方式来自定义输出通过他们的预处理函数。用户对逻辑的颗粒度有了更多的自由度例如压缩、打包、语言翻译和更多

四、解析 Loader

Loaders 遵循模块解析标准,在大多数情况下它从 module path(npm installnode_modules)中被加载

  • 一个 loader 模块期望输出一个函数,这个函数是 Node.js 兼容的 JavaScript
  • 它们通常使用 npm 来管理
  • 按照一般惯例,loaders 通常命名为 xxx-loader

「@浪里淘沙的小法师」