webpack stats 配置指南:用 "summary" 预设输出精简的构建摘要
本指南围绕 webpack 官方示例 examples/stats-summary 展开,讲解如何通过 stats: "summary" 让构建终端只输出最精简的摘要信息。文章会从配置写法、运行结果出发,深入 DefaultStatsPresetPlugin 与配置归一化链路,说明 summary 预设内部究竟开启了哪些字段、与其他预设(none / minimal / errors-warnings / normal / detailed / verbose)的差异,以及如何在对象模式下做细粒度定制。
stats 输出级别与预设(preset)体系
webpack 在每次编译结束后都会生成一份 stats(统计报告),用于在终端描述本次构建的结果。这份报告的控制项非常多(资产、模块、chunk、错误与警告、日志等),为了便于使用,webpack 用"预设"把这些细粒度开关打包成若干档位。
在配置校验 Schema 中,stats 字段被定义为 StatsValue,它可以是一个字符串预设名、一个布尔值,或一个细粒度选项对象(见 schemas/WebpackOptions.json):
- 字符串预设名:
"none"、"summary"、"errors-only"、"errors-warnings"、"minimal"、"normal"、"detailed"、"verbose"; - 布尔值:
true/false; - 对象:直接传入
StatsOptions中的任意字段做细粒度控制。
这些预设的完整定义集中在 lib/stats/DefaultStatsPresetPlugin.js 的 NAMED_PRESETS 常量中,下表整理了各档位对应的能力:
| 预设名 | 核心语义 | 典型输出 |
|---|---|---|
none |
关闭全部输出(all: false) |
什么都不打印 |
summary |
只保留版本号与错误/警告计数,关闭全部细节 | webpack X.X.X compiled successfully |
errors-only |
只显示错误与错误堆栈/模块追踪,日志仅 error 级 | 无错误时几乎无输出,出错时仅呈现错误 |
errors-warnings |
在 errors-only 基础上额外输出警告 | 干净构建时接近无输出 |
minimal |
显示资产/模块的"计数式"摘要与错误警告 | 1 asset / 1 module / compiled successfully |
normal |
默认档,展示资产、模块、编译结果等常规信息 | 带文件名的资产与模块清单 |
detailed |
在 normal 基础上追加 chunk、模块深度、导出使用、日志等 | 详细分块输出 + LOG 分组 |
verbose |
全量细节(堆栈、日志 verbose、chunk 关系等) | 最完整最啰嗦 |
关于布尔值:stats: true 等价于 "normal",stats: false 等价于 "none",这一映射可以在 lib/config/normalization.js 的 stats 归一化逻辑以及 lib/Compilation.js 的 createStatsOptions 中得到印证——false 会被改写成 { preset: "none" },true 改写成 { preset: "normal" },字符串则直接改写成 { preset: <字符串> }。用户不配置 stats 时,输出形态约等于 normal 档(由 DEFAULTS 中各字段在终端展示(forToString)上下文中的默认值决定,见 lib/stats/DefaultStatsPresetPlugin.js)。
最小化配置:启用 summary 输出
examples/stats-summary 展示的就是最简单的一种 stats 自定义方式。入口文件 examples/stats-summary/example.js 内容非常朴素:
console.log("Hello World!");
而其 webpack.config.js 也极其精简——除了输出目录与文件名外,唯一的"额外"配置就是 stats: "summary":
"use strict";
const path = require("path");
/** @type {import("webpack").Configuration} */
const config = {
output: {
path: path.join(__dirname, "dist"),
filename: "output.js"
},
stats: "summary"
};
module.exports = config;
在仓库根目录执行以下命令即可复现该示例(产物会写入 examples/stats-summary/dist,stats 只影响终端报告,不影响产物内容):
cd examples/stats-summary && npx webpack
README 中该示例的终端输出被归在 "Production mode"(生产模式)之下,呈现为一行状态摘要:
webpack X.X.X compiled successfully
对比同仓库的其余 stats 示例可以看到档位差异:examples/stats-minimal 在摘要之外多出 1 asset / 1 module 两行计数;examples/stats-normal 会列出 asset output.js 28 bytes ... 与 ./example.js 29 bytes ...;examples/stats-detailed 还会输出 chunk、入口点、模块深度以及 LOG from webpack.* 的分组日志;而 examples/stats-none 则完全不输出任何内容。几个示例共享同一份业务代码与几乎相同的输出产物,差别只在 stats 报告——这直观说明了 stats 配置与打包结果彼此独立。
summary 预设的源码语义:它到底打开了什么
从输出看 summary 很"安静",但在源码层面它并不是简单地"少打印"。查看 NAMED_PRESETS 中 summary 的定义(lib/stats/DefaultStatsPresetPlugin.js):
summary: {
all: false,
version: true,
errorsCount: true,
warningsCount: true
}
其展开后的语义如下:
| 字段 | summary 取值 | 含义 |
|---|---|---|
all |
false |
全局总开关关闭,未显式指定的报告项(资产、模块、chunk、日志等)一律不输出 |
version |
true |
报告头部附带 webpack 版本号(终端中的 webpack X.X.X 即由此而来) |
errorsCount |
true |
开启错误计数;本次构建存在错误时,会以计数形式汇总呈现 |
warningsCount |
true |
开启警告计数;本次构建存在警告时,会以计数形式汇总呈现 |
因此,在没有任何错误与警告的干净构建中,summary 的输出收敛为一行 webpack X.X.X compiled successfully;一旦编译出现错误或警告,计数开关会将其以汇总条目的形式呈现在状态行上(源码层面即 errorsCount / warningsCount 为 true 的效果)。需要保留错误/警告的详细堆栈与模块来源时,应改用 errors-only 或 errors-warnings 档位(见 lib/stats/DefaultStatsPresetPlugin.js),两者都会把错误与警告的展示空间(errorsSpace / warningsSpace)置为 Infinity 并开启 moduleTrace。
预设如何被"施加":statsPreset 钩子与归一化
理解 summary 的含义后,再来看它是在何时、以何种顺序生效的。webpack 对 stats 的处理分两个阶段:
-
归一化:编译开始时,用户配置中
stats的值会被归一化为统一的对象结构。字符串/布尔值会被包成{ preset: ... }(见 lib/config/normalization.js)。 -
施加预设并补齐默认值:当 stats 选项对象存在
preset时,lib/Compilation.js 的createStatsOptions会先触发:
if (options.preset !== undefined) {
this.hooks.statsPreset.for(options.preset).call(options, context);
}
this.hooks.statsNormalize.call(options, context);
statsPreset 钩子由 lib/stats/DefaultStatsPresetPlugin.js 注册:对于 NAMED_PRESETS 中的每个预设名,插件都通过 compilation.hooks.statsPreset.for(key) 挂载回调,用 applyDefaults 把该预设的字段值填进选项(只有未定义的关键字才会被写入,用户显式给出的字段会覆盖预设值)。紧接着 statsNormalize 钩子再补齐 DEFAULTS 中的其余默认项,例如 colors(终端着色)、输出间距等。
也就是说,stats: "summary" 的完整语义是"summary 预设定义的 4 个字段 + DEFAULTS 中的其余全局默认项",任何单个字段都可以被后续对象配置覆盖。
对象模式:在 summary 基础上做细粒度定制
stats 同样支持直接传入选项对象。如果希望获得 summary 的效果、同时额外开启终端着色,可以在 webpack.config.js 中写出与预设等价的对象:
"use strict";
const path = require("path");
/** @type {import("webpack").Configuration} */
const config = {
output: {
path: path.join(__dirname, "dist"),
filename: "output.js"
},
// 等价于 stats: "summary",并额外开启终端着色
stats: {
all: false,
version: true,
errorsCount: true,
warningsCount: true,
colors: true
}
};
module.exports = config;
同理,当 "summary" 不能满足需求时,可以在对象中打开个别字段(如 errors: true、moduleTrace: true、assets: true 等),webpack 会把这些字段与 DEFAULTS 中未显式关闭的默认项合并生效。需要注意:若对象中未设置 all,默认项会按各自规则决定开关,因此"想从一个干净基线上单独打开某一项"时,显式书写 all: false 是最可控的做法。
小结
stats: "summary" 是 webpack stats 输出体系中最内敛的一档预设:通过 all: false 关掉所有细节,仅保留 version、errorsCount、warningsCount 三个信息源,让构建终端只呈现一行最干净的编译结果。它非常适合需要在日志噪音很小的环境下确认构建状态、或在 CI 中只关心"是否编译成功"的场景。若想深入学习这套预设体系,推荐按如下路径在仓库内继续阅读:
- 查看完整预设定义与默认值:lib/stats/DefaultStatsPresetPlugin.js;
- 查看预设施加顺序与归一化入口:lib/Compilation.js、lib/config/normalization.js;
- 查看合法取值与字段校验:schemas/WebpackOptions.json;
- 对照观察各档位差异:stats-none、stats-summary、stats-minimal、stats-normal、stats-detailed。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0627
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00