require 源码问题
发布于 6 年前 作者 Zerxoi 2276 次浏览 来自 问答

基本已经搞懂了这个帖子说的意思了,但是还有一个地方想不太明白。

require()函数是在node/lib/internal/module.jsmakeRequireFunction()定义的,但是在源码最前面就有调用const errors = require('internal/errors');。 那自然是require()已经定义了,我在node/lib/internal/bootstrap_node.js找到了

    const { makeRequireFunction } = NativeModule.require('internal/module');
    // ...
    addCommandLineAPI('require', makeRequireFunction(consoleAPIModule));

但是const { makeRequireFunction } = NativeModule.require('internal/module');中在第一句const errors = require('internal/errors');会因为没有定义require()出错的呀。

把1年前的问题又翻出来问一遍,实在有些抱歉,但是希望能帮我解答一下,const { makeRequireFunction } = NativeModule.require('internal/module');到底是在那里定义的。

4 回复

其实没看懂你在问啥,不过看起来你找的完全不对 要说普通模块里面的 require,定义在 lib/internal/module.js 里面 至于 bootstrap_node.js 中的 require 因为此时还没有加载 lib/module.js ,所以全都是采用的 NativeModule.require,它的定义就在这个文件里

不好意思,表述能力确实差。 你说的我知道,但是lib/internal/module.js中,第一句就是const errors = require('internal/errors');,这个require不会冲突么,在定义之前调用。

@Zerxoi module.js 整个生命周期第一次被引用是在 bootstrap_node.js 中,如下:

const { makeRequireFunction } = NativeModule.require('internal/module');

这里的 NativeModule.require 也会注入 exports、NativeModule.require 到 internal/module 这个文件里,你看到的 require(‘internal/errors’) 就是调用注入的 NativeModule.require

仔细看下 NativeModule.require 的实现就知道了

明白了,谢谢你的帮助。

回到顶部