模塊是一門語言編寫大項目的基石,所以,瞭解如何組織、編寫、編譯、加載模塊很重要。這裏主要談談Node中的模塊加載。javascript
1.Node中的模塊,主要使用require來加載模塊,文件java
require("./") --- 加載本文件夾下面的package.json,若是沒有,則加載index.js、index.nodenode
require("some.js") --加載本文件夾下面的some.js文件webpack
require("lib/some.js") --加載lib/some.js文件es6
require("modulename") --加載當前目錄node_modules/modulename文件夾內的package.json,若是沒有,則加載index.js、index.node。若是當前目錄找不到以上內容,則進入指定全局模塊緩存目錄中加載modulename文件夾中的內容,如還未找到,則進入系統環境變量NODE_PATH指定的路徑中加載modulename文件夾內的內容。涉及到的目錄,請參看npm路徑設置。web
2.Node中建立/導出模塊:module.exportsnpm
Module.exports纔是真正的接口,exports只不過是它的一個輔助工具。 最終返回給調用的是Module.exports而不是exports。json
全部的exports收集到的屬性和方法,都賦值給了Module.exports。緩存
固然,這有個前提,就是Module.exports自己不具有任何屬性和方法。若是,Module.exports已經具有一些屬性和方法,那麼exports收集來的信息將被忽略。工具
修改rocker.js以下:
module.exports = 'ROCK IT!';
exports.name = function() {
console.log('My name is Lemmy Kilmister');
};
再次引用執行rocker.js :
var rocker = require('./rocker.js');
rocker.name(); // TypeError: Object ROCK IT! has no method 'name'
發現報錯:對象「ROCK IT!」沒有name方法,rocker模塊忽略了exports收集的name方法,返回了一個字符串「ROCK IT!」。
結論:
1.模塊並不必定非得返回「實例化對象」。你的模塊能夠是任何合法的javascript對象--boolean, number, date, JSON, string, function, array等等。
2.模塊能夠是任何你設置給它的東西。若是你沒有顯式的給Module.exports設置任何屬性和方法,那麼你的模塊就是exports設置給Module.exports的屬性。
實例:
module.exports = function(name, age) {
this.name = name;
this.age = age;
this.about = function() {
console.log(this.name +' is '+ this.age +' years old');
};
};
調用:
ar Rocker = require('./rocker.js');
var r = new Rocker('Ozzy', 62);
r.about(); // Ozzy is 62 years old
3.若是你的模塊是一個特定的類型,就用Module.exports;
若是你模塊是一個典型的「實例化對象」就用exports。
給Module.exports添加屬性相似於給exports添加屬性。例如:
module.exports.name = function() {
console.log('My name is Lemmy Kilmister');
};
一樣,exports是這樣的
exports.name = function() {
console.log('My name is Lemmy Kilmister');
};
請注意,這兩種結果並不想同。前面已經提到module.exports是真正的接口,exports只不過是它的輔助工具。推薦使用exports導出(實例化對象),除非你打算從原來的「實例化對象」改變成一個類型。
注意,webpack 默認是支持es6的。因此,在 導入/導出模塊 的時候,也能夠用es6的寫法。
小結:1.nodejs中的用 require,exports 處理模塊
2..注意區別nodejs 與 es6中模塊導入,導出方法的不一樣之處