Vite多页应用中如何正确配置不同页面的入口JS文件?
我用 Vite 搭建一个多页项目,每个页面都有自己的 JS 入口,但打包后发现只有 index.html 的脚本能正常加载,其他页面比如 about.html 引用的 about.js 找不到。我在 vite.config.js 里是这么配的:
export default defineConfig({
build: {
rollupOptions: {
input: {
index: resolve(__dirname, 'src/index.html'),
about: resolve(__dirname, 'src/about.html')
}
}
}
})
结果 about.html 里自动注入的 script 标签路径不对,指向了 /assets/about-xxx.js,但实际生成的文件名却带了 hash,而且路径也不对。是不是还要额外配置什么?
首先你要知道 Vite 在构建多页应用时,每个页面的资源路径处理其实分为两个部分:
1. HTML 文件的路径处理
2. JS/CSS 等静态资源的路径处理
你当前的配置只解决了第一部分。对于 JS 文件路径问题,需要额外配置 build.rollupOptions.output。我来给你一个完整的配置示例:
这里有几个关键点需要注意:
1.
entryFileNames控制入口 JS 文件的命名规则,这里我们统一放到 assets 目录下,并且带上 hash2. 你可能还需要检查 HTML 文件中的 script 标签是否正确。Vite 会自动处理,但如果你手动写了 script 标签,记得用相对路径或者删除手动标签让 Vite 自动注入
3. 对于开发环境,确保你的服务器配置支持多页路由。可以在 vite.config.js 中添加:
如果还有问题,可以检查下 dist 目录生成的文件结构是否符合预期。现代前端工具链有时候确实挺折腾的,特别是这种多页应用的配置,我之前也被坑过好几次...
补充一点,如果你发现某些资源还是路径不对,可以试试在 vite.config.js 里加个 base 配置项:
这样会强制所有资源使用相对路径引用,适合静态站点部署。
input指向.html文件是对的,但 Vite 会把每个 HTML 当作一个“页面入口”,然后自动解析它里面引用的 JS(通过<script type="module" src="xxx">),而不是你自己去写 JS 文件路径。你现在的配置问题在于:你把
input写成了src/index.html这种形式,但 Vite 默认只会在index.html同级目录下找 JS 文件,而且它注入的<script>标签路径是基于 HTML 文件的相对路径,不是按你预期的/assets/xxx.js来生成的。正确的做法是:
1. 确保每个 HTML 文件里显式写好 JS 的引用路径,比如
about.html里得有<script type="module" src="./about.js"></script>(注意是相对路径)2. 把
input的值改成 JS 文件路径,而不是 HTML —— 对,Vite 官方推荐的是input: { index: 'src/index.js', about: 'src/about.js' },然后每个 JS 文件里再import对应的 HTML(或者用html插件)但如果你坚持用 HTML 做入口(虽然不推荐),那得这样配:
然后确保每个 HTML 文件里引用的 JS 路径是相对路径,比如
about.html里写<script type="module" src="./about.js"></script>,并且about.js放在和about.html同级目录下。但更推荐的、也是我现在的项目在用的方案是:用 JS 做入口,HTML 由
vite-plugin-html或vite-plugin-pages来生成,这样不会出现路径错乱的问题。比如:然后在每个
main.js里:或者更干净的做法是用
vite-plugin-pages,自动按src/pages下的文件生成入口,省心不少。总之你那个路径不对的问题,99% 是因为 HTML 里写的 JS 引用路径是绝对路径(比如
/about.js),或者 JS 文件根本没放在对应位置。改用相对路径 + JS 入口,基本就稳了。