在分配(空对象)时,require(browserify)无法正常工作,但在内联

时间:2015-05-13 08:50:51

标签: javascript coffeescript reactjs browserify

我在React(coffee jsx)中有以下组件定义:

CompUtils = require './../utils/comp-utils'

...

  render: ->
    console.log CompUtils # prints {} (empty object)
    <div>
      Then
      {CompUtils.getConstructComponent @props.construct, @props.onUpdate, @props.onRemove}
    </div>

但这有效:

  render: ->
    console.log require('./../utils/comp-utils')
    <div>
      Then
      {require('./../utils/comp-utils').getConstructComponent @props.construct, @props.onUpdate, @props.onRemove}
    </div>

我对此绝对感到困惑。请注意,CompUtils已在其他组件中成功使用。

1 个答案:

答案 0 :(得分:5)

通常当你从require调用中获取一个空对象时,这是因为你有循环依赖。因此,您需要 A ,这需要 B ,这需要 C ,这需要 A 。在这种情况下, C 将获得一个代表 A 的空对象,因为 A 尚未完成导出其功能/对象和 A A 完成导出后,只能在下一个时间点 C 完全可用。

以下是一个例子:

// a.js
var b = require('./b');
module.exports = {
  doStuff: function () {

  }
}

// b.js
var c = require('./c');

// c.js
var a = require('./a');

// This will fail because a.js hasn't exported doStuff yet, since a required b, which 
// required c, which required a.
a.doStuff();

获得空对象的原因是因为Browserify在模块代码运行之前为该模块创建了一个表示module.exports的空对象。这意味着另一个模块在完成之前可以要求它,它只是没有完全烘烤。