<base> 标签必须为绝对 URL 或根相对路径(以 / 结尾),且须置于 <head> 最顶部唯一声明;仅影响 HTML 中硬编码的相对 URL(如 src、href),不影响 JS 动态请求、CSS 路径及 iframe;SPA 部署子路径时需与路由 base 和构建 publicPath 三者协同。

<base> 标签不是“设个路径就完事”的配置,它用错会静默失效、大面积 404,且控制台不报任何错误。
base href 必须是绝对 URL 或根相对路径,否则浏览器直接丢弃
浏览器只认以 http://、https://、// 或 / 开头的 href 值。其他写法——比如 static/、../assets、https://example.com(结尾没 /)——整条 <base> 都被忽略,不警告、不报错,但所有 src="logo.png" 仍按当前页面 URL 拼接,上线后必 404。
✅ 正确写法只有三类:
-
<base href="https://cdn.example.com/v3/">(推荐,部署可控,跨环境稳定) -
<base href="/myapp/">(根相对路径,结尾必须带/) -
<base href="//cdn.example.com/v3/">(协议相对,自动继承当前协议)
❌ 常见无效写法:
立即学习“前端免费学习笔记(深入)”;
-
<base href="assets/">(缺协议、缺根斜杠) -
<base href="%PUBLIC_URL%/">(构建未替换,字面量发到浏览器) -
<base href="/myapp">(结尾没/,Firefox 可能截断成/myappcss/)
base 必须放在 <head> 最顶部,且只能有一个
<base> 的作用是重置 HTML 解析器对后续所有相对 URL 的基准起点,所以它必须是 <head> 中第一个元数据类标签。放错位置或重复声明,直接失效或静默降级。
典型翻车场景:
-
<body><base href="/static/"></body>(被完全忽略) - SSR 模板拼接时,
header和page各 render 一个<base>(只有第一个生效,控制台可能提示Multiple base elements detected. Only the first one is used.) -
<head><title>My Page</title><link href="style.css"><base href="/app/"></head>(style.css不受<base>影响)
正确顺序示例:
<head> <base href="/myapp/"> <title>My Page</title> <link href="style.css"> <img src="logo.png"> </head>
哪些属性真受影响,哪些完全不管
<base> 只在 HTML 解析阶段起作用,仅重写硬编码在标签属性里的纯相对路径(即不以 /、: 或协议开头的值)。
✅ 明确受影响:
<img src="logo.png"><link href="style.css"><script src="index.js"><form action="login.php">- CSS 中的
background: url(avatar.jpg)
❌ 完全不受影响:
fetch('./api/user')import('./utils.js')new Worker('./worker.js')- CSS
@import "reset.css" -
<iframe src="page.html">(动态加载,不走<base>)
⚠️ 半受影响:
-
document.baseURI返回<base href>的值,可用于new URL('data.json', document.baseURI);但window.location和document.URL完全不变
SPA 部署子路径时,base 标签和前端路由必须配对设置
<base href="/subpath/"> 和 Vue Router 的 base: '/subpath/' 是两套独立机制,缺一不可。
只设 <base href="/subpath/">:JS chunk 能加载,但 router.push('/home') 会跳到 /home(根路径),不是 /subpath/home;
只设 Vue Router base:路由跳转正常,但 <script src="index.js"> 404(找不到 /index.js,实际应在 /subpath/index.js)。
微前端场景下还要小心 Webpack 的 publicPath,三者重复拼接会导致路径变成 /subpath/subpath/js/app.js。
真正麻烦的不是配置本身,而是构建产物、CDN 缓存、Service Worker 预缓存路径全部依赖这个前缀的一致性——漏掉一个环节,就出现资源加载失败。



















