无法在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 。 然而,您所询问的或invariant
的emptyObject
不是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
调用。