Node.js 模块系统中,每个文件都被视为一个独立的模块。

模块封装器

在执行模块代码之前,Node.js 会使用一个如下的函数封装器将其封装:

  1. (function(exports, require, module, __filename, __dirname) {
  2. // 模块的代码实际上在这里
  3. });

通过这样做,Node.js 实现了以下几点:

  • 它保持了顶层的变量(用 varconstlet 定义)作用在模块范围内,而不是全局对象。
  • 它有助于提供一些看似全局的但实际上是模块特定的变量,例如:
    • 实现者可以用于从模块中导出值的 moduleexports 对象。
    • 包含模块绝对文件名和目录路径的快捷变量 __filename__dirname

exports与module.exports

exports仅仅是module.exports的一个地址引用。nodejs只会导出module.exports的指向,如果exports指向变了,那就仅仅是exports不在指向module.exports,于是不会再被导出

var a = new Object();//a相当于module.exports
var b = a; //b相当于exports


注意:
1.最好别分别定义module.exports和exports
2.NodeJs开发者建议导出对象用module.exports,导出多个方法和变量用exports

导入moudule

举个文件A和文件B,文件B导入文件A的场景:
文件A

const { PI } = Math;
exports.area = (r) => PI * r ** 2;
exports.circumference = (r) => 2 * PI * r;

文件B

const circle = require('./circle.js');
console.log(`半径为 4 的圆的面积是 ${circle.area(4)}`);