base href必须以http://、https://、//或/开头且结尾带斜杠,否则浏览器静默丢弃;仅影响html解析阶段的相对路径,需与构建配置、前端路由严格一致,否则引发批量404。

base href 必须以 / 开头且结尾带斜杠,否则浏览器静默丢弃
浏览器对 <base> 的校验非常严格:只要 href 值不是以 http://、https://、// 或 / 开头,整条标签就被忽略——控制台零提示,但所有 <img src="logo.png">、<script src="app.js"></script> 全部回退到当前页面 URL 解析,批量 404。
常见无效写法包括:
-
href="subapp/"(缺根斜杠前缀) -
href="../static"(含..) -
href="/subapp"(结尾没斜杠,Firefox/Opera 会截断成/subappcss/app.css)
真正有效的只有两种:
-
href="/subapp/"——根相对路径,结尾斜杠不可省 -
href="https://cdn.example.com/subapp/"——绝对 URL,协议、域名、路径全明确
Vite/Webpack 的 base 或 publicPath 和 HTML 中的 不可共存
构建工具配置和 HTML 标签是两套独立机制,但若值重复,会导致路径被拼两次。比如 Vite 配了 base: '/myapp/',HTML 又写了 <base href="/myapp/">,最终资源路径变成 /myapp//myapp/js/app.js(双斜杠触发 404)。
推荐做法是「二选一」:
- 用构建工具统一注入:Vite 中设
base: '/myapp/',HTML 模板里不写<base>,靠HtmlWebpackPlugin或 Vite 的transformIndexHtml自动插入 - 手写
<base>:则构建配置中base或publicPath必须设为空字符串或'/',避免叠加
注意:Webpack 的 publicPath 默认影响 JS 中的 __webpack_public_path__ 和资源 URL,但它不会自动改写 HTML 中的 <base>,必须显式控制。
Vue Router / React Router v6+ 完全不读 document.baseURI,必须显式配 base
<base href="/myapp/"> 不会让前端路由自动识别子路径。Vue Router 和 React Router v6+ 是运行时 JS 库,它们根本不读 document.baseURI,也不会据此修正导航行为。
漏配任一环节,就会出现“资源加载走 /myapp/js/app.js,点击 Link 却跳到 /home”这种割裂现象:
- 只设
<base href="/myapp/">:JS chunk 加载正常,但router.push('/home')跳到根路径 - 只设 Vue Router 的
createRouter({ base: '/myapp/' }):路由跳转正常,但<script src="index.js"></script>404(实际应在/myapp/index.js)
React Router v6+ 同理:<router basename="/myapp"></router> 必须显式包裹,否则所有 Link to="/home" 都解析为根路径。
Service Worker 和微前端场景下,路径一致性更难保障
一旦引入 Service Worker 预缓存或微前端架构,路径依赖就从「HTML + 路由」扩展到第三甚至第四层:
- Service Worker 缓存策略若写死
self.location.origin + '/myapp/',但 HTML 没配<base>,预缓存路径错位 - 微前端子应用若同时用了 Webpack 的
publicPath和 HTML 的<base>,资源路径可能变成/myapp//myapp/js/app.js - CDN 缓存键若包含路径前缀,而构建产物和 HTML 标签不一致,会导致旧资源被长期缓存
最麻烦的不是某处配错,而是这些环节分布在构建配置、HTML 模板、路由初始化、SW 注册脚本、CDN 策略多个地方——漏掉一个,白屏或 404 就悄无声息地发生。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











