type="importmap"必须精确书写,拼错则静默失效;须置于所有type="module"脚本之前;映射值需为完整URL或合法相对路径且返回ESM;JSON须严格双引号、无注释尾逗号。

type="importmap"必须写对,拼错就静默失效
浏览器只认type="importmap"这个精确字符串——不是application/importmap,不是text/importmap,更不是importmap(漏引号)或ImportMap(大小写错)。写错任何一处,整个 script 块被忽略,不报错、不警告,但后续所有 import 都会报 Failed to resolve module specifier。
常见错误包括:
-
<script type="application/importmap">→ ❌ 浏览器当普通脚本处理,JSON 被当作 JS 执行,直接 SyntaxError -
<script type=importmap>→ ❌ 缺少引号,HTML 解析失败,标签被截断 -
<script type="importmap " >→ ❌ 末尾空格导致类型不匹配
importmap 必须放在所有 type="module" 脚本之前
它不是“配置”,而是“前置声明”:浏览器按 HTML 顺序解析,遇到 import 语句时,必须已加载并解析完 importmap。放错位置等于没写。
正确顺序示例:
立即学习“前端免费学习笔记(深入)”;
<script type="importmap">
{
"imports": {
"lodash": "https://cdn.jsdelivr.net/npm/lodash@4.17.21/+esm",
"utils": "./src/utils.js"
}
}</script>
<script type="module">
import _ from 'lodash';
import { log } from 'utils';
</script>
错误做法:
- 把
<script type="module">放在<script type="importmap">上方 - 把 importmap 放在
</body>里(哪怕紧贴开头) - 用
defer或async加载 importmap —— 它不支持这两个属性
映射值必须是完整 URL 或合法相对路径
键名(如 "lodash")是裸模块名;值(如 "https://..." 或 "./src/utils.js")必须能被浏览器直接 fetch 到,且返回内容是合法 ES 模块。
注意以下限制:
-
"lodash": "lodash.js"→ ❌ 无协议、无根斜杠,被忽略 -
"lodash": "/js/lodash.esm.js"→ ✅ 绝对路径,从站点根目录解析 -
"lodash": "./vendor/lodash.min.js"→ ✅ 相对路径,从当前 HTML 文件所在目录解析 -
"lodash": "https://cdn.jsdelivr.net/npm/lodash@4.17.21"→ ❌ 默认返回 CommonJS,运行时报Cannot assign to read only property 'exports' -
"lodash": "https://cdn.jsdelivr.net/npm/lodash@4.17.21/+esm"→ ✅ 显式请求 ESM 版本
本地文件还要求服务器返回 Content-Type: application/javascript,否则即使路径对也报错。
JSON 内容不能有注释、尾逗号、单引号或变量
importmap 的 JSON 是严格解析的:只接受双引号、无注释、无尾逗号、顶层只有 imports(或加 scopes),不能嵌套其他字段。
这些都会导致整个映射静默失效:
-
// 注释→ ❌ -
"lodash": "...",(末尾逗号)→ ❌ -
'lodash': '...'(单引号)→ ❌ -
"imports": { ... }, "version": "1.0"(多余字段)→ ❌ -
"lodash": `${cdn}/lodash`(模板字符串)→ ❌,不是静态 JSON
scopes 功能虽可用,但 key 必须是以 /、./ 或 ../ 开头的路径,不支持通配符,匹配依据是导入语句的引用者路径,不是被导入模块路径。



















