ESModule是JavaScript官方标准模块系统,通过import/export实现复用与封装,支持命名导出、默认导出及多种导入方式,需静态声明依赖且不可与CommonJS混用。

ESModule(ECMAScript Module)是 JavaScript 官方标准的模块系统,通过 import 和 export 实现代码复用与封装。它在浏览器和现代 Node.js(v12+ 默认支持)中原生可用,语法清晰、静态分析友好,是当前主流的模块方案。
export:导出模块内容
一个模块可以导出变量、函数、类或默认值,供其他模块使用。导出方式分命名导出和默认导出两种。
-
命名导出:用
export关键字直接导出多个标识符,导入时需用对应名称(可重命名)
例如:export const PI = 3.14;<br>export function add(a, b) { return a + b; }<br>export class Calculator { ... } -
批量命名导出:用
export { ... }集中导出已声明的变量const name = "Alice";<br>function greet() { return `Hello ${name}`; }<br>export { name, greet }; -
默认导出:每个模块最多一个
export default,导入时可自定义任意名称export default function() { console.log("default"); }或export default class App {...}
import:导入模块内容
导入必须在模块顶层(不能在函数或条件中),且路径需明确(相对路径如 ./utils.js,或绝对路径、包名)。
-
导入命名导出:用大括号指定名称,支持别名(
as)import { PI, add as sum } from './math.js'; -
导入全部命名导出:用
*收集为命名空间对象import * as math from './math.js'; // math.PI, math.add() -
导入默认导出:不加括号,名称可任意取
import myFunc from './main.js'; // 注意:无大括号 -
同时导入默认 + 命名:默认在前,命名在后,用逗号分隔
import main, { PI, add } from './math.js';
注意事项与常见写法
ESModule 是静态语法,解析阶段就确定依赖关系,因此不能动态 import 变量路径(但可用 import() 动态函数实现按需加载)。
立即学习“Java免费学习笔记(深入)”;
- 文件扩展名通常为
.js,但浏览器中需显式声明type="module":<script type="module" src="main.js"></script> - Node.js 中需在
package.json设置"type": "module",或使用.mjs后缀 - 不能混用
require()和import(CommonJS 与 ESM 不互通) - 顶层
this在 ESM 中为undefined,而非window或globalThis
简单示例:一个完整流程
假设项目结构:index.html → main.js → utils.js
-
utils.js:export const VERSION = "1.0";<br>export function log(msg) { console.log("[UTIL]", msg); }<br>export default function init() { console.log("Ready!"); } -
main.js:import init, { VERSION, log } from './utils.js';<br>init(); // Ready!<br>console.log(VERSION); // 1.0<br>log("test"); // [UTIL] test -
index.html:<script type="module" src="./main.js"></script>


















