设为首页 加入收藏

TOP

NodeJS的模块原理
2014-11-23 23:19:37 来源: 作者: 【 】 浏览:6
Tags:NodeJS 模块 原理

最近一直在使用Node JS,在网上看到了一段代码我觉得完美的诠释了Node JS模块加载的原理,其实深究下去,它还诠释了许多东西:Js模块化编程、闭包的真正强大之处等等。闲话不说,先看看这段代码:


// - hello.js
void function() {
var mapping = {}, cache = {};
window.define = function(id, func) {
mapping[id] = func
};
window.require = function(id) {
if (!/\.js$/.test(id)) {
id += ".js"
}
if (cache[id]) {
return cache[id]
} else {
return cache[id] = mapping[id]()
}
}
}();

define("js/module/hello.js", function(exports) {
exports = {}; var name = 'Hello Module'

exports.sayHi = function() {
alert("Hi, this is "+ name +" !")
};

return exports
});


// - main.js
var hello = require('js/module/hello');
hello.sayHi();


我稍微改写了一点代码,为了能看得更清楚一些,这段代码在全局对象window上绑定了两个方法:define和require,写过Node代码的人肯定不会陌生,当我需要一个模块的时候,就会使用require来加载它,可能是原生模块例如http, express等,也可能是自己写的Js文件模块用相对路径加载。Node在实现模块加载的时候,就会使用优先本地查找node_modules目录,然后一层层往上找,最后再按环境变量在安装node的目录执行全局模块查找,PS: 自己写的业务模块一般都使用相对路径require('./business')来查找。当Node找到模块之后,第一次加载会比较缓慢,但是一旦加载就会缓存起来,类似我们这里做的cache和map的作用,再查找就会快很多。所以Node使用require加载模块第一次是阻塞式的,缓存之后就应该是异步非阻塞式的。


我们之所以可以通过require实现Js的模块化编程,完全得益于闭包的存在。闭包可以使得我们在传递函数调用结束,返回函数对象之后,依然可以访问其中的局部变量,就像例子中的name一样,假如它是一个数据库Connection对象,或者是一个业务Service对象,那么通过exports,就可以在其他Js文件中使用它并且代码从文件上是完全隔离的。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇AngularJS如何做身份验证 下一篇初识AngularJS

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: