ES6中的模块(通常称为ES模块或ESM)与CommonJS模块在语法、加载机制和行为上有显著的区别。
以下是它们之间的一些主要差异:
-
语法:
- ES模块:使用
import
和export
关键字来导入和导出模块。// 导出 export function sayHello() { console.log('Hello, world!'); } // 导入 import { sayHello } from './myModule.js';
- CommonJS:使用
require
来导入模块,使用module.exports
或exports
来导出模块。// 导出 module.exports = { sayHello: function() { console.log('Hello, world!'); } }; // 导入 const myModule = require('./myModule');
- ES模块:使用
-
加载机制:
- ES模块:支持静态加载,即模块的导入和导出语句必须在顶层作用域中,不能在函数或块级作用域中。这允许在编译时进行静态分析和优化。
- CommonJS:支持动态加载,
require
可以在任何地方调用,包括函数和条件语句中。
-
异步加载:
- ES模块:设计为异步加载,适合浏览器环境,可以利用浏览器的异步特性。
- CommonJS:通常是同步加载,适合服务端环境,因为模块通常都在本地磁盘上,加载速度快。
-
导出:
- ES模块:导出的是绑定,即导出的值与模块内部的值是实时绑定的,如果模块内部的值发生变化,导入的地方也会看到变化。
- CommonJS:导出的是值的拷贝,如果模块内部的值发生变化,导入的地方不会看到变化。
-
动态导入:
- ES模块:支持动态导入,可以使用
import()
函数在运行时动态加载模块。 - CommonJS:不支持动态导入,
require
是同步的,不能在运行时动态决定加载哪个模块。
- ES模块:支持动态导入,可以使用
-
环境支持:
- ES模块:从ES6开始被标准化,现代浏览器和Node.js都支持ES模块,但需要特定的文件扩展名(如
.mjs
)或配置来区分ES模块和CommonJS模块。 - CommonJS:主要用于Node.js环境,是Node.js的默认模块系统。
- ES模块:从ES6开始被标准化,现代浏览器和Node.js都支持ES模块,但需要特定的文件扩展名(如