vite-plugin-html是vite生态中实现html动态生成与注入最稳定轻量的选择,但ejs模板不生效主因是模板未被识别、变量未传入或script标签未删除;minify仅在build产物中生效,多页配置需严格满足filename/template/entry三要素。

直接说结论:vite-plugin-html 是当前 Vite 生态中实现 HTML 动态生成与注入最稳定、最轻量的选择,但它的行为高度依赖模板语法、路径配置和构建阶段的执行时机——配错一个参数, 就原样留在 HTML 里,页面标题还是空的。
为什么 不替换?EJS 模板没生效的典型原因
EJS 标签不渲染,90% 是因为三个环节断了链:模板未被识别为 EJS、变量未传入、或入口 script 被重复保留。
- 确保
public/index.html文件实际被插件接管——不能靠手动 import HTML,必须由createHtmlPlugin的template选项显式指向它(默认值是public/index.html,但一旦改过entry或加了多页,就容易误配) -
inject.data必须存在且非空,哪怕只传一个{ title: 'dev' };空对象{}不会触发变量替换 - 原始
index.html中的<script type="module" src="/src/main.ts"></script>必须删掉——插件会在构建时自动注入,留着会导致双加载或模块解析失败 - EJS 语法要严格匹配:
会转义 HTML,不转义;如果title值含引号或标签,用后者更安全
createHtmlPlugin 的 minify 开关为什么没压缩 HTML?
minify: true 默认启用,但“没压缩”通常不是开关失效,而是你没在构建产物里看——开发服务器(vite dev)下不走压缩逻辑,只有 vite build 后的 dist/index.html 才会真正压缩。
- 检查输出目录:压缩只作用于构建产物,
dist/下的文件才有效,.html文件体积应明显缩小(空格、换行、注释全清) - 若仍无效果,手动传入压缩选项更可靠:
minify: { collapseWhitespace: true, removeComments: true, minifyCSS: true } - 注意兼容性:某些老版本插件对
minifyCSS支持不稳定,可先关掉它单独验证
多页面(MPA)配置后页面空白?pages 数组的硬性约束
空白页本质是资源路径错位或入口未挂载。vite-plugin-html 的 pages 不是“多入口开关”,而是每个页面独立的模板+入口绑定规则,漏一项就断。
- 每个
page对象必须同时指定filename(输出名)、template(源模板)、entry(TS/JS 入口)——三者缺一不可 -
template路径必须真实存在,且内容含 EJS 标签;比如public/other.html里也要有<title></title> -
entry文件必须导出一个挂载到#app的逻辑(或对应 ID),否则 Vue/React 应用无法启动;不要复用同一main.ts而不改挂载点 - 所有
pages的filename不能重名,且不能和默认index.html冲突;否则后写的会覆盖前写的
最容易被忽略的是:插件不会校验 template 文件是否存在,也不会提示 EJS 标签拼写错误—— 这种笔误只会让变量静默消失,页面标题变空。调试时优先打开 dist/ 下的 HTML 源码,一眼就能看到变量是否被替换了。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











