importmap 的 type 值必须是 "importmap",且必须置于所有模块脚本之前、head 中静态声明;映射值需为有效 URL,不支持动态更新或影响非模块脚本。

importmap 的 type 值必须是 "importmap"
不是 "module",也不是 "json",更不能省略或写成 "import-map"。浏览器只认 type="importmap" 这个精确字符串,否则整个映射会被忽略,后续 import 仍按默认路径解析,报 404 或 TypeError: Failed to resolve module specifier。
正确写法:
<script type="importmap">
{
"imports": {
"lodash": "./node_modules/lodash-es/index.js"
}
}</script>
importmap 必须在所有模块脚本之前加载
浏览器按顺序解析 HTML,importmap 需在任何 type="module" 脚本之前声明,否则映射对它们无效。常见错误是把 importmap 放在 </body> 底部,而模块脚本在 <head> 中——这时模块已开始解析,映射还没读到。
- ✅ 推荐位置:放在
<head>最顶部,紧贴<title>后 - ❌ 不要放在
<body>里,除非你确认所有模块脚本都带defer且在它之后 - ⚠️ 动态插入
<script type="importmap">无效 —— 浏览器只处理初始 HTML 解析时的静态importmap
映射目标路径必须是有效模块 URL,且支持同源或 CORS
importmap 里的值不是文件系统路径,而是浏览器可 fetch 的 URL。本地开发时常用相对路径(如 "./utils.js"),但要注意:
立即学习“前端免费学习笔记(深入)”;
- 路径必须以
"./"、"../"或"/"开头,不能是裸名(如"utils")除非已在imports中显式映射 - 指向 CDN 时需确保服务端返回
Content-Type: application/javascript,且允许跨域(Access-Control-Allow-Origin: *) - Node.js 风格包名(如
"react")不会自动解析为node_modules,必须手动映射到具体入口文件,例如:"react": "https://esm.sh/react@18"
importmap 不支持嵌套或动态更新,也不触发重新解析已有 import
一旦页面加载完成,importmap 内容就固定了。你不能用 JS 修改它并期望已 import 的模块重载,也不能在运行时追加新映射。
如果需要条件加载或环境切换:
- 用构建工具(如 Vite、Rollup)预生成不同
importmap片段,按环境注入 - 避免依赖运行时修改;改用
import()动态导入配合完整 URL,绕过映射限制 - 注意:多个
<script type="importmap">会合并,但后出现的同 key 会覆盖前面的 —— 别依赖这个行为,只用一个
最常被忽略的是:映射只影响 import 语句和 import() 表达式,不影响 <script src> 或非模块脚本。别指望它能“重定向”传统 script 标签的加载路径。



















