Node.js模塊系統(tǒng)
Node.js有一個簡單的模塊加載系統(tǒng)。 在Node.js中,文件和模塊是一一對應的(每個文件被視為單獨的模塊)。
例如,考慮下面這個名為 foo.js 的文件:
const circle = require('./circle.js');console.log(`The area of a circle of radius 4 is ${circle.area(4)}`);在第一行, foo.js 加載與 foo.js 同一目錄的模塊 circle.js 。
circle.js 的內容如下:
const PI = Math.PI;exports.area = (r) => PI * r * r;exports.circumference = (r) => 2* PI * r;
模塊 circle.js 導出了函數(shù) area() 和 circumference() 。 要將函數(shù)和對象添加到模塊的根目錄,可以將它們賦值到特殊 exports 對象上。
模塊內部的變量一定是私有的,因為模塊被Node.js包裹在一個函數(shù)中(參見下面的模塊包裝器)。 在這個例子中,變量 PI 對于 circle.js 來說是私有變量。
如果你希望模塊導出的是一個函數(shù)(如構造函數(shù)),或者是要導出完整的對象,而不是一次創(chuàng)建一個屬性,則需要將其分配給 module.exports 而不是 exports 。
在下面的 bar.js 中,使用了 square 模塊,它導出一個構造函數(shù):
const square = require('./square.js');var mySquare = square(2);console.log(`The area of my square is ${mySquare.area()}`);在 square.js 模塊中定義一個 square 方法:
module.exports = (width) => { return { area: () => width * width; };}此外,模塊系統(tǒng)在 require(“module”) 模塊中實現(xiàn)。
『main』模塊
當某個 module 直接從Node.js運行時,它會將 require.main 設置該 module 。 你可以通過這個來測試這個 module 是被直接運行的還是被 require 的。
require.main === module
就拿文件 foo.js 來說,如果運行 node foo.js 這個屬性就是 true 。運行 require('./foo.js') 就是 false 。
因為 module 提供了一個 filename (通常相當于 __filename ),因此可以通過檢查 require.main.filename 來獲取當前應用程序的入口點。
包管理器的一些提示
Node.js的 require() 函數(shù)支持一些合理的目錄結構。它讓軟件包管理器程序(如 dpkg , rpm 和 npm )可以從Node.js模塊中直接去構建本地的包而不需要修改。
下面我們給出一個可以正常工作的建議目錄結構:
假設我們希望在 /usr/lib/node/<some-package>/<some-version> 中的文件夾來指定版本的包。
此外,包還可以相互依賴。 比如你想安裝 foo 包,而這個包有可能需要安裝指定版本的 bar 包。而 bar 包也很有可能依賴其他的包,并且在某些特殊情況下,這些依賴包甚至可能會產生循環(huán)依賴。
由于Node.js會查找加載的所有模塊的 realpath (即解析軟鏈),然后再去node_modules文件夾中查找依賴的包,因此使用以下方案可以非常簡單地解決此問題:
新聞熱點
疑難解答
圖片精選