nodejs 模块问题?

看了阮叔的require()源码解读,对nodejs的模块机制有了大概的了解。
不过有个问题,比如说写个模块,路径为path,直接在命令行输入node path是可以执行的

var tool = require('./tool');
exports.add = function(a,b){
    return a+b;
}
console.log(module.id);

那么这个模块的requireexportsmodule是哪来的?


如果没有明白我的意思,我再多做一点解释:
根据阮叔在文章中的解读,之所以通过require加载的模块可以使用requireexportsmodule,是因为:

 (function (exports, require, module, __filename, __dirname) {
  // 模块源码
})(...)

也就相当于注入了requireexportsmodule,他们不是凭空而来的。

阅读 6k
3 个回答

在命令行敲 node path 发生了什么呢?
我们来看node的源码,这里我看的是0.12.6
首先出场的是 node_main.cc
这个是node工具的入口函数,清晰可以见的 wmain 和main
然后发现他是调用 node::Start 函数。
接着出场的就是 node.cc
查看 Start 函数,发现里面最有趣的是 LoadEnvironment(env) 函数,接着去看看
发现这样一片代码:

clipboard.png

重点在第一句话,发现 node.js 这个文件被注入了,这个文件就在源代码里,接着我们看看这个

clipboard.png

发现楼主说的注入就在这里了,然后我们回过去捋一捋 path 的加载过程,就发现是用这里来加载的,然后就没有然后了。
楼主要学会看源码。

新手上路,请多包涵

你的代码编译时会包裹一层函数(function (exports, require, module, __filename, __dirname) {});你的代码中使用的require,exports就是这些参数。具体的看nodejs模块引入机制exports-module源码

因为你引用了nodejs

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题