Подтвердить что ты не робот

Сделать requireJs не перезагружать jQuery, если уже на странице

Я пишу script, который должен быть встроен на сторонние сайты, чтобы добавить к ним функциональность. Недавно я разорвал свой довольно беспорядочный пользовательский код загрузчика и начал заменять его на requirejs. Одна из библиотек, которые могут быть загружены для меня (зависит от некоторых параметров, переданных в), - это jQuery.

Это хорошо работает, пока мой script не включен на страницу, в которой уже включен jQuery, и в этом случае то, что, как представляется, происходит, - это некоторые плагины для частичной загрузки, requirejs загружает jQuery поверх версии страницы, а плагины быстро ломаются.

Спросить клиентов переписать свои страницы просто для использования этого script не может быть и речи, поэтому я хотел бы сделать это, если jQuery уже загружен, если он есть, пропустите загрузку через requirejs и просто используйте уже загруженный (это, возможно, откроет мне случайные случаи и ошибки, когда они используют гораздо более старую версию jQuery, но у меня нет большого выбора).

То, что я думал, что я сделаю, это написать новый модуль, который сначала увидит, загружен ли jQuery, если он есть, просто экспортируйте объект jQuery, если он не будет, затем загрузите его, а затем выполните экспорт. Тем не менее, мне кажется, что меня загнали в тупик, так как функция определения для модуля, похоже, должна быть синхронной для работы, поэтому я не могу отключиться и загрузить еще один script, который будет асинхронным, а затем добавить экспорт в requirejs.

Я что-то упустил в документах? Я пытаюсь сделать невозможным?

4b9b3361

Ответ 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 "]) и он работал" )