不加 chunks 会导致所有入口 js 被注入每个 html 页面,因 html-webpack-plugin 默认注入全部 entry;必须为每个 htmlwebpackplugin 实例显式配置 chunks 数组,且值需与 entry key 完全一致,才能精准控制 js 注入。

html-webpack-plugin 生成多个 HTML 文件时,不加 chunks 就会把所有入口 JS 全塞进每个页面 —— 这是绝大多数人踩的第一个坑。
为什么每个页面都加载了全部 JS?
默认行为下,html-webpack-plugin 不会区分入口,它只看当前配置里声明了哪些 entry,然后一股脑全注入。比如你有 home、about、admin 三个入口,但只配了一个插件实例且没设 chunks,那生成的 home.html 里也会包含 about.js 和 admin.js 的 <script></script> 标签。
-
chunks是显式声明“这个 HTML 只该加载哪些 chunk”的唯一可靠方式 - 不写
chunks≠ 加载当前入口对应的 chunk,而是加载全部已定义的 entry chunk - 即使你用
filename: "[name].html"动态命名,也不改变注入逻辑
如何为每个页面精准注入对应 JS?
最稳妥的方式是为每个页面单独声明一个 HtmlWebpackPlugin 实例,并明确指定 chunks 数组:
plugins: [
new HtmlWebpackPlugin({
filename: 'home.html',
template: 'src/pages/home/index.html',
chunks: ['home'] // ← 只注入 home.js 及其依赖
}),
new HtmlWebpackPlugin({
filename: 'about.html',
template: 'src/pages/about/index.html',
chunks: ['about']
})
]
-
chunks值必须与entry对象的 key 完全一致(区分大小写) - 如果用了
SplitChunksPlugin提取公共模块,公共 chunk 名(如common)也得手动加进chunks数组才能注入 - 模板中若用了
这类 EJS 表达式,前提是chunks: ['home']已启用,否则files.chunks为空
动态生成多页配置时容易漏掉什么?
用 glob 扫描入口文件自动构建插件数组很省事,但常忽略两个关键点:
- 扫描路径必须匹配实际
entry的 key 命名规则 —— 比如./src/pages/*/index.js扫出home,那entry里就得是home: './src/pages/home/index.js',不能是homePage - 动态生成的
HtmlWebpackPlugin实例必须被正确推入plugins数组,而不是包裹在另一个数组里(常见错误:plugins: [htmlPlugins]→ 应为plugins: [...htmlPlugins]) - 如果某个页面需要额外 CSS 或异步 chunk(比如按需加载的组件),这些 chunk 名不会自动出现在
chunks列表里,得手动补全
template 路径错误会导致什么?
template 配置项不是可选的“锦上添花”,而是决定资源注入位置和结构稳定性的基础:
- 路径写错(如少个
src/或拼错文件名)→ 插件 fallback 到内置模板,生成的 HTML 里没有你的 DOM 结构,只有一堆空 - 模板里没写
或没留<script></script>注入点 → 即使chunks配对了,JS 也不会出现 - 用 EJS 模板时,
title选项只有在模板里写了<title></title>才生效;否则标题还是默认的 “Webpack App”
真正麻烦的不是生成不出来,而是生成出来却没报错,页面白屏或功能缺失,排查时容易绕远路。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











