Vite 部署到子目录后,动态组件的 CSS 不再加载
Vite 8.2.1、8.2.2 同时启用 chunkImportMap 和非根 base 时,可能丢失动态导入的样式依赖。8.3.4 已统一映射基路径,需重新构建并检查真实子目录访问。
页面部署在 /sub/,动态导入的组件能显示内容,却始终没有样式;CSS 文件已经生成,浏览器也没请求它。若同时开启 build.chunkImportMap,应检查导入映射与预加载依赖是否使用了同一段 base。
这条构建期问题出现在 Vite 8.2.1、8.2.2,正式 8.3.4 已修正非根 base 下的 chunk import map 预加载。它不同于样式正在下载时组件提前显示:这里可能根本没有生成要请求这份 CSS 的依赖列表。
写映射和读映射用了不同前缀
触发配置可以很小:
import { defineConfig } from 'vite';
export default defineConfig({
base: '/sub/',
build: { chunkImportMap: true },
});
动态模块再导入自己的 CSS。旧构建把 /sub/ 写入映射键,读回时却从用户的底层选项取 baseUrl,未显式提供时按 / 处理。只裁掉开头一个斜杠后,得到的键还带 sub/,无法与 bundle 中 assets 开头的文件名匹配。
后续依赖查找落空,可能看不到 __vite__mapDeps,动态样式既没有对应请求,也无法靠等待或刷新补出来。缺少这个内部名字只是辅助线索;不同产物优化会改变辅助代码,应以实际依赖引用和请求为准。
保留部署路径,更新构建处理
在兼容范围内采用 Vite 8.3.4 或包含同样修正的正式版本。8.3.5 的实现从解析后的 Vite base 读回映射前缀,与写入时一致。需要重新生成并按原发布流程交付完整资产;只改本机依赖不会改变浏览器已经拿到的旧 JS。
暂时无法更新,且交付系统不依赖 chunk import map 的稳定映射时,可以评估关闭 build.chunkImportMap,让普通动态导入路径处理相关资产。这个选择会改变产物与资源引用,需要连同部署端的映射消费方式检查,不能只关开关而继续使用旧映射文件。
不要把 base 改成 / 来绕开。如果应用真实部署在子目录,根路径会让其他资源指向错误位置。也不要手动在页面硬编码某个带 hash 的 CSS 文件名,下一次构建可能改变它,且会提前加载本应懒加载的样式。
验收要走真实子目录和动态入口
检查原动态模块对应 CSS 已被资产引用,访问 /sub/ 下的真实页面,再触发该组件,确认浏览器请求正确地址、样式生效,映射键与产物能对应。同时保留根路径配置作为定位对照,不能只在根目录预览通过就结束。
若已经出现正确的 stylesheet 请求但加载失败,应继续处理响应、内容类型或部署问题;若请求未完成就显示组件,则属于另一个等待时序。构建期的键映射修正不能替这两类问题提供保证。


