JavaScript模块中类导出引入须用ESM语法:默认导出(export default class)每模块限一个,导入无大括号;命名导出(export class)支持多类,导入需大括号;可混合使用;动态导入import()返回Promise,需await且路径须静态;须避免ESM与CommonJS混用,Node.js需"type":"module"或.mjs,TS需配置module和esModuleInterop。

在 JavaScript 模块化环境中,类的导出与引入需严格遵循 ES 模块(ESM)语法规范,不能混用 CommonJS 的 module.exports 或 require(),否则会触发语法错误或运行时异常。
默认导出类(export default)
一个模块最多只能有一个默认导出。适用于主要功能类,引入时可自定义名称,语义清晰、使用灵活。
- 导出写法:
export default class MyClass { ... }或先声明再export default MyClass - 引入写法:
import MyClass from './MyClass.js'(注意无大括号) - ⚠️ 注意:默认导出的类在 Node.js 中必须是 .js 文件且启用
"type": "module",或使用.mjs后缀
命名导出类(export class / export { ... })
适合一个文件导出多个相关类(如 Button、Modal、Tooltip),引入时必须用原名或显式重命名。
- 导出写法:
export class Button { ... }或export { Button, Modal } - 引入写法:
import { Button, Modal } from './ui.js'或import { Button as UIButton } from './ui.js' - 可混合使用:支持同时有
export default和多个export,但需避免歧义
动态导入类(import() 表达式)
适用于按需加载、条件加载或拆包场景,返回 Promise,支持 await,常用于路由组件或插件系统。
- 语法:
const { MyClass } = await import('./MyClass.js')或const mod = await import('./MyClass.js'); const instance = new mod.default() - 注意:
import()是异步操作,不能在顶层同步代码中直接new,需包裹在 async 函数或生命周期钩子中 - 浏览器中路径必须是字符串字面量或受控变量(Vite/Webpack 支持静态分析,不支持拼接动态路径如
import(`./${name}.js`)除非明确配置)
兼容性与常见陷阱
实际项目中需兼顾构建工具、运行环境和 TypeScript 类型提示,避免“看似能跑,实则不可靠”的写法。
- Node.js 12+ 支持 ESM,但需
"type": "module"或.mjs;否则import会报错 - 不要在同一个文件里混用
import和require()—— ESM 和 CommonJS 是两种互不兼容的模块系统 - TypeScript 中确保
compilerOptions.module设为nodenext或es2022,并开启esModuleInterop: true以平滑处理默认导入 - 类内部引用自身(如静态方法返回
new this.constructor())不受模块机制影响,但需确保实例化时机正确(如构造函数中不依赖未初始化的导入)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











