前端使用者較為熟悉的是: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基本教學
沒有留言:
張貼留言