[Nodejs]模組(module)

延續了像是javascript的使用方法,使用者可以從不同的script檔去實做function甚至是class,然後讓會用到相同程式碼的地方不需要重覆撰寫。但與其他語言比較不一樣的是,他是使用require的形式。

前端使用者較為熟悉的是:requirejs


取得模組
nodejs中擁有大量的模組可以使用,來自於npm社群,只要下達指令即可download下來使用。

npm install [module name] [option]

最常出現錯誤的應該是少了微軟的編譯器及python環境,npm之前看看作者的readme,確定自己是否符合相對應的環境。

模組實作環境:
在較為完整的模組中,例如:async,你可以看到source code分為三類,CommonJs規範、RequireJs、root。而nodejs屬於CommonJs規範,後面兩個屬於前端工程師使用的。當然模組規範不只有這些,但我們只先討論到我們會用到的。

使用require載入的模組,nodejs會將你的script包裝成

(function (exports, require, module, __filename, __dirname) {

    [script file ...]

});


exports:用來擴充這個script可被看見的變數成員(同module.exports)
require:用來require其他套件讓此模組使用
module:代表此模組的object
__filename:此模組檔案名稱
__dirname:此模組檔案路徑

模組實作:
mymodule.js
exports.print_1 = function(){
 console.log("hello world with exports.print");
};

module.exports.print_2 = function(){
 console.log("hello world with module.exports.print");
};

exports會是一個object,直接對其增加物件成員,在其他檔案require此檔案時,即會看到exports這個object的東西。一樣的意思,因為exports就是module.exports,所以module.exports這個object上的東西,也是被require之後所看到的object

模組引用:
main.js
var mymodule = require("mymodule.js");
console.log(Object.keys(mymodule)); // [ 'print_1', 'print_2' ]
mymodule.print_1(); // hello world with exports.print
mymodule.print_2(); // hello world with module.exports.print

值得一提的是,exports雖然會全等於 module.exports,但它是一個指向module.exports的變數,若是重新賦予值,會指向到所賦予的新值,而不會更改到module.exports(詳細-指標&值)。所以若是想要達到將整個exports更換成在檔案中寫好的object(或其他型態皆可)時,必須如下使用

var myobject = {

'print_1' : function(){
 console.log("hello world 1");
    },
'print_2' : function(){
        console.log("hello world 1");
    }
}; module.exports = myobject;
模組引用路徑:

寫好的模組檔案要放在哪裡呢?
一般人習慣是直接放在相同目錄下,在require的時候會根據module.paths這個array裡面的位置去尋找相對應的檔案,順序會從離呼叫require函式最近的路徑開始尋找。

nodejs會自動加入以下路徑進入paths中:
path.join(__dirname, 'node_modules');
path.join(__dirname, '..', 'node_modules');
path.join(__dirname, '..', '..', 'node_modules');
...
...
...
一直新增到達跟目錄為止

註:
path為官方提供的套件。
path.join等同於在console上打cd指令,".." 即為回到上一層,接上字串即為到下一層

require函式會逐一資料夾尋找相對應的script。
若遇到為有效模組的資料夾則參考資料夾下的package.json指定的檔案。
require的時候如果檔名為*.js,則可以不用打上.js,模組索引的時候會自動尋找輸入的檔明加上.js


參考:
node.js基本教學

沒有留言:

張貼留言