无法在React中find所需的模块

我正在浏览React的代码库,并且我注意到React的require在Nodejs中的performance不太像。 我不知道这是怎么回事

看ReactClass.js的第19行,有一个require('emptyObject') ,但是emptyObject没有在package.json中列出,也没有说在那个模块来自的地方。

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

我确实在npmjs上find了“emptyObject” ,但是这里的API看起来与React中使用的不同; React中的.isEmpty grepped与emptyObject无关。

那么从哪里得到加载的emptyObject,以及React如何做require做的事情呢? 这不直观。 完全一样。

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开源项目构build的定制模块系统。

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

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

据我所知,Eclipse和WebStorm都不支持Haste,所以IDE不能提供帮助。 但是使用Haste,文件和模块的名称应该是相同的,所以你可以通过search文件名来find一个模块,例如Webstorm中的双重移位和Eclipse中的Ctrl + Shift + r 。 然而,您所询问的或invariantemptyObject不是React的一部分,因此find它们的起源仍然很麻烦。

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

我注意到了React的require在Nodejs中的performance不太像。

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

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

这个function是由fbjs提供的,它包含了所有Facebook项目的共享依赖和构build助手。 这是你findemptyObject模块的地方 。

如果您查看React的gulp文件 ,您可以看到模块映射是如何构build的,并且使用自定义的Babel插件来转换所有require调用。