返回

模块规范动态与静态之别:CommonJS vs ES6 Module

前端

CommonJS模块规范

CommonJS模块规范是一种同步的模块加载机制,主要用于Node.js中。它使用require()函数加载模块,并使用module.exports对象导出模块。

// example.js
const fs = require('fs');

module.exports = {
  readFileSync: fs.readFileSync,
  writeFileSync: fs.writeFileSync
};
// main.js
const example = require('./example');

console.log(example.readFileSync('file.txt'));

在CommonJS规范中,模块是通过require()函数动态加载的。当一个模块被加载时,它的代码会被执行,并且导出的对象会被赋值给require()函数的返回值。

ES6 Module模块规范

ES6 Module模块规范是一种静态的模块加载机制,主要用于浏览器中。它使用import语句加载模块,并使用export语句导出模块。

// example.js
export function readFileSync(path) {
  return fs.readFileSync(path);
}

export function writeFileSync(path, data) {
  return fs.writeFileSync(path, data);
}
// main.js
import { readFileSync, writeFileSync } from './example';

console.log(readFileSync('file.txt'));

在ES6 Module规范中,模块是通过import语句静态加载的。当一个模块被加载时,它的代码不会立即执行,而是等到该模块被实际使用时才会执行。

CommonJS和ES6 Module之间的区别

CommonJS和ES6 Module之间存在着一些关键区别,包括:

  • 加载机制: CommonJS使用动态加载,而ES6 Module使用静态加载。
  • 导出方式: CommonJS使用module.exports对象导出模块,而ES6 Module使用export语句导出模块。
  • 作用域: CommonJS模块的作用域是整个文件,而ES6 Module模块的作用域是模块内部。

CommonJS和ES6 Module的应用

CommonJS模块规范主要用于Node.js中,而ES6 Module模块规范主要用于浏览器中。

在Node.js中,CommonJS模块规范是默认的模块规范。可以使用require()函数加载模块,并可以使用module.exports对象导出模块。

在浏览器中,ES6 Module模块规范是默认的模块规范。可以使用import语句加载模块,并可以使用export语句导出模块。

总结

CommonJS和ES6 Module是JavaScript中两种流行的模块规范。两者之间存在着一些关键区别,包括动态加载与静态加载、导出副本与导出引用等。在Node.js中,CommonJS模块规范是默认的模块规范,而在浏览器中,ES6 Module模块规范是默认的模块规范。