我们正在尝试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)替换旧的传统/自定义/手动滚动模块系统,这使我们陷入了戛然而止。
任何人都可以建议:
require()
函数而非,require()
函数(由于遗留原因,我们实际上使用了一个围绕RequireJS的require()
函数的瘦包装器,因此我们现有的模块代码现在仍在使用,所以它不是很好强制更改我们调用以定义RequireJS模块的方法的名称,因为它仅在代码中的一个位置使用)...没有像黑客攻击/分叉问题那样粗暴的问题还是Facebook SDK?
或者,我们是否错过了一些我们应该做的不同的事情?我对RequireJS和Facebook SDK都很陌生,所以我完全清楚我们可能会忽略某些事情/在某处犯了一个愚蠢的错误。
答案 0 :(得分:0)
没关系 - 它原来是我们的函数中的一个错误(出于遗留,兼容性原因)用来包装对RequireJS的require()
函数的调用,该函数合法地使用不正确的参数调用require()
出于某种原因,我们设置的一些怪癖导致Firefox在页面上报告任何和所有JS错误,因为它们发生在xd_arbiter.php中(在一条线上 - 纯粹是愚蠢的侥幸 - 碰巧调用了FB SDK自己的require函数!),而不是发生错误的实际文件。