CommonJS 规范是一种 JavaScript 模块化的标准,在 Node.js 应用广泛。该规范提供了模块的定义、导出和引用方式,让 JavaScript 代码能够像其他编程语言一样,使用模块化编程方式,以便更好地组织和管理代码。
模块定义
按照 CommonJS 规范,一个模块就是一个 JavaScript 文件,并且每个模块都有自己的作用域,其中所有的变量、函数和对象默认都是私有的,只能在该模块内部使用。为了使用其他模块中的函数、变量和对象,需要将它们显示地导出。
导出模块
使用 exports
对象将模块中的部分代码导出,使用 module.exports
导出整个模块,两种方式即可。
exports
exports
对象是一个异步写入的引用,通过给 exports
对象赋值,可以将变量、函数或对象导出到全局空间供其他模块使用。
举例来说,假设有一个文件叫做 math.js
。里面定义了一个 add
函数:
function add(x, y) {
return x+y;
}
如果想要在另外一个文件中使用这个 add
函数,需要先导出它,可以将它添加到 exports
对象中:
exports.add = add;
这样,在 x.js
或 other.js
中,就可以使用以下方式引用和调用该函数:
var add = require('./math').add;
console.log(add(2, 3));
注意到这里需要通过 require
函数引入模块,并使用模块路径 ./math
获得该模块的信息,然后从该模块的 exports
对象中引入 add
函数。
module.exports
过 module.exports
导出整个模块,可以向其他模块提供一个接口。可以将它理解成是 exports
对象的赋值,只不过直接赋予初始值:
module.exports = {
square: function(x) {
return x * x;
}
}
模块引用
为了在一个模块中引入其他模块中导出的函数和变量,需要使用 require
函数。这个函数将会返回由导出对象组成的一个对象。
var module = require(moduleName);
其中,moduleName
是一个字符串,表示需要引用的模块名或模块路径,require
的返回值是一个对象,表示被引用模块的 exports
对象。
因此,一个完整的例子如下所示,main.js
文件导入了另一个简单的模块类,操作它的函数 add
。假设另一个模块文件叫做 math.js
,保存着一些简单的数学函数:
// math.js
exports.add = function() {
return x + y;
};
在上面的代码中,导出了一个加法函数。
然后,在引用该模块的文件中,可以使用 require
来获取该模块的导出值:
// main.js
var math = require('./math');
console.log(math.add(5, 10));
在上面的代码中,首先使用 require
函数将 math
模块导入,然后通过调用导入的对象上的 add()
函数实现加法。
异步加载
CommonJS 规范中还提出了异步加载的概念。在应用程序执行期间需要持续加载一些额外的数据时,用处很大。
让我们考虑一个简单的示例,其中我们将通过异步加载一个 JavaScript 文件来动态加载一个模块:
// load a module asynchronously
require(['path/to/myModule'], function(myModule) {
var result = myModule.myFunction();
console.log(result);
});
在这个代码片段中,我们使用 require()
函数和一个回调函数来异步加载名为 myModule.js 文件,回调函数将返回一个对象。有了这个对象,我们能够调用我们想要的模块中所有导出的函数和变量。