我正在浏览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
如何做它正在做的事情?这不直观。完全没有。
答案 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 。但是,您询问的emptyObject
或invariant
不是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
次调用。