在浏览器中使用esmodule必须通过加载,路径需为相对/绝对/完整url且不可省略.js后缀,模块延迟执行、仅执行一次,且要求content-type为application/javascript并遵守cors。

在浏览器中使用 ESModule,必须通过 <script type="module"></script> 标签加载,普通 <script></script> 无法识别 import/export 语法。
必须加 type="module"
浏览器只在 type="module" 的 script 中启用 ES 模块解析:
- 不加该属性,即使写
import也会报语法错误 - 加了之后,脚本自动按模块方式执行:顶层
this是undefined,支持import和export - 示例:
<script type="module" src="./main.js"></script>
模块路径必须是相对、绝对或完整 URL
ESM 不支持裸导入(如 import { foo } from 'lodash'),所有模块路径需明确可定位:
- ✅ 合法:
import utils from './utils.js'、import moment from 'https://cdn.skypack.dev/moment@2' - ❌ 非法:
import { foo } from 'utils'(无扩展名 + 无协议 + 非相对路径) - 注意:.js 后缀不能省略(除非用构建工具或服务器支持 import maps)
模块默认是延迟执行且仅执行一次
type="module" 脚本天然具有 defer 行为:
- 不会阻塞 HTML 解析,但保证按书写顺序执行
- 相同模块 URL 即使被多个
import引用,也只执行一次(模块缓存) - 若需动态加载,可用
import('./module.js')(返回 Promise)
跨域与 MIME 类型要求严格
浏览器对模块脚本有安全限制:
- 本地文件(
file://协议)直接打开会因 CORS 被拒绝,需启动本地服务(如npx serve) - 服务器返回的模块文件必须带
Content-Type: application/javascript,否则报错 - 从其他域名导入时,目标资源需声明
Access-Control-Allow-Origin
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











