importmap 必须严格使用 type="importmap",置于所有 type="module" 脚本之前且在 head 中;imports 的 key 为裸模块名,value 须为绝对 URL;scopes 的 key 必须是以 / 结尾的路径前缀,仅对匹配路径下发起的 import 生效。

type="importmap" 必须写对,浏览器才认
浏览器只识别 type="importmap" 这个精确字符串,大小写、拼写、引号缺一不可。写成 type="ImportMap"、type="import-map"、type=importmap(漏引号)或 type="application/importmap+json",都会被完全忽略——没有报错,也不生效,后续所有 import 都会报 Failed to resolve module specifier。
验证方式很简单:打开 DevTools → Elements 面板,找到该 <script> 标签,确认其 type 属性值显示为纯文本 importmap,且未被浏览器自动修正或移除。
importmap 必须放在所有 type="module" 脚本之前
顺序就是执行顺序。它必须出现在第一个 <script type="module"> 之前,哪怕只差一行,映射就不会生效。常见错误包括:
-
<script type="module">import _ from 'lodash'</script>写在<script type="importmap">上方 -
<script type="importmap">放在</body>里 - 用
defer或async加载type="module"脚本,却没控制好importmap的解析时机
正确做法是把它塞进 <head> 最顶部,紧贴 <title> 后面,确保它是页面中第一个被解析的 <script>。
立即学习“前端免费学习笔记(深入)”;
imports 的 key 是裸模块名,value 必须是完整 URL
imports 里的键(比如 "lodash")是你 JS 里写的裸模块标识符,值必须是带协议的绝对 URL(如 "https://cdn.skypack.dev/lodash-es@4.17.21")或根路径(如 "/node_modules/lodash-es/index.js")。相对路径("./utils.js")、本地文件路径("./node_modules/...")或不带协议的地址("//cdn.example.com/...")都不行。
还要注意:
- 映射目标必须返回合法 ES 模块(响应头含
Content-Type: application/javascript,且有export声明) - CDN 返回 HTML 页面、UMD 文件(如
react.development.js)或 MIME 类型错误(如text/plain),控制台会报TypeError: Cannot resolve module或Failed to fetch dynamically imported module - 键名大小写敏感:
"Lodash"和"lodash"是两个不同模块
scopes 用于局部映射,路径前缀必须以 / 结尾
当某个子路径下的模块需要特殊依赖版本时(比如组件库内部要用旧版 lit),用 scopes 字段更安全:
{ "imports": { "lit": "https://cdn.skypack.dev/lit@3.0.0" }, "scopes": { "/node_modules/my-widget/": { "lit": "https://cdn.skypack.dev/lit@2.8.0" } } }
注意点:
-
scopes的 key 是发起 import 请求的脚本所在 URL 的**路径前缀**(必须以/结尾),不是包名 - scoped 包(如
@vue/runtime-core)必须完整写出作用域前缀,不能省略@vue/ -
scopes只对从匹配路径下发起的import生效,不影响全局imports
真正容易被忽略的是:scope 映射只在运行时生效,且依赖浏览器对路径前缀的严格匹配——如果模块实际加载路径和 scope key 不完全一致(比如少一个 / 或多一层 dist/),整个 scoped 映射就失效,而且不会报错,只会回退到全局 imports 或直接失败。



















