看了阮叔的require()源码解读,对nodejs的模块机制有了大概的了解。
不过有个问题,比如说写个模块,路径为path
,直接在命令行输入node path
是可以执行的
var tool = require('./tool');
exports.add = function(a,b){
return a+b;
}
console.log(module.id);
那么这个模块的require
、exports
、module
是哪来的?
如果没有明白我的意思,我再多做一点解释:
根据阮叔在文章中的解读,之所以通过require
加载的模块可以使用require
、exports
、module
,是因为:
(function (exports, require, module, __filename, __dirname) {
// 模块源码
})(...)
也就相当于注入了require
、exports
、module
,他们不是凭空而来的。
在命令行敲 node path 发生了什么呢?
我们来看node的源码,这里我看的是0.12.6
首先出场的是 node_main.cc
这个是node工具的入口函数,清晰可以见的 wmain 和main
然后发现他是调用 node::Start 函数。
接着出场的就是 node.cc
查看 Start 函数,发现里面最有趣的是 LoadEnvironment(env) 函数,接着去看看
发现这样一片代码:
重点在第一句话,发现 node.js 这个文件被注入了,这个文件就在源代码里,接着我们看看这个
发现楼主说的注入就在这里了,然后我们回过去捋一捋 path 的加载过程,就发现是用这里来加载的,然后就没有然后了。
楼主要学会看源码。