importmap需在head中用声明,内容为JSON格式imports对象,且必须位于所有type="module"脚本之前;映射URL须指向有效ES模块,内联脚本需加type="module"才可import。
importmap 在 HTML 里怎么写才有效
直接在 里放 <script type="importmap"></script>,浏览器才能识别——漏掉 type="importmap" 或放错位置(比如放在 底部),整个映射就失效,后续 import 会报 failed to resolve module specifier。
- 必须是
<script type="importmap"></script>,不能是text/json或其他类型 - 必须在任何使用
import的模块脚本之前加载(顺序很重要) - 内容必须是合法 JSON,且顶层是对象,
imports是唯一受支持的字段(Chrome 115+、Firefox 119+、Safari 16.4+ 支持;Edge 同 Chrome) - 示例:
<script type="importmap"> { "imports": { "lodash": "https://cdn.jsdelivr.net/npm/lodash@4.17.21/+esm", "utils": "./lib/utils.js" } }</script>
importmap 里的路径为什么总 404
映射值(即 URL)必须指向一个实际可访问、返回 application/javascript 或 text/javascript 的 ES 模块文件;如果服务端没配 MIME 类型、路径拼错、或 CDN 返回了 HTML 页面(比如 404 页面),浏览器就会静默失败或报 TypeError: Failed to fetch dynamically imported module。
- 优先用带有
+esm后缀的 unpkg / jsDelivr 链接(如https://cdn.jsdelivr.net/npm/react@18.2.0/+esm),避免 CJS 包被错误解析 - 本地路径(如
"./foo.js")必须和 HTML 文件同源,且服务器要能正确返回 JS 文件(不能是 404 或目录列表) - 不支持通配符、相对协议(
//)、或动态表达式;"lodash/cloneDeep"这种子路径必须显式声明,或依赖包自身导出的exports字段(但 importmap 不解析它)
想在内联 script 里 import,为什么报错 SyntaxError
内联 <script></script> 默认不是模块环境,即使写了 import 也会语法报错;必须加 type="module" 才能启用 ES 模块解析,这时 importmap 才生效。
- 错误写法:
<script>import _ from 'lodash';</script>→Uncaught SyntaxError: Cannot use import statement outside a module - 正确写法:
<script type="module">import _ from 'lodash'; console.log(_.VERSION);</script> - 注意:
type="module"脚本默认是defer行为,不会阻塞 HTML 解析,但也不保证执行顺序早于其他模块脚本 - 不能混用:带
type="module"的脚本无法直接访问非模块脚本里的变量(比如var foo = 1)
importmap 和 npm package.json 的 exports 冲突吗
不冲突,但 importmap 完全绕过了 package.json#exports —— 它只做字符串替换,把导入名硬替换成你指定的 URL,不管目标模块有没有导出、导出什么、是否符合规范。
- 比如你映射
"react": "./fake-react.js",就算这个文件里没导出default或createElement,浏览器也照常请求并执行,报错会出现在运行时而非解析时 - 这意味着:你得自己确保映射后的资源是可用的 ES 模块,且导出接口匹配代码调用(例如
import { useState } from 'react'要求目标文件有具名导出useState) - 没有版本管理能力:importmap 不像 npm 那样能自动解析
^或~,所有版本都得手动写死 URL
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











