与Facebook SDK(xd_arbiter.php)和RequireJS之间的require()函数冲突

时间:2013-10-14 13:24:40

标签: facebook facebook-javascript-sdk requirejs

设置/背景

我们正在尝试load the Facebook SDK through RequireJS

require.config({
  'shim': {
    'facebook' : {
      'exports': 'FB'
    }
  },
  'paths': {
    'facebook': '//connect.facebook.net/en_US/all/vb'
  }
});

/en_US/all/vb.js基本上与通常的/en_US/all.js相同,但也包含FB的实验Music Bridge功能。但是,任何版本的SDK都存在问题。)

...并正确加载SDK的主体。但是,在Facebook SDK的初始化过程中,它创建了一个iframe,它发出请求:

https://www.facebook.com/connect/ping?client_id=<CLIENT_ID>&domain=<DEVELOPMENT_SERVER>&origin=1&redirect_uri=<...>

...然后重定向到:

http://static.ak.facebook.com/connect/xd_arbiter.php?version=27#

...然后返回一个带有脚本标记的最小HTML文档,该标记为Facebook SDK定义了许多其他的javascript模块。

问题

主Facebook SDK vb.js xd_arbiter.php 脚本似乎都使用require()函数(在其中的每个文件中定义)默认顶级范围)加载Facebook SDK模块。

虽然主要的Facebook SDK( vb.js )是通过RequireJS垫片加载的(因此 - 我相信 - 它的范围受到RequireJS的限制,因此它定义的require()函数不会干扰RequireJS的全局require()函数),因为 xd_arbiter.php 代码加载在iframe中,它以某种方式在全局范围内执行浏览器。

这似乎导致与函数的RequireJS版本冲突 - 每次页面加载时,我们都会在 xd_arbiter.php 中遇到RequireJS错误(第13行):

Error: Invalid require call
http://requirejs.org/docs/errors.html#requireargs

...这似乎是由 xd_arbiter.php 代码调用它认为是自己的require()函数引起的,但实际上是函数的RequireJS版本......因此,传递给函数的参数对RequireJS无效。

我们目前正在尝试用一个漂亮,通用,相对标准的库(如RequireJS)替换旧的传统/自定义/手动滚动模块系统,这使我们陷入了戛然而止。

问题

任何人都可以建议:

  • 说服 xd_arbiter.php 在全球范围内定义require()函数而非
  • 除了 vb.js 之外,还要通过RequireJS而不是iframe加载 xd_arbiter.php 中定义的脚本,或者
  • 说服RequireJS不定义全局require()函数(由于遗留原因,我们实际上使用了一个围绕RequireJS的require()函数的瘦包装器,因此我们现有的模块代码现在仍在使用,所以它不是很好强制更改我们调用以定义RequireJS模块的方法的名称,因为它仅在代码中的一个位置使用)

...没有像黑客攻击/分叉问题那样粗暴的问题还是Facebook SDK?

或者,我们是否错过了一些我们应该做的不同的事情?我对RequireJS和Facebook SDK都很陌生,所以我完全清楚我们可能会忽略某些事情/在某处犯了一个愚蠢的错误。

1 个答案:

答案 0 :(得分:0)

没关系 - 它原来是我们的函数中的一个错误(出于遗留,兼容性原因)用来包装对RequireJS的require()函数的调用,该函数合法地使用不正确的参数调用require()

出于某种原因,我们设置的一些怪癖导致Firefox在页面上报告任何和所有JS错误,因为它们发生在xd_arbiter.php中(在一条线上 - 纯粹是愚蠢的侥幸 - 碰巧调用了FB SDK自己的require函数!),而不是发生错误的实际文件。