前文讲到在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()的工做原理。