Loader

loader 用于对模块的源代码进行转换。loader 可以使你在 import 或 "load(加载)" 模块时预处理文件。因此,loader 类似于其他构建工具中“任务(task)”,并提供了处理前端构建步骤的得力方式。loader 可以将文件从不同的语言(如 TypeScript)转换为 JavaScript 或将内联图像转换为 data URL。loader 甚至允许你直接在 JavaScript 模块中 import CSS 文件!

loader 执行顺序 从下到上,从右到左;

常用 Loader

file-loaderopen in new window

将文件保存至输出文件夹中并返回(相对)URL

module.exports = {
  module: {
    rules: [
      {
        test: /\.(png|jpe?g|gif)$/i,
        loader: "file-loader",
        // options: {
        //   name: '[path][name].[ext]',
        // },
      },
    ],
  },
};

url-loaderopen in new window

与 file-loader 类似,但是如果文件大写小于一个设置的值,则会返回 data URL

这样做的好处:图片直接放到 JS 文件中,省去了获取图片的请求;

坏处:图片大,JS 文件也会大,执行 JS 的时间就会长,所以在很长一段时间里页面上显示不出东西;

处理方法:设置图片大小限制,limit,单位为字节,如果图片大小超过了 limit,会像 file-loader 一样打包图片到 images 目录下;如果小于 2048 字节,也就是小于 2KB 的时候,会变成一个 base64 字符串,放到 bundle.js 里面

module.exports = {
  module: {
    rules: [
      {
        test: /\.(png|jpg|gif)$/i,
        use: [
          {
            loader: "url-loader",
            // options: {
            //   limit: 8192,
            // },
          },
        ],
      },
    ],
  },
};

css-loaderopen in new window

分析出 css 文件之间的关系,将他们合并为一个文件。

style-loaderopen in new window

把 CSS 插入到 DOM 中。推荐将 style-loader 与 css-loader 一起使用

module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/i,
        use: ["style-loader", "css-loader"],
      },
    ],
  },
};

sass-loaderopen in new window

加载 Sass/SCSS 文件并将他们编译为 CSS

module.exports = {
  module: {
    rules: [
      {
        test: /\.s[ac]ss$/i,
        use: [
          // 将 JS 字符串生成为 style 节点
          "style-loader",
          // 将 CSS 转化成 CommonJS 模块
          "css-loader",
          // 将 Sass 编译成 CSS
          "sass-loader",
        ],
      },
    ],
  },
};

postcss-loaderopen in new window

使用 PostCSS 处理 CSS 的 loader

module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/i,
        use: ["style-loader", "css-loader", "postcss-loader"],
      },
    ],
  },
};

babel-loaderopen in new window

打通 webpack 和 babel,并不会进行 ES6 语法的翻译;

相关依赖:

  • @babel/core:核心库,让 babel 识别 JS 代码的内容,然后转化成 AST,然后将 AST 编译转化出一些新的东西来;
  • @babel/preset-env:负责转换新的 JavaScript 句法(syntax)而不转换新的 API, 包含所有 ES6 转 ES5 的规则;
  • @babel/polyfill:为当前环境提供一个垫片,转换新的 API,设置 useBuiltIns 为'usage'如下可以按需加载,这样可以避免转换后文件过大;
  • @babel/plugin-transform-runtimeopen in new window: 除了在业务代码中引用 babel-polyfill 以外(常用业务项目使用这种方式),还可以使用@babel/plugin-transform-runtime 插件(推荐UI库,类库,公共库使用这种),这样可以不用污染全局环境;两种方式任选其一;
{
  module: {
    rules: [
      {
        test: /\.m?js$/,
        exclude: /node_modules/, // 排除对第三方代码处理
        use: {
          loader: "babel-loader",
          // options: {
            // presets: [['@babel/preset-env', {
            //   useBuiltIns: 'usage',
            //   targets: { // 项目最低运行环境
            //     chrome: "67"
            //   }
            // }]]
            // plugins: [
            //   [
            //     "@babel/plugin-transform-runtime",
            //     {
            //       // 可以将option中的内容放在babelrc
            //       corejs: 2, // 指定一个数字将重写需要polyfillable apl的助手,以引用来自该(主要)的助手。请注意,coreis: 2只支持全局变量(如Promise)和静态属性(如Array.from),而corejs: 3也支持实例属性(如[].includes)。根据值需要安装相关依赖@babel/runtime-corejs2。
            //       helpers: true,
            //       regenerator: true,
            //       useESModules: false,
            //     },
            //   ],
            // ],
          // },
        },
      },
    ];
  }
}

.babelrc

{
  plugins: [
    [
      "@babel/plugin-transform-runtime",
      {
        // 可以将option中的内容放在babelrc
        corejs: 2, // 指定一个数字将重写需要polyfillable apl的助手,以引用来自该(主要)的助手。请注意,coreis: 2只支持全局变量(如Promise)和静态属性(如Array.from),而corejs: 3也支持实例属性(如[].includes)。根据值需要安装相关依赖@babel/runtime-corejs2。
        helpers: true,
        regenerator: true,
        useESModules: false,
      },
    ],
  ]
}
最后更新时间:
贡献者: DESKTOP-ER5718D\zt