前文講到在Angular Material的第二個編譯文件docs/gulpfile.js
中卻看到了一個奇怪的東西module.exports
那麼module.exports
是什麼東西呢?javascript
一直以來,javascript最大的詬病就是全局變量,這也成爲大型應用開發的最大阻礙。所以,不少人使用了不少方式來解決這個問題。如模塊模式(Module Pattern), 而node.js這實現了模塊裝載系統,來解決組件實現的基本問題。html
自從開始研究前端,我也幾個相關的關鍵詞在眼前晃盪, require()
exports
等等。當時,由於注意力在其餘方面,一直也沒下決心研究清楚。 就以下面文章中所講:前端
做爲開發人員經常面臨這樣的困境:當咱們使用不熟悉的代碼(庫)時,咱們究竟要花多少時間來研究它的原理和實現,這個研究又要有多深呢?經典答案就是,學習到足夠能夠開始寫代碼就能夠了,等到時間允許在進一步深刻研究。java
那麼如今就是深刻研究 module.exports
的時候了!node
這裏是一個簡單的js文件,greeting.js
,它的功能一看就明白:gulp
//greetings.js sayHelloInEnglish = function() { return "Hello"; }; sayHelloInSpanish = function() { return "Hola"; }; 這裏有兩函數也就是兩個功能。
// var exports = module.exports ={};
exports.sayHelloInEnglish = function() { return "Hello"; }; exports.sayHelloInSpanish = function() { return "Hola"; };
module.exports = { sayHelloInEnglish = function() { return "Hello"; }; sayHelloInSpanish = function() { return "Hola"; }; };
這個方式看上去有點怪異,以後能夠作更進一步的解釋。在這以前,能夠透露一點小道消息。 Typescript定義模塊的語法就感受天然多了:函數
module namespace { exports function sayHelloInEnglish = function() { return "Hello"; };而用tsc轉譯之後,他就會變成上面的node.js語法。
什麼是Typescript? OK,之後有時間再深刻吧? (聽起來怎麼這麼耳熟?)學習
咱們準備在main.js中導入和使用greetings.js中的全部函數。ui
require
是nodejs用來導入模塊的關鍵詞。想象一下require的定義以下 (怎麼又是想象?)spa
var require =function(path){ //.... return module.exports; };
//main.js var greetings = require("./greetings");
想象一下以上代碼等價於你的代碼作了如下事情:
//main.js var greetings = { sayHelloInEnglish = function() { return "Hello"; }; sayHelloInSpanish = function() { return "Hola"; }; };
//"Hello" greetings.sayHelloInEnglish(); // "Hola" greetings.sayHelloInSpanish();
警告:
正由於nodejs的這種模塊機制,若是不當心給module.exports從新賦給了一個全新的對象,會致使不可預期的問題。
如://greetings.js //var exports=module.exports = {}; exports.sayHelloInEnglish = ... exports.sayHelloInSpanish = ... /* 從新賦值module.exports */ module.exports= "Bonjour";這時候,在main.js中咱們在調用`greetings.sayHelloInEnglish()'就會出錯。
下一步:進階研究require()的工做原理。