Nodejs拥有一套简单的模块加载系统,在Nodejs里面文件和模块是一一对应的关系。例如:foo.js
加载了同一个目录下的circle.js
文件。
circle.js
文件内容:
const PI = Math.PI;
exports.area = (r) => PI*r*r;
exports.circumference = (r) => 2*PI*r;
foo.js
文件内容:
const circle = require('./circle.js');
console.log(`the area of radius 4 is ${circle.area(4)}`);
circle
模块导出了area
和circumference
函数,为了根模块能够引用到它,你可以把它们添加到exports
对象上。
模块内部的局部变量都是私有的, 因为每个模块都被封装在一个函数内部。上面的例中PI
就是属于circle
模块的局部变量。
如果你希望导出一个函数或者一个对象,你应该把该函数或者对象赋值给module.exports
而不是exports
。
访问主模块
如果一个模块直接通过Node.js
启动运行,require.main
将会设置为该模块。你可以通过如下方式测试当前模块是否为主模块:
console.log(require.main === module);
举个例子,对于foo.js
文件,如果通过nodejs foo.js
运行,那么该测试将会输出true
, 如果通过require('foo.js')
,测试将输出false
。
由于每个module
对象都有一个filename
属性,也可以通过require.main.filename
查看主模块文件名。
模块加载
当我们调用require
加载外部文件的时候,将会调用require.resolve
函数。具体的解析规则如下:
在Y目录下的模块调用require(X)
- 1 . 如果X是一个内建核心模块,
a. 返回该模块
b. 停止执行
- 2. 如果X使用`./`或者`/`或者`../`开头
a. 把(Y+X)作为文件路径来加载(LOAD_AS_FILE)
b. 把(Y+X)作为目录路径来加载(