base标签只能在html解析阶段生效,js无法动态修改其效果;它仅影响html中纯相对路径的解析,对js/css中的路径无作用。

浏览器只在 HTML 解析阶段读取第一个 <base href="">,之后插入、替换或修改该标签,对已解析的资源(src、href、CSS 中的 url())完全无效。所谓“动态预览环境”里用 JS 改 <base>,结果只会是 404 静默失败。
<base> 的位置和写法必须严格合规
-
<base>必须出现在内,且必须在所有依赖它的标签之前(如<link>、<script></script>、<img>) - 常见错误:
- 把
<base href="dist/">写成相对路径片段 → 浏览器直接忽略整条标签 - 写成
<base href="../public/">→ 非法值,失效 - 放在
<title></title>后面 →<title></title>已按原始 URL 解析完毕,不受影响 - 多个组件重复注入(如 Vue 中 v-html 渲染出多个
<base>)→ 只有第一个生效,Chrome 控制台提示:Multiple base elements detected. Only the first one is used.
- 把
预览环境要换 base 路径,必须在 HTML 输出前确定
服务端或构建时注入才是唯一可靠方式:
Express/Nunjucks 模板中:
<base href="%7B%7B%20previewBase%20%7D%7D">,确保previewBase是绝对 URL(如@#@#@#@#@#@#@#@#@#@0)或合法根相对路径(如/preview/v2/,结尾必须带斜杠)Vite 项目中:配置
base: '/staging/',并让 HTML 模板使用<base href="%BASE%">,由构建插件替换GitHub Pages 子目录部署(如
@#@#@#@#@#@#@#@#@#@1):
直接写死<base href="/my-app/">,同时确认所有资源引用是纯相对路径(如js/app.js),不要用../或assets/这类非根相对写法
<base> 不控制 JS/CSS 内部路径,别混淆作用域
它只影响 HTML 属性中「纯相对路径」的解析行为:
✅
<img src="logo.png">→ 解析为/preview/logo.png✅
<link href="style.css">→ 解析为/preview/style.css✅ CSS 中
background: url(avatar.jpg)→ 也会被重写为/preview/avatar.jpg(这是唯一穿透到 CSS 的情况)❌
fetch('./api/data.json')→ 仍发向当前页面 URL 所在路径,与<base>无关❌
import('./utils.js')→ 由打包工具(Vite/Webpack)resolve,运行时不受影响❌
window.location.href = 'about.html'→ JS 字符串跳转不走 base 解析逻辑
真正容易被忽略的是:很多人以为改了 <base> 就能一揽子解决所有路径问题,其实它只管 HTML 层的静态属性解析,JS 和 CSS 的模块化路径、API 请求、路由跳转都得单独处理。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











