NodeJS教程

CommonJS 规范

Preview
  • 模块定义
  • 导出模块
  • 模块引用
  • 异步加载

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.jsother.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 文件,回调函数将返回一个对象。有了这个对象,我们能够调用我们想要的模块中所有导出的函数和变量。