Сделать requireJs не перезагружать jQuery, если уже на странице
Я пишу script, который должен быть встроен на сторонние сайты, чтобы добавить к ним функциональность. Недавно я разорвал свой довольно беспорядочный пользовательский код загрузчика и начал заменять его на requirejs. Одна из библиотек, которые могут быть загружены для меня (зависит от некоторых параметров, переданных в), - это jQuery.
Это хорошо работает, пока мой script не включен на страницу, в которой уже включен jQuery, и в этом случае то, что, как представляется, происходит, - это некоторые плагины для частичной загрузки, requirejs загружает jQuery поверх версии страницы, а плагины быстро ломаются.
Спросить клиентов переписать свои страницы просто для использования этого script не может быть и речи, поэтому я хотел бы сделать это, если jQuery уже загружен, если он есть, пропустите загрузку через requirejs и просто используйте уже загруженный (это, возможно, откроет мне случайные случаи и ошибки, когда они используют гораздо более старую версию jQuery, но у меня нет большого выбора).
То, что я думал, что я сделаю, это написать новый модуль, который сначала увидит, загружен ли jQuery, если он есть, просто экспортируйте объект jQuery, если он не будет, затем загрузите его, а затем выполните экспорт. Тем не менее, мне кажется, что меня загнали в тупик, так как функция определения для модуля, похоже, должна быть синхронной для работы, поэтому я не могу отключиться и загрузить еще один script, который будет асинхронным, а затем добавить экспорт в requirejs.
Я что-то упустил в документах? Я пытаюсь сделать невозможным?
Ответы
Ответ 1
У меня была такая же проблема в аналогичном проекте, используя 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 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()
динамически в своем script, что затрудняет эффективное использование оптимизатора r.js
.
Ответ 2
У меня была аналогичная проблема. Мой script дважды перезагружал jQuery.. Использовал решение из комментариев в этой статье
Работал как шарм!!
(Комментарий, который работал:
"Я поместил его в свой конфигурационный файл после requirejs.config(...) и до requirej ([" app "]) и он работал" )