1.什么是module;##
Node.js 有一個簡單的模塊加載系統(tǒng)。 在 Node.js 中,文件和模塊是一一對應(yīng)的(每個文件被視為一個獨立的模塊)。
舉例:
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;
我們執(zhí)行node 1.js,控制臺運行顯示:

2.js 模塊導(dǎo)出了 area() 和 circumference() 兩個函數(shù)。 要想添加函數(shù)和對象到模塊根,可以將它們添加到特殊的 exports 對象。
模塊內(nèi)的本地變量是私有的,在這個例子中,變量 PI是 2.js私有的。
如果希望模塊根導(dǎo)出為一個函數(shù)(比如構(gòu)造函數(shù))或一次導(dǎo)出一個完整的對象而不是每次都創(chuàng)建一個屬性,可以把它賦值給 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.訪問主模塊##
當(dāng) Node.js 直接運行一個文件時,require.main 會被設(shè)為它的 module。 這意味著你可以通過如下檢測直接確定一個文件是否已運行:
require.main === module
對于1.js 文件,如果通過 node 1.js 運行則為 true,但如果通過 require('./2.js') 運行則為 false。
因為 module 提供了一個 filename 屬性(通常等同于 __filename),所以可以通過檢查 require.main.filename 來獲取當(dāng)前應(yīng)用程序的入口點。
核心模塊##
Node.js 有些模塊會被編譯成二進(jìn)制。 這些模塊別的地方有更詳細(xì)的描述。核心模塊定義在 Node.js 源代碼的 lib/目錄下。require()總是會優(yōu)先加載核心模塊。 例如,require('http')始終返回內(nèi)置的 HTTP 模塊,即使有同名文件。
文件模塊##
如果按確切的文件名沒有找到模塊,則 Node.js 會嘗試帶上 .js、.json
或 .node 拓展名再加載。
.js文件會被解析為 JavaScript 文本文件,.json文件會被解析為 JSON 文本文件。 .node文件會被解析為通過 dlopen加載的編譯后的插件模塊。以 '/' 為前綴的模塊是文件的絕對路徑。 例如require('/home/marco/foo.js')會加載 /home/marco/foo.js文件。
以 './'為前綴的模塊是相對于調(diào)用 require()的文件的。 也就是說,circle.js必須和 foo.js在同一目錄下以便于 require('./circle')找到它。
當(dāng)沒有以 '/'、'./'或 '../'開頭來表示文件時,這個模塊必須是一個核心模塊或加載自 node_modules 目錄。如果給定的路徑不存在,則 require() 會拋出一個 code屬性為 'MODULE_NOT_FOUND'的 Error。