React库如何直接需要其源库?

Jos*_*ack 7 javascript commonjs reactjs

我正在查看Facebook的React的源代码,并发现在整个项目源中,他们没有指定加载自己的模块的相对路径.例如,代替var foo = require('../bar/foobar')使用库var foo = require('foobar'),就好像模块已经加载,node_modules以便CommonJS读取.

我只是想知道他们是如何做到这一点的?我尝试通过Grunt查看他们的构建步骤,但看不到任何直接完成此任务的软件包.

对于我正在谈论的技术的更具体的例子,这里库调用完全flattenChildren存在于不同目录中的模块而不指定路径.

Bri*_*and 11

React使用一个名为commoner的工具.它们的配置匹配如下所示的行:

* @providesModule ReactChildReconciler
Run Code Online (Sandbox Code Playgroud)

require('ReactChildReconciler')电话.他们还将所有内容放在一个目录中,因此路径最终为require('./ReactChildReconciler').

源代码以结构化的方式组织,但模块名称对于repo是全局唯一的(以及facebook的所有内部代码,我认为 [引证需要]).这意味着它所指出的内容并不含糊.


关于这个主题,反应代码中还有其他一些神奇的东西.

通过删除第一个之后的参数来节省空间,从而为生产构建转换对调用invariant(assertion, explanation, ...)和类似warning调用的调用.警告调用完全被剥离,因为它们被包裹在下一个魔法中:开发仅阻止.

if (__DEV__) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

编译为:

if (process.env.NODE_ENV !== 'production') {
   ...
}
Run Code Online (Sandbox Code Playgroud)

其中,通过envify,编译(在开发中),代码运行:

if ('development' !== 'production') {
   ...
}
Run Code Online (Sandbox Code Playgroud)

这在生产中:

if ('production' !== 'production') {
   ...
}
Run Code Online (Sandbox Code Playgroud)

哪个缩小到这个:

?
Run Code Online (Sandbox Code Playgroud)