出现时间: 2009年
背景: 在Node.js诞生之前,JavaScript主要作为浏览器端的脚本语言存在,缺乏模块化的概念。随着Node.js的兴起,服务器端JavaScript开发逐渐流行,但JavaScript的规范远远落后且存在诸多缺陷,如缺乏模块系统、标准库较少等。为了弥补这些缺陷,Mozilla的工程师Kevin Dangoor在2009年提出了CommonJS规范,旨在构建更好的JavaScript生态系统,包括服务器端和浏览器端。
简要概述
CommonJS规范定义了服务器端JavaScript的模块化机制,使用require和module.exports来导入和导出模块。它主要针对服务端开发,支持同步加载模块。
特点
为服务器端JavaScript提供了一个基本的模块系统。它允许你定义模块、导出模块的API以及在其他模块中导入这些API。CommonJS规范的核心思想是每个文件都是一个模块,有自己的作用域。模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。
- 同步加载模块,模块输出的是一个值的拷贝,而不是引用。
- 简单易用,可以在服务器端和客户端使用(但在浏览器端需要转换)。
优点
- 简单易用,代码可复用于Node.js环境下。
- 通过Npm发布的很多第三方模块都采用了CommonJS规范。
缺点
- 不能异步加载模块,因此在浏览器端使用时需要使用打包工具进行转换。
- 同步加载可能导致浏览器端性能问题。
例子
- 假设我们有一个名为
mathFunctions.js
的模块,它定义了一些数学函数:
// mathFunctions.js
// 定义一个加法函数
function add(x, y) {
return x + y;
}
// 定义一个减法函数
function subtract(x, y) {
return x - y;
}
// 导出这两个函数
module.exports.add = add;
module.exports.subtract = subtract;
- 然后,在另一个文件中,我们可以使用require函数来导入并使用这个模块:
// main.js
// 导入mathFunctions模块
const mathFunctions = require('./mathFunctions');
// 使用mathFunctions模块中的函数
console.log(mathFunctions.add(2, 3)); // 输出:5
console.log(mathFunctions.subtract(5, 2)); // 输出:3
评论区