<base> 标签会影响 <link rel="preload"> 中纯相对路径(如 href="main.js")的解析,使其按 base 值拼接;但对根相对路径(/static/main.js)、绝对 URL(https://...)无效,且不改变 fetch 等运行时预加载行为。

<base> 标签在资源预加载(如 <link rel="preload">)中**不参与路径解析,也不改变预加载行为本身**。它只影响 HTML 解析阶段对硬编码相对 URL 的拼接起点,而预加载是浏览器根据当前解析上下文主动发起的请求,路径计算逻辑与普通 <link href> 一致——也就是说,<base> 会影响 rel="preload" 的 URL 解析,但仅限于其中写死的相对路径。
preload 的 href 路径是否受 base 影响?
是的,但仅当 href 是纯相对路径时才生效。浏览器在解析 <link rel="preload" href="main.js"> 这类标签时,会像处理 <script src="main.js"> 一样,先查 <base href>,再拼接出完整 URL。
-
<base href="/app/">+<link rel="preload" href="main.js">→ 实际预加载/app/main.js -
<base href="/app/">+<link rel="preload" href="/static/main.js">→ 不受影响,仍是/static/main.js(根相对路径) -
<base href="/app/">+<link rel="preload" href="https://cdn.example.com/main.js">→ 完全不受影响(绝对 URL)
关键点:预加载的路径解析发生在 HTML 解析期,和 <script src> 同一机制,所以 <base> 对它有效;但它不影响 JS 运行时调用 fetch() 或 new Image().src 触发的预加载逻辑。
为什么 preload 有时 404 却查不到 base 配置问题?
常见原因是 <base href> 值非法,导致浏览器静默忽略该标签,所有相对路径回退到按当前页面 URL 解析,而你误以为它生效了。
立即学习“前端免费学习笔记(深入)”;
使用 Puppeteer + Chrome 将 HTML 渲染为中文 PDF,自动处理图表等待、Tab 展开、动画、测高、白边消除、防分页,适用于看板、报表、网页和交互图表转 PDF。
-
<base href="assets/">→ 无效(缺协议或根斜杠),href="main.js"实际请求/current/path/main.js,不是/assets/main.js -
<base href="/app">(结尾无/)→ Firefox 可能截断为/appcss/,使href="style.css"错拼成/appcss/style.css - 构建产物中
<base href="/subpath/">已写入,但 CDN 缓存了旧 HTML,仍返回无<base>的版本
验证方法:打开 DevTools → Network 标签页,看预加载请求的真实 URL,再比对 HTML 源码中的 <base> 和 <link rel="preload"> 的原始值。
SPA 场景下 preload 和 base 的协同陷阱
单页应用常同时配置 <base href="/subpath/">、Vue Router 的 base: '/subpath/'、Webpack 的 publicPath: '/subpath/'。三者若不一致,preload 就会加载错位置。
- 只设
<base href="/subpath/">,但 WebpackpublicPath: '/'→ 构建出的main.js实际放在/main.js,而 preload 请求/subpath/main.js→ 404 - 只设 Webpack
publicPath: '/subpath/',但漏掉<base>→ HTML 中<script src="main.js">请求/main.js(404),而 preload 因无<base>也请求/main.js,看似“同步失败”,实则掩盖了根本问题 - Vite 用户注意:
build.base配置会自动注入<base href>,若手动再写一个,可能重复拼接
真正麻烦的不是某一处配错,而是 Network 面板里看到的 preload 请求 URL 看似合理,但对应资源实际部署在另一套路径体系下——比如 Service Worker 缓存的是 /subpath/main.js,而 HTML 里写的 preload 是 main.js,结果缓存命中却加载失败。
最容易被忽略的是:预加载路径一旦拼错,浏览器不会报错,只会静默失败;而你盯着 console 和 network 看半天,发现所有 JS/CSS 都正常加载,唯独 preload 显示 canceled 或 pending,这时候该回头检查 <base> 是否合法、是否被缓存覆盖、是否和构建配置对齐。


















