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

Is there a way to prevent the YUI3 loader from loading scripts that are already on the page?

本文关键字:加载 脚本 YUI3 有没有      更新时间:2023-09-26

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

在本视频的大约 3/4 中,您将看到如何加载不是为 YUI 编写的外部模块,并通知加载器它已加载,这样它就不会尝试执行两次。 基本上,你监视加载器的onProgress事件,当它触发时,你调用YUI.add()与你想要给模块命名,然后加载器将该模块标记为已加载。

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

  1. 运行模块 A 的脚本(调用 Y.add('A', ...))
  2. YUI 在运行回调之前关闭以加载模块 A 的要求
  3. 再次调用 Y.add('A'),回调为空(通知 YUI A 的脚本文件在页面上)
  4. YUI 由于异步加载尚未返回,YUI 将空回调作为 A 的定义

解决方法是使用以下脚本:

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);
    }
}