为什么这个Twitter库会延迟其对象属性的赋值?

时间:2014-11-26 05:12:43

标签: javascript twitter

The Twitter widget library公开了一个全局变量twttr。我想使用带有exports-loader的webpack动态模块化这个库。问题是,虽然twttr变量立即公开,但在同步访问它时,其属性仍未定义。

console.log(twttr.widgets); // undefined 
setTimeout(function() {
  console.log(twttr); // now defined
});

Live Demo

因此,var twttr = require('exports?twttr!./path/to/twitter')将返回一个实际上不准备使用的对象。

虽然Twitter文档提示只有在异步加载库时才需要这样做,但我怀疑除非包含在twttr.ready中,否则可以使用窗口小部件功能。

至少webpack提供了一种更好的加载库和访问twttr的方法。我怀疑奇怪的行为是由于这个脚本来自模块系统不存在且SRP被忽略的时候。尽管如此,我很好奇开发人员为引起这种行为所做的工作,我尝试阅读美化的缩小源代码已被证明是愚蠢的。

1 个答案:

答案 0 :(得分:1)

Twitter小部件库不仅提供用于动态创建小部件的API,还可以在页面上查找和初始化现有小部件 - 来自Twitter的documentation page

  

默认情况下,widgets-js会在页面中找到标记,并将基本的功能标记转换为丰富的交互式小部件。

要做到这一点,它必须扫描DOM并用iframe - s替换匹配的节点,从Twitter请求标记(这是异步任务的本质)。

我想,作者认为现有小部件的初始化可能需要一些时间,并且完全异步地进行。现在,当库在页面上搜索尚未初始化的小部件并更新它们时,允许开发人员动态添加新的小部件可能会导致一些并发问题。例如,很容易想象重复请求:库初始化程序可以找到由API添加的小部件并尝试初始化它,而API已经向Twitter发送了iframe代码的请求。最简单的答案是“我们如何防止这种情况?”当库在现有小部件上工作时,将隐藏客户端的API。