document.baseURI最可靠,它直接返回浏览器实际生效的基准URL(已校验<base>合法性并自动fallback到当前页URL),无需手动解析DOM或判断<base>是否存在。

直接读取 document.baseURI 最可靠
浏览器原生提供 document.baseURI,它返回当前页面实际生效的基准 URL(已合并 <base> 的影响),无需手动解析 DOM。这个值在页面加载后即确定,且已处理所有规则:优先取第一个 <base href>,忽略无效值, fallback 到当前页面 URL。
常见错误是用 document.querySelector('base') 再取 href——这会拿到原始字符串,没做合法性校验,比如 href="static/" 这种无效值也会被读出,但浏览器早已静默丢弃它,document.baseURI 则永远反映真实行为。
手动查找 <base> 标签时必须检查 href 合法性
如果确实需要访问 <base> 元素本身(例如调试或 SSR 检查),得先确认它是否真的生效:
-
href必须以https://、http://、//或/开头,否则整个标签被浏览器忽略 -
href以/开头时,结尾必须带斜杠(如/app/),/app在 Firefox 中会被截断成/appcss/ - 必须在
<head>内且是第一个元数据标签;若出现在<body>或<title>之后,不生效 - 多个
<base>时,仅第一个被考虑,控制台可能提示Multiple base elements detected. Only the first one is used.
<base> 不存在时,document.baseURI 就是当前页面 URL
这是最常被忽略的默认逻辑:document.baseURI 不依赖 <base> 是否存在。它始终等于“当前文档解析相对 URL 所用的基准”,也就是:
立即学习“前端免费学习笔记(深入)”;
- 有合法
<base href="https://cdn.example.com/v2/">→document.baseURI === "https://cdn.example.com/v2/" - 有非法
<base href="assets/">→ 标签被丢弃,document.baseURI退回到当前页面 URL(如https://example.com/sub/page.html) - 完全没有
<base>→document.baseURI就是当前页面 URL
所以不要写条件判断“有没有 <base>”,直接用 document.baseURI 即可。
CSS 中的 url() 和 JS 的 fetch() 不共享这个路径
容易误以为 document.baseURI 能统一控制所有路径,但它只作用于 HTML 解析阶段的属性(src、href、form action、CSS url())。JS 运行时的路径完全不受影响:
-
fetch('./api/data.json')始终相对于当前页面 URL,不是document.baseURI -
import('./utils.js')、new Worker('./worker.js')同样不走<base> - CSS 中的
@import "reset.css"也不受控,只有background: url(logo.png)这类url()函数才受影响
这意味着你不能靠 document.baseURI 来拼接 API 地址或动态 import 路径——那些地方必须显式写绝对路径或自己处理前缀。



















