应统一构建配置提取公共CSS,避免多入口各自生成重复文件;浏览器对相同URL的CSS有缓存与去重机制,但动态参数或内联style会导致重复解析。
本质不是“CSS 能不能重复加载”,而是浏览器是否真的会重复请求、重复解析、重复应用。现代浏览器对 有强缓存和样式表去重机制,但前提是 URL 完全一致且未被强制绕过缓存。
/static/css/app.css)在多个 HTML 中通过相同 URL 引入,浏览器只会发起一次网络请求,后续复用缓存资源/static/css/app.css?v=123 和 /static/css/app.css?v=456),会被视为两个不同资源,触发重复下载 标签,无法被缓存,每次 HTML 加载都会重新解析执行构建工具默认行为容易导致多入口各自提取一份 main.css,即使内容完全一样,也会产出多个物理文件并被多次引入。
build.cssCodeSplit 为 true(默认),再配合 build.rollupOptions.output.manualChunks 统一提取公共样式,例如:export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks: {
vendor: ['vue', 'pinia'],
styles: [/\.css$/]
}
}
}
}
})mini-css-extract-plugin 实例,改用单例 + splitChunks.cacheGroups 归并 CSS:optimization: {
splitChunks: {
cacheGroups: {
styles: {
name: 'styles',
type: 'css/mini-extract',
chunks: 'all',
enforce: true
}
}
}
}import './index.css' —— 这会让构建工具认为这是“该入口专属依赖”,破坏复用机会浏览器不提供运行时 API 判断某 CSS 是否已加载并生效,但
可通过 DOM 状态 + URL 去重来规避重复 插入。
function loadCSS(url) {
if (document.querySelector(`link[href="${url}"]`)) return;
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = url;
document.head.appendChild(link);
}https://a.com/a.css 和 //a.com/a.css 在某些浏览器中不被视为相同
不会加重,但可能浪费带宽 —— 如果浏览器已经缓存了该 CSS,HTTP/2 Push 或 仍会触发推送或预加载,而浏览器最终会丢弃重复内容。
立即学习“前端免费学习笔记(深入)”;
as="style" 和 onload 回调,避免阻塞:pageA.css、pageB.css、shared.css 三份,其中两份内容几乎一样 —— 这种重复是物理存在且无法靠浏览器缓存消解的。