前端工程化 词条目录
前端Wiki/词条/Loader 与 Plugin

Loader 与 Plugin

定义webpack 的两类扩展点:Loader 转换文件、Plugin 挂入构建生命周期,几乎全部深度配置都在它们身上

Loader 是「文件级翻译机」:webpack 只认 JS,那么 css-loader 负责把 CSS 变成 JS 模块、babel-loader 负责把 TS/ES6+ 降级成浏览器能跑的 JS、url-loader 决定图片是打包成 base64 还是文件。配置在 module.rules 里按 test 匹配扩展名,多个 loader 从右往左链式执行。

Plugin 是「过程级插手者」:它监听 compiler 钩子,在打包的各阶段做事——HtmlWebpackPlugin 生成入口 HTML、MiniCssExtractPlugin 把 CSS 抽成独立文件、DefinePlugin 注入环境变量、SplitChunksPlugin 做代码拆分。一句话区分:loader 让 webpack 能「处理」某种文件,plugin 让 webpack 能「改变」构建过程本身。

JavaScript
// webpack.config.js —— loader 与 plugin 的典型配置
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
  module: {
    rules: [
      {
        test: /\.(js|ts)x?$/,
        exclude: /node_modules/,
        use: { loader: 'babel-loader' }         // loader:转译 JS
      },
      {
        test: /\.css$/,
        // 链式执行(从右往左):postcss → css-loader → 抽取成文件
        use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader']
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({ template: 'index.html' }),  // plugin:生成 HTML
    new MiniCssExtractPlugin({ filename: '[name].[contenthash].css' }),
    new (require('webpack')).DefinePlugin({
      'process.env.API_BASE': JSON.stringify('/api')
    })
  ]
};
⚠ 常见误区
🔗 相关词条webpack 核心概念Babel 做了什么
← 返回来源章节webpack 核心概念