【发布时间】:2021-09-10 02:41:29
【问题描述】:
我正在编写一个脚本,该脚本旨在嵌入到第 3 方网站上,以便为其添加功能。我最近删除了我相当混乱的自定义加载程序代码,并开始用 requirejs 替换它。可以选择为我加载的库之一(取决于传入的一些参数)是 jQuery。
这很好用,直到我的脚本包含在 jQuery 已经存在的页面上,在这种情况下,似乎会发生一些插件在加载过程中,requirejs 会在页面的版本上加载 jQuery,并且插件会立即中断。
要求客户重写他们的页面只是为了使用这个脚本是不可能的,所以我想做的是检测 jQuery 是否已经加载,如果是,跳过通过 requirejs 加载它,只使用已经加载一个(当他们使用旧版本的 jQuery 时,这可能会让我遇到奇怪的边缘情况和错误,但我没有太多选择)。
我想我会写一个新模块,首先查看是否加载了 jQuery,如果是,则导出 jQuery 对象,如果不是,则加载它,然后执行导出。但是,我似乎受到了阻碍,因为模块的定义函数似乎需要同步才能工作,所以我不能去加载另一个异步脚本,然后将导出填充到 requirejs 中。
我在文档中遗漏了什么吗?我正在尝试的事情是不可能的吗?
【问题讨论】:
-
这将解决版本控制问题。但是,这似乎并不能解决插件踩踏问题,因为页面上的版本很可能会在我之前加载,并且没有冲突。我想我可以修改我的服务版本的 jQuery 以不践踏 $/jQuery 对象,并且只是将自己暴露为一个模块,但我宁愿将其作为最后的手段,从那时起我必须记住做到这一点当我更新 jQuery 时改变。
-
没关系。只有其中一个库需要知道无冲突模式。当您在您的 jQuery 副本上调用
noConflict时,$和jQuery的值会从加载副本之前恢复为原始值。使用原始实例的插件将继续引用它。原始的 jQuery 实例会假设它是唯一的,这很好。