模块系统

概述

为了让 Node.js 的文件可以相互调用,Node.js 提供了一个简单的模块系统。

模块是 Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是 JavaScript 代码、JSON 或者编译过的C/C++ 扩展。

创建模块

创建一个模块非常简单,举个例子。

创建一个叫 hello 的模块,只需要创建 hello.js 文件,代码如下:

1
exports.world = () => { console.log('Hello World'); }

这样,其他文件包含这个文件时,就可以访问到 world 这个函数了。

如果我们希望直接封装一个对象,可以直接给 module.exports 这个变量赋值。比如:

1
2
3
4
5
6
function Hello() {
    var name; 
    this.setName = thyName => { name = thyName; };  
}; 

module.exports = Hello;

js 模块的编译在编译的过程中,Node 对获取的 javascript 文件内容进行了头尾包装,将文件内容包装在一个 function 中:

1
2
3
4
(function (exports, require, module, __filename, __dirname) {
	//...
  return module.exports;
})

文件模块与原生模块

核心(原生)模块是指那些随 Node.js 安装而安装的模块,这些模块在 Node.js 源代码编译时被编译成二进制执行文件。相比文件模块,核心(原生)模块的加载速度更快。

可以参考,其他人整理的原生模块列表

文件模块的文件名有三种表示方式:/ 绝对路径、./ 调用 require 函数文件的位置、直接使用模块名会寻找 node_module 与核心模块。

查找的优先级顺序如下图所示:

../nodejs-require-order.jpg