多彩编程 多彩编程MZPH · CODE BLOG
DEV TOOLS

Webpack 构建配置

从核心概念到优化打包,理解前端工程化的「最后一公里」。

Webpack 构建配置实战

Webpack 是前端工程化的「打包中枢」,把 JS、CSS、图片等资源视作模块,统一处理依赖、转换与打包。虽然 Vite 等新一代工具越来越流行,但理解 Webpack 的核心概念仍是看懂大量历史项目与脚手架的前提。这篇笔记把核心概念、Loader、Plugin、优化配置与 Vite 对比五块讲清楚。

一、核心概念

Webpack 五大核心:入口 entry、出口 output、Loader、Plugin、模式 mode。最小可运行配置:

// webpack.config.js
const path = require("path");

module.exports = {
  mode: "development",            // development | production
  entry: "./src/index.js",       // 打包入口
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "[name].[contenthash:8].js",
    clean: true,                 // 每次构建清空 dist
  },
  module: { rules: [] },          // Loader 配置
  plugins: [],                    // Plugin 配置
};

模式决定默认优化:development 关闭压缩开启 sourcemap,production 开启压缩与 Tree Shaking。

二、Loader:处理非 JS 资源

Loader 让 Webpack 能解析 CSS、图片、字体等资源。常用规则如下:

module: {
  rules: [
    // 处理 CSS,生产环境抽离到独立文件
    {
      test: /\.css$/,
      use: ["style-loader", "css-loader", "postcss-loader"],
    },
    // 处理 Sass/SCSS
    { test: /\.scss$/, use: ["style-loader", "css-loader", "sass-loader"] },
    // 处理图片(Webpack5 内置资源模块)
    {
      test: /\.(png|jpe?g|gif|webp|svg)$/,
      type: "asset",
      parser: { dataUrlCondition: { maxSize: 8 * 1024 } }, // 8kb 以下转 base64
    },
    // 处理 JS:Babel 转译
    {
      test: /\.js$/,
      exclude: /node_modules/,
      use: { loader: "babel-loader", options: { presets: ["@babel/preset-env"] } },
    },
  ],
}

Loader 执行顺序:从右到左、从下到上。CSS 链路写成 ["style-loader", "css-loader", "postcss-loader"] 才正确。

三、Plugin:扩展构建能力

Plugin 介入整个构建生命周期,做压缩、生成 HTML、抽取 CSS 等事:

const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");

module.exports = {
  plugins: [
    // 自动注入打包产物到 HTML 模板
    new HtmlWebpackPlugin({ template: "./public/index.html" }),
    // 抽离 CSS 到独立文件(生产环境)
    new MiniCssExtractPlugin({ filename: "[name].[contenthash:8].css" }),
  ],
  // 生产环境替换 style-loader 为 MiniCssExtractPlugin.loader
};

四、优化配置

生产环境优化主要围绕「分包、缓存、压缩」三件事:

module.exports = {
  optimization: {
    // 代码分割:vendor 单独成包,利用浏览器缓存
    splitChunks: {
      chunks: "all",
      cacheGroups: {
        vendors: {
          test: /[\\/]node_modules[\\/]/,
          name: "vendors",
          chunks: "all",
        },
      },
    },
    runtimeChunk: "single",       // 运行时代码单独成包
    minimize: true,
  },
  performance: {
    maxAssetSize: 300 * 1024,     // 单文件超 300kb 提示
    hints: "warning",
  },
};

配合 [contenthash] 文件名、Tree Shaking(生产模式自动,需 ES Module 静态导入)、按需加载 import("./page").then(),能把首屏体积压到合理范围。

五、Webpack vs Vite 对比

新一代工具 Vite 用原生 ESM 做开发,启动飞快,但 Webpack 仍有大量项目在用。简要对比如下:

  • 开发启动:Webpack 全量打包后启动,大项目慢;Vite 按需编译,启动几乎秒级。
  • 构建产物:两者都用 Rollup/自身打包,Webpack 生态插件更丰富。
  • 适用场景:新项目优先 Vite;存量大型项目或依赖特定 Webpack 插件时继续用 Webpack。

不必把两者对立——理解 Webpack 概念后迁移到 Vite 几乎无门槛,配置思想是相通的。

小结

Webpack 的核心是「入口 → Loader 转换 → Plugin 扩展 → 出口打包」。先吃透五大概念,再按生产优化清单做分包与缓存,最后理解 Vite 的差异,前端构建链路就打通了。

更新于 2026-07-21 · 阅读 860
RELATED

相关 技术好文

继续延伸阅读:构建之外的前端样式与工程实践。