base href必须为绝对URL(如https://cdn.example.com/app/v2.3/)或根相对路径(如/my-project/),且结尾必须带/,否则静默失效导致批量404;它仅影响HTML解析阶段的纯相对路径(如src="logo.png"),不影响fetch、import等运行时路径。

base href 必须写成绝对 URL 或根相对路径结尾带 /
大型项目里,<base href> 写错一个字符就批量 404,而且浏览器完全不报错。常见错误包括:href="assets/"(缺协议和域名)、href="../static"(含 ..)、href="https://cdn.example.com/v2"(结尾没 /)。Firefox 和 Opera 会把 https://cdn.example.com/v2 + css/app.css 拼成 https://cdn.example.com/v2css/app.css,直接挂掉。
生产环境推荐用完整绝对 URL:<base href="https://cdn.example.com/app/v2.3/">;子路径部署(如 GitHub Pages)可用根相对路径:<base href="/my-project/">,但必须确保结尾有 /,且构建工具、路由配置、Service Worker 缓存路径全部对齐。
Vue Router / React Router v6+ 必须和 base 标签配对设置
<base href="/subapp/"> 和前端路由的 base 配置是两套独立机制,只配一个等于白配:
- 只写 HTML 的
<base href="/subapp/">:JS 资源能加载,但router.push('/home')仍跳到/home,不是/subapp/home - 只设 Vue Router 的
base: '/subapp/':路由跳转正常,但<script src="index.js"></script>请求的是/index.js,实际资源在/subapp/index.js,404 - 微前端场景下,Webpack 的
publicPath若也设为/subapp/,三者叠加可能生成/subapp/subapp/js/app.js
哪些路径受 base 影响,哪些完全不受
<base> 只在 HTML 解析阶段生效,只改写标签属性中「纯相对路径」——即不以 /、: 或协议开头的字符串:
立即学习“前端免费学习笔记(深入)”;
✅ 明确受影响:<img src="logo.png" alt="HTML中base标签在大型项目中的应用案例" >、<link href="style.css">、<form action="login.php"></form>、CSS 中的 background: url(avatar.jpg)
把任意文章或文档内容转换成精美的全屏翻页 HTML 演示文件(幻灯片风格)。当用户发来一篇文章、文档链接、Markdown 内容、或粘贴的文本,并且希望生成演示用的 HTML 时触发。支持任意内容来源:iWiki 链接、KM 链接、本地文件路径、直接粘贴的文本。生成的 HTML 文件保存到本地工作区,并通过企微直接发送给用户。触发词示例:帮我把这篇文章做成PPT、转成演示文档、生成HTML幻灯片、做个演示、转成可以演示的格式、article to deck、make a slide。
❌ 完全不受影响:fetch('./api/user')、import('./utils.js')、@import "reset.css"、<iframe src="page.html"></iframe> —— 这些都走 JS/CSS 运行时解析逻辑,<base> 对它们毫无作用
⚠️ 半受影响:document.baseURI 返回 <base href> 值,可用于 new URL('data.json', document.baseURI),但 window.location 和 document.URL 完全不变
Vite / Webpack 构建时 base 配置和 HTML 中手动写 别重复
Vite 的 build.base 和 Webpack 的 publicPath 本质是构建时重写资源路径,而 HTML 中的 <base href> 是运行时解析起点。两者值相同却同时存在,会导致路径被拼两次:
比如 Vite 配了 base: '/admin/',又手动在 HTML 里写 <base href="/admin/">,结果 <script src="index.js"></script> 实际请求变成 /admin//admin/index.js(双斜杠)
推荐做法:构建工具统一管资源前缀,HTML 中不手动写 <base>;只有当需要覆盖构建产物默认行为(如多 CDN 切换、本地开发 proxy 冲突)时,才动态注入或条件渲染 <base>


















