如果已经在页面上,则使requireJs不重新加载jQuery

我正在编写一个脚本,旨在嵌入第三方网站以向其添加function。 我最近撕掉了我相当混乱的自定义加载器代码并开始用requirejs替换它。 其中一个可选地为我加载的库(取决于传入的一些参数)是jQuery。

这很好用,直到我的脚本包含在jQuery已经打开的页面上,在这种情况下,似乎发生了一些插件中途加载,requirejs在页面版本上加载jQuery,插件立即中断。

要求客户重写他们的页面只是为了使用这个脚本是不可能的,所以我想做的是检测jQuery是否已经加载,如果是,跳过通过requirejs加载它,并只使用已经加载的(当他们使用更旧版本的jQuery时,这可能会让我遇到奇怪的边缘情况和错误,但我没有太多选择)。

我想我会做的是编写一个新模块,首先看看是否加载了jQuery,如果是,只需导出jQuery对象,如果不是,则加载它,然后进行导出。 但是,我似乎受到了阻碍,因为模块的定义函数似乎需要同步工作,所以我不能去加载另一个脚本,这将是异步的,然后将导出填充到requirejs中。

我在文档中遗漏了什么吗? 我正在尝试不可能的事情吗?

我在一个类似的项目中遇到了同样的问题,使用require.js作为要加载到第三方站点的库。 你可以在这里看到我的方法,但这里是简化版本:

 // 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是旧版本)加载特定于库的jQuery noConflict

这非常有效。 唯一的缺点是你在脚本中动态调用require() ,这使得有效地使用r.js优化器变得更加困难。

我有一个类似的问题..我的脚本重新加载jQuery两次..使用本文评论中的解决方案

像魅力一样工作!

(有用的评论是:

“我把它放在我的配置文件中,在requirejs.config(…)之后和requirej([”app“]之前)并且它工作了”)