1.什么是module;##
Node.js 有一个简单的模块加载系统。 在 Node.js 中,文件和模块是一一对应的(每个文件被视为一个独立的模块)。
举例:
1.js文件代码如下:
const circle = require('./2.js');
console.log(`半径为 4 的圆的面积是 ${circle.area(4)}`);
在第一行中,1.js 加载了同一目录下的 2.js 模块。
2.js文件代码如下:
const PI = Math.PI;
exports.area = (r) => PI * r * r;
exports.circumference = (r) => 2 * PI * r;
我们执行node 1.js
,控制台运行显示:
2.js 模块导出了 area() 和 circumference() 两个函数。 要想添加函数和对象到模块根,可以将它们添加到特殊的 exports 对象。
模块内的本地变量是私有的,在这个例子中,变量 PI是 2.js私有的。
如果希望模块根导出为一个函数(比如构造函数)或一次导出一个完整的对象而不是每次都创建一个属性,可以把它赋值给 module.exports 而不是 exports。
那么1.js 改写成:
const square = require('./square.js');
var mySquare = square(2);
console.log(`正方形的面积是 ${mySquare.area()}`);
那么2.js 改写成:
module.exports = (width) => {
return {
area: () => width * width
};
}
2.访问主模块##
当 Node.js 直接运行一个文件时,require.main 会被设为它的 module。 这意味着你可以通过如下检测直接确定一个文件是否已运行:
require.main === module
对于1.js 文件,如果通过 node 1.js 运行则为 true,但如果通过 require('./2.js') 运行则为 false。
因为 module 提供了一个 filename 属性(通常等同于 __filename),所以可以通过检查 require.main.filename 来获取当前应用程序的入口点。
核心模块##
Node.js 有些模块会被编译成二进制。 这些模块别的地方有更详细的描述。核心模块定义在 Node.js 源代码的 lib/目录下。require()总是会优先加载核心模块。 例如,require('http')始终返回内置的 HTTP 模块,即使有同名文件。
文件模块##
如果按确切的文件名没有找到模块,则 Node.js 会尝试带上 .js、.json
或 .node 拓展名再加载。
.js文件会被解析为 JavaScript 文本文件,.json文件会被解析为 JSON 文本文件。 .node文件会被解析为通过 dlopen加载的编译后的插件模块。以 '/' 为前缀的模块是文件的绝对路径。 例如require('/home/marco/foo.js')会加载 /home/marco/foo.js文件。
以 './'为前缀的模块是相对于调用 require()的文件的。 也就是说,circle.js必须和 foo.js在同一目录下以便于 require('./circle')找到它。
当没有以 '/'、'./'或 '../'开头来表示文件时,这个模块必须是一个核心模块或加载自 node_modules 目录。如果给定的路径不存在,则 require() 会抛出一个 code属性为 'MODULE_NOT_FOUND'的 Error。