我正在编写一个脚本,旨在嵌入第三方网站以向其添加功能。我最近撕掉了我相当混乱的自定义加载程序代码并开始用requirejs替换它。其中一个可选地为我加载的库(取决于传入的一些参数)是jQuery。
这很有效,直到我的脚本包含在jQuery已经打开的页面上,在这种情况下,似乎会发生一些插件中途加载,requirejs在页面版本上加载jQuery,插件会立即中断。 / p>
要求客户重写他们的页面只是为了使用这个脚本是不可能的,所以我想做的是检测jQuery是否已经加载,如果是,跳过通过requirejs加载它,并且只使用已经加载一个(当他们使用更旧版本的jQuery时,这可能会让我遇到奇怪的边缘情况和错误,但我没有太多选择。)
我认为我会做的是编写一个新模块,首先看看是否加载了jQuery,如果是,只需导出jQuery对象,如果不是,则加载它,然后进行导出。但是,我似乎受到了阻碍,因为模块的定义函数似乎需要同步工作,所以我不能去加载另一个脚本,这将是异步的,然后将导出填充到requirejs。
我在文档中遗漏了什么?我正在尝试不可能吗?
答案 0 :(得分:26)
我在一个类似的项目中遇到了同样的问题,使用require.js作为要在第三方网站上加载的库。您可以看到我的方法here,但这里是简化版本:
// check for existing jQuery
var jQuery = window.jQuery,
// check for old versions of jQuery
oldjQuery = jQuery && !!jQuery.fn.jquery.match(/^1\.[0-4](\.|$)/),
localJqueryPath = libPath + 'jquery/jquery-1.7.2.min',
paths = {},
noConflict;
// check for jQuery
if (!jQuery || oldjQuery) {
// load if it's not available or doesn't meet min standards
paths.jquery = localJqueryPath;
noConflict = !!oldjQuery;
} else {
// register the current jQuery
define('jquery', [], function() { return jQuery; });
}
// set up require
require.config({
paths: paths
});
// load stuff
require(['jquery', ... ], function($, ...) {
// deal with jQuery versions if necessary
if (noConflict) $.noConflict(true);
// etc
});
正如您所看到的,这会查找jQuery,然后将“jquery”模块定义为现有库的包装器,或者(如果没有jQuery或现有jQuery是旧版本)加载库 - 具有noConflict
的特定jQuery。
这非常有效。唯一的缺点是您在脚本中动态调用require()
,这使得有效使用r.js
优化器变得更加困难。
答案 1 :(得分:3)
我有类似的问题..我的脚本正在重新加载jQuery两次..使用this article
中的注释中的解决方案像魅力一样工作!
(有效的评论是:
“我把它放在requirejs.config(...)之后和之前的配置文件中 requirej([“app”])和它工作“)