ES6模块(ESM)是JavaScript官方标准模块系统,语法简洁、静态可分析,支持顶层await和循环依赖,由ES2015引入,Node.js 12+及现代浏览器稳定支持。

ES6模块(ESM)是JavaScript官方标准的模块系统,语法简洁、静态可分析、支持顶层await和循环依赖处理,由ECMAScript 2015(ES6)正式引入,并在Node.js 12+和现代浏览器中稳定支持。它取代了CommonJS等非标准方案,成为模块化开发的统一基础。
import:静态导入声明
import必须出现在模块顶层(不能在函数或条件块中),且路径必须是字符串字面量(不支持拼接或变量)。它在代码执行前就完成解析和加载,因此能实现Tree-shaking等优化。
-
默认导入:
import React from 'react'—— 导入模块默认导出的值(可重命名,如import ReactDOM from 'react-dom/client') -
具名导入:
import { useState, useEffect } from 'react'—— 解构导入指定的命名导出 -
全部导入:
import * as utils from './utils.js'—— 将所有导出挂载为utils对象的属性(utils.default存在时包含默认导出) -
仅执行模块(无绑定):
import './polyfill.js'—— 加载并运行该模块,但不导入任何值,常用于副作用脚本
export:定义模块对外接口
export同样只能出现在顶层,用于声明哪些内容可被其他模块导入。一个模块可多次使用export,但最多一个export default。
-
命名导出:
export const PI = 3.14; export function add(a, b) { return a + b; }—— 可同时导出多个变量、函数、类 -
默认导出:
export default function App() { ... }或const App = () => {}; export default App;—— 每个模块唯一,导入时不需花括号,更灵活 -
重导出(re-export):
export { foo } from './lib.js'或export { default as Lib } from './lib.js'—— 不引入本地绑定,直接转发导出 -
批量重导出:
export * from './math.js'(不包括default)、export * as math from './math.js'(ES2020+,将整个模块作为命名空间导出)
模块解析与路径规则
ESM对导入路径有明确规范:以/、./、../开头的是相对/绝对路径;不带路径前缀的被视为“bare import”,需由打包工具或运行时(如Node.js的node_modules解析逻辑)处理。
立即学习“Java免费学习笔记(深入)”;
- 浏览器中
import { foo } from 'lodash'会报错,除非用import maps或构建工具;Node.js支持通过package.json的"exports"字段解析 - 文件扩展名必须显式写出:
import { helper } from './utils.js'(不能省略.js,即使实际是.mjs或.cjs) - Node.js中启用ESM需满足任一条件:文件后缀为
.mjs、package.json含"type": "module"、或启动时加--input-type=module
动态import()与高级特性
import()是一个返回Promise的函数,可在任意位置调用(包括条件语句、循环、异步回调),用于按需加载模块,是ESM中唯一的动态导入方式。
-
const module = await import('./chart.js')—— 返回一个命名空间对象,含default和所有命名导出 - 常用于路由懒加载、条件功能加载(如暗色模式组件)、大型库的分块加载
- 配合
top-level await(ES2022),允许在模块顶层直接await import(),简化异步初始化逻辑 - 注意:动态导入不参与静态分析,无法被Tree-shaking,但可触发代码分割(如Webpack/Vite)










