有没有办法阻止YUI3加载器加载页面上已有的脚本?

时间:2013-10-04 12:45:45

标签: javascript yui yui3

我正在努力将手动编写脚本标记的应用程序迁移到使用YUI3加载程序来管理脚本依赖项的应用程序。我遇到了像jQuery这样不应加载两次的脚本的问题,因为在某些情况下遗留代码会丢弃页面上的脚本,然后YUI加载器会再次加载它。有没有办法防止这种情况发生?看起来加载器应该能够在注入新标记之前使用与它要创建的src相同的src查询脚本标记。

2 个答案:

答案 0 :(得分:0)

大约3/4的this video您将看到如何加载未为YUI编写的外部模块,并通知加载器它已加载,因此它不会尝试两次。基本上,您监视加载器的onProgress事件以及它何时触发,您使用要为模块提供的名称调用YUI.add(),然后使加载程序将该模块标记为已加载。

答案 1 :(得分:0)

事实证明,实现此目的的一种方法是主动调用模块名称上的Y.add()。这适用于不是用Y.add()(例如jQuery插件)定义的模块。但是,如果使用Y.add()定义的模块执行此操作,则存在潜在的竞争条件。例如,请考虑以下顺序:

    运行模块A的
  1. 脚本(调用Y.add('A',...))
  2. YUI在运行回调之前启动加载模块A的要求
  3. 使用空回调再次调用Y.add('A')(通知YUI A的脚本文件在页面上)
  4. YUI因为异步加载尚未返回,YUI将空回调作为A的定义
  5. 修复方法是使用以下脚本:

    var preloadedModules = ['a', ... ]; // list of module scripts already on the page
        , noop = function (Y) { }, version = '@VERSION@', i, len, moduleName;
    for (var i = 0, len = preloadedModules.length; i < len; ++i) {
        moduleName = preloadedModules[i];
        if (!YUI.Env.mods[moduleName]) { // avoids overwriting YUI module definitions
            YUI.add(moduleName, noop, version);
        }
    }