无法找到React中所需的模块

时间:2016-11-01 02:58:11

标签: javascript node.js facebook reactjs ecmascript-6

我正在浏览React代码库,我注意到React的require在Nodejs中的表现并不像。我不知道这里发生了什么。

例如,在ReactClass.js上查看第19行,其中有require('emptyObject'),但是emptyObject没有在package.json中列出,也没有说过该模块的任何地方来自。

https://github.com/facebook/react/blob/master/src/isomorphic/classic/class/ReactClass.js#L19

我找到"emptyObject" on npmjs,但是那里的API似乎与React中使用的API不同; React中的.isEmpty grep与空对象无关。

那么emptyObject从哪里加载,以及React的require如何做它正在做的事情?这不直观。完全没有。

2 个答案:

答案 0 :(得分:14)

React引用的emptyObject模块的位置是https://github.com/facebook/fbjs/blob/master/packages/fbjs/src/core/emptyObject.js#L9请注意,它不遵循CommonJS模块系统。

  

让Facebook更容易分享和使用我们自己的JavaScript。首先,这将允许我们发布代码而不必过多担心它的生存地位,保持@providesModule的精神,但在更广泛的JavaScript生态系统中工作。

来自https://github.com/facebook/fbjs#purpose

通过在许可证标头中添加@providesModule并在Node中加载require模块来定义模块的方式称为Haste,这是为Facebook的开源项目构建的自定义模块系统。

事实上,除非您想了解React的内部工作原理或为Facebook的开源项目做出贡献,否则您不需要知道这一点。换句话说,不建议使用Haste来编写自己的项目。

同样,在invariant第10行加载的ReactClass.js模块在​​https://github.com/facebook/fbjs/blob/master/packages/fbjs/src/__forks__/invariant.js#L9声明

据我所知,Eclipse和WebStorm都不支持Haste,因此IDE无法提供帮助。但是使用Haste,文件和模块的名称应该相同,所以你可以通过搜索文件名找到一个模块,即Webstorm和 Ctrl + Shift 中的双移Eclipse中的+ r 。但是,您询问的emptyObjectinvariant不是React的一部分,因此找到它们的来源仍然很麻烦。

否则,有一个团队分享和组织他们从黑客React中学到的东西,我偶尔会参与其中,并且他们通过跟随Haste将require链接到相应的原始文件,例如https://annot.io/github.com/facebook/react/blob/cc3dc21/src/isomorphic/classic/class/ReactClass.js?l=19您可能希望看到这一点。

答案 1 :(得分:4)

  

我注意到React的require在Nodejs中的表现并不像。

右。 Facebook有自己的模块加载器。所有模块都具有唯一标识符,由每个模块中的@providesModule指令提供。这允许您使用标识符来加载模块,而不是文件路径。

当然,这在基于Node.js的环境中不起作用。因此,当React或任何其他Facebook项目发布到npm时,所有require调用都会自动重写为Node理解的内容。

此功能由fbjs提供,其中包含所有Facebook项目的共享依赖项和构建帮助程序。 This is where you find the emptyObject module

如果查看React's gulp file,您可以看到如何构建模块映射,以及使用自定义Babel插件转换所有require次调用。