The Twitter widget library公开了一个全局变量twttr
。我想使用带有exports-loader的webpack动态模块化这个库。问题是,虽然twttr
变量立即公开,但在同步访问它时,其属性仍未定义。
console.log(twttr.widgets); // undefined
setTimeout(function() {
console.log(twttr); // now defined
});
因此,var twttr = require('exports?twttr!./path/to/twitter')
将返回一个实际上不准备使用的对象。
虽然Twitter文档提示只有在异步加载库时才需要这样做,但我怀疑除非包含在twttr.ready
中,否则可以使用窗口小部件功能。
至少webpack提供了一种更好的加载库和访问twttr
的方法。我怀疑奇怪的行为是由于这个脚本来自模块系统不存在且SRP被忽略的时候。尽管如此,我很好奇开发人员为引起这种行为所做的工作,我尝试阅读美化的缩小源代码已被证明是愚蠢的。
答案 0 :(得分:1)
Twitter小部件库不仅提供用于动态创建小部件的API,还可以在页面上查找和初始化现有小部件 - 来自Twitter的documentation page:
默认情况下,
widgets-js
会在页面中找到标记,并将基本的功能标记转换为丰富的交互式小部件。
要做到这一点,它必须扫描DOM并用iframe
- s替换匹配的节点,从Twitter请求标记(这是异步任务的本质)。
我想,作者认为现有小部件的初始化可能需要一些时间,并且完全异步地进行。现在,当库在页面上搜索尚未初始化的小部件并更新它们时,允许开发人员动态添加新的小部件可能会导致一些并发问题。例如,很容易想象重复请求:库初始化程序可以找到由API添加的小部件并尝试初始化它,而API已经向Twitter发送了iframe
代码的请求。最简单的答案是“我们如何防止这种情况?”当库在现有小部件上工作时,将隐藏客户端的API。