前端/移动开发面试题更新 2026-08-05

在 Node.js 环境下,ES6 模块与 CommonJS 模块有哪些主要差异?请从语法、加载机制、导出行为等方面说明。

前端/移动开发技术原理Node.js

考察说明

考查对 Node.js 中两种模块系统的核心差异是否掌握,涉及语法、加载时机、作用域和导出机制。

回答思路

  1. 【回答框架 1】从语法上看,CommonJS 使用 module.exports 或 exports 导出,require 导入;ESM 使用 export 或 export default 导出,import 导入。ESM 是静态结构,import 语句必须位于顶层且不可嵌套在条件中,而 CommonJS 的 require 是运行时调用,可放在任意位置。
  2. 【回答框架 2】加载机制方面,CommonJS 是同步加载,模块在首次 require 时同步执行并缓存结果;ESM 是异步加载,支持顶层 await,模块加载可以分阶段进行,适合网络或磁盘 I/O 场景。Node.js 中 .mjs 文件或 package.json 中 type: module 时启用 ESM。
  3. 【回答框架 3】导出和依赖方面,CommonJS 导出的是值的拷贝,导出后修改原始变量不会影响已加载的模块;ESM 导出的是值的引用,导出模块内部修改会影响所有导入处。此外,CommonJS 模块是单例缓存,多次 require 返回同一对象;ESM 也有缓存机制,但循环依赖处理方式不同,ESM 设计为支持循环依赖,而 CommonJS 在循环依赖时可能出现未初始化的问题。
  4. 【回答框架 4】在作用域与顶层 this 上,CommonJS 的模块顶层 this 指向 exports 对象,而 ESM 的顶层 this 是 undefined。另外,CommonJS 允许在模块中动态拼接模块路径(如变量作为 require 参数),而 ESM 的 import 路径必须是静态字符串,但支持动态 import() 实现按需加载。
  5. 【关键点 1】CommonJS 是同步、动态、值拷贝;ESM 是异步、静态、引用绑定。
  6. 【关键点 2】ESM 的 import 必须在顶层,CommonJS 的 require 可动态调用。
  7. 【关键点 3】Node.js 通过 .mjs 或 package.json 的 type 字段区分模块类型。
  8. 【关键点 4】ESM 支持顶层 await,而 CommonJS 不支持。
  9. 【易错点 1】容易误以为 ESM 不支持循环依赖,实际上 ESM 能处理但需注意变量提升时机。
  10. 【易错点 2】误解 UMD 模块在 Node.js 中的处理方式,需结合环境判断。
  11. 【易错点 3】混用两种模块时要注意 require 不能直接加载 ESM 同步模块,可能导致错误。