Лучший способ использовать размещенный в Google jQuery, но отказываться от моей размещенной библиотеки в Google не удается

Что было бы хорошим способом попытаться загрузитьразмещенный JQuery в Google (или другие размещенные в Google библиотеки), но загрузите мою копию jQuery, если попытка Google не удалась?

Я не говорю, что Google ненадежен. В некоторых случаях копия Google заблокирована (например, в Иране).

Я установил бы таймер и проверил бы для объекта jQuery?

Какова будет опасность того, что обе копии будут получены?

На самом деле не ищите ответы типа "просто используйте Google" & quot; или & quot; просто используйте свой собственный. & quot; Я понимаю эти аргументы. Я также понимаю, что пользователь, скорее всего, будет кэшировать версию Google. Я имею в виду запасные варианты для облака в целом.

Редактировать: эта часть добавлена ...

Так как Google предлагает использовать google.load для загрузки библиотек ajax, и когда он это сделает, он выполняет обратный вызов, мне интересно, является ли это ключом к сериализации этой проблемы.

Я знаю, это звучит немного безумно. Я просто пытаюсь понять, может ли это быть сделано надежным способом или нет.

Обновление: jQuery теперь размещен на CDN Microsoft.

http://www.asp.net/ajax/cdn/

 Nosredna18 июн. 2009 г., 19:59
Конечно, первым ответом было «не использовать размещенную в Google версию». :-)
 Jay Stevens18 июн. 2009 г., 19:54
Хороший вопрос. Кроме того, хорошее предостережение. Слишком много ответов SO "не делают этого!" не: "Хорошо, вот как это сделать".
 Nosredna18 июн. 2009 г., 20:18
Преимущества использования Google или нет для JS lib хостинга достойны, но это обсуждалось в нескольких других темах. Я искал технические ответы относительно JS-отклика на задержки загрузки.
 Ionuț G. Stan18 июн. 2009 г., 20:11
@Bryan Migliorisi, я думаю, что Twitter не так уж и серьезен? Но я признаю, что у них были свои проблемы с Google, как месяц назад, когда Google вышел из строя.
 Bryan Migliorisi18 июн. 2009 г., 20:09
Конечно, это было потому, что если вы хотите разместить серьезный веб-сайт, вы не полагаетесь на то, что кто-то еще хранит ваши файлы.

Ответы на вопрос(21)

в \ x3C в строке. Когда браузер видит, он считает, что это конец блока скрипта (поскольку синтаксический анализатор HTML не имеет представления о JavaScript, он не может различить что-то, что просто появляется в строке, и что-то, что фактически должно завершаться элемент скрипта). Поэтому появление буквально в JavaScript, которое внутри HTML-страницы, приведет (в лучшем случае) к ошибкам и (в худшем случае) станет огромной дырой в безопасности.

<script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.0.0.min.js"></script>
<script>window.jQuery || document.write('<script src="js/jquery-2.0.0.min.js">\x3C/script>')</script>

вы захотите использовать свой локальный файл в качестве последнего средства.

Похоже, что в настоящее время собственный CDN jQuery не поддерживает https. Если это так, то вы можете сначала загрузить оттуда.

Так вот последовательность: Google CDN = & gt; Microsoft CDN = & gt; Ваша локальная копия.

<!-- load jQuery from Google's CDN -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> 
<!-- fallback to Microsoft's Ajax CDN -->
<script> window.jQuery || document.write('<script src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.3.min.js">\x3C/script>')</script> 
<!-- fallback to local file -->
<script> window.jQuery || document.write('<script src="Assets/jquery-1.8.3.min.js">\x3C/script>')</script> 
 21 апр. 2013 г., 12:13
+1 за хороший || синтаксис.
 26 апр. 2013 г., 19:12
Сценарий не загружается за 1 минуту, не так ли?
 26 апр. 2013 г., 09:09
Есть ли необходимость в более чем одном запасном варианте? если оба не в сети, пользователь будет ждать более минуты, прежде чем увидеть ваш сайт
 30 апр. 2013 г., 02:25
@ geo1701 и Эдвард, Третий действительно не нужен. Даже один запасной вариант еще не доказал свою надежность. Если Google API не работает, я еще не видел никаких гарантий, что первая попытка потерпит неудачу вообще. Я столкнулся с ситуацией, когда CDN никогда не сбрасывался, удерживая страницу от рендеринга, как упоминалось здесь:stevesouders.com/blog/2013/03/18/http-archive-jquery/…
Решение Вопроса

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script>
<script>
   window.jQuery || document.write('<script src="/path/to/your/jquery"><\/script>');
</script>

Это должно быть на вашей странице<head> и любые готовые обработчики событий jQuery должны быть в<body> чтобы избежать ошибок (хотя это не является надежным!).

Еще одна причинаnot Использование размещенного в Google jQuery заключается в том, что в некоторых странах доменное имя Google запрещено.

 28 июн. 2009 г., 15:42
Этот пример не будет работать. 1) если библиотека ajax Google недоступна, ей придется сначала отключиться, прежде чем произойдет сбой. Это может занять некоторое время. В моем тесте на отключение моего компьютера от сети он только что попробовал и попробовал и попытался, и время ожидания не истекло. 2) if (! JQuery) выдаст ошибку, потому что jQuery не определен, поэтому Javascript не знает, что с ним делать.
 26 июл. 2009 г., 14:52
Чтобы проверить, был ли загружен jQuery, (! Window.jQuery) работает нормально, а затем закорачивается проверка typeof.
 22 июн. 2009 г., 04:08
Разве javascript уже не блокирует (синхронно) загрузку? Мне кажется, проблема с двойным копированием не была бы проблемой.
 24 июн. 2009 г., 22:16
Как сказал Мэтт Шерман, загрузка Javascript должна быть уже синхронной. В противном случае возникнет много проблем, если страница попытается выполнить встроенный сценарий, основанный на библиотеке, которая была загружена только наполовину, или расширение библиотеки будет выполнено без полной загрузки и выполнения библиотеки. Это также одна из причин, по которой Yahoo YSlow рекомендует размещать JavaScript в конце страниц; так что он не блокирует загрузку других элементов страницы (включая стили и изображения). По крайней мере, браузер должен будет отложить выполнение, чтобы происходить последовательно.
 26 июн. 2009 г., 10:13
Небольшое исправление от фанатика валидатора: строка "& lt; / & apos" не допускается в JavaScript, потому что это может быть неправильно истолковано как конец тега сценария (сокращенная запись SGML). Do "& lt;" + "/ script & gt;" вместо. Ура,

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="path/to/your/jquery"><\/script>')</script>
 06 мар. 2014 г., 23:16
@ Trojan Вполне возможно, просто сложите вызовы. Обратите внимание, что в этот момент вы открываете новые узлы соединений, поэтому конвейер HTTP будет, вероятно, быстрее. ...<script src="//cdn1.com/jquery.js"></script> <script>window.jQuery || document.write('<script src="//cdn2.com/jquery.js"><\/script>')</script> <script>window.jQuery || document.write('<script src="local/jquery.js"><\/script>')</script>
 28 мая 2013 г., 10:48
Люди продолжают просить меня удалитьtype="text/javascript" обратите внимание, что людям, пишущим html для старых браузеров, нужно добавить это в.
 26 июл. 2013 г., 18:30
@BenjaminRH:type="text/javascript" было ненужным и в старых браузерах, так как все они по умолчанию были в Javascript.Really старые браузеры смотрели наlanguage атрибутов; но даже тогда Javascript был по умолчанию, если атрибут отсутствовал.
 26 июл. 2013 г., 19:48
@Martijn Но мне понравился блестящий значок подтверждения :)
 01 мая 2013 г., 17:18
@jpp не дляXHTML 1.0 а такжеHTML 4.01

этот код обеспечивает резервную поддержку и работает с виртуальным корнем:

@{var jQueryPath = Url.Content("~/Scripts/jquery-1.7.1.min.js");}
<script type="text/javascript">
    if (typeof jQuery == 'undefined')
        document.write(unescape("%3Cscript src='@jQueryPath' type='text/javascript'%3E%3C/script%3E"));
</script>

Или сделать помощник (вспомогательный обзор):

@helper CdnScript(string script, string cdnPath, string test) {
    @Html.Raw("<script src=\"http://ajax.aspnetcdn.com/" + cdnPath + "/" + script + "\" type=\"text/javascript\"></script>" +
        "<script type=\"text/javascript\">" + test + " || document.write(unescape(\"%3Cscript src='" + Url.Content("~/Scripts/" + script) + "' type='text/javascript'%3E%3C/script%3E\"));</script>")
}

и используйте это так:

@CdnScript("jquery-1.7.1.min.js", "ajax/jQuery", "window.jQuery")
@CdnScript("jquery.validate.min.js", "ajax/jquery.validate/1.9", "jQuery.fn.validate")
 17 мая 2014 г., 07:54
Конечно ... это была просто напыщенная речь. Однако я полагаю, что это не оптимальный способ. Если что-то не получается, я полностью игнорирую CDN и переключаюсь на запасной вариант для всех сценариев. Я не уверен, выполнимо ли это, поскольку я не знаю, как именно работает загрузка.
 17 мая 2014 г., 03:50
@maaartinus: Это не сравнение яблок с яблоками. Ответ BenjaminRH, на который вы ссылаетесь, предназначен для одного сценария, размещенного на CDN. СCdnScript помощник, вам нужна только одна строка кодаper script, Чем больше у вас сценариев, тем больше отдача.
 17 мая 2014 г., 13:48
Случай, который меня беспокоит, - это сбой сайта CDN, приводящий к задержке для многих загрузок. Поэтому я хотел бы иметь что-то вродеtry { for (Script s : ...) cdnLoad(s); } catch (...) { for (Script s : ...) ownLoad(s); }, Переводя это в кучуifЭто может быть кошмар.
 16 мая 2014 г., 01:37
Я никогда не сомневался в Razor, но он выглядит как обфускатор, за исключением того, что он делает код длиннее, а не короче (он вдвое длиннее, чемthis.
 17 мая 2014 г., 13:37
@maaartinus: Поскольку каждая загрузка сценария CDN может завершиться неудачей независимо, вы должны проверять каждую загрузку отдельно. Не существует надежного метода одиночной проверки CDN с последующей загрузкой всех сценариев из CDN по сравнению с локальными.

нтроля. Поиск пропущенных функций совершенно ошибочен как средство избежать перерыва, как описано здесь: http://www.tech-101.com/support/topic/4499-issues-using-a-cdn/

Google Hosted jQuery

If you care about older browsers, primarily versions of IE prior to IE9, this is the most widely compatible jQuery version
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
If you don’t care about oldIE, this one is smaller and faster:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>

Backup/Fallback Plan!

Either way, you should use a fallback to local just in case the Google CDN fails (unlikely) or is blocked in a location that your users access your site from (slightly more likely), like Iran or sometimes China.
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>if (!window.jQuery) { document.write('<script src="/path/to/your/jquery"><\/script>'); }
</script>

Reference: http://websitespeedoptimizations.com/ContentDeliveryNetworkPost.aspx

 11 июн. 2017 г., 07:49
Обратите внимание, что загрузка сценариев по незащищенным протоколам открывает вектор атаки XSS.

кто использует ASP.NET MVC 5, добавьте этот код в ваш BundleConfig.cs, чтобы включить CDN для jquery:

bundles.UseCdn = true;
Bundle jqueryBundle = new ScriptBundle("~/bundles/jquery", "//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js").Include("~/Scripts/jquery-{version}.js");
jqueryBundle.CdnFallbackExpression = "window.jQuery";
bundles.Add(jqueryBundle);

но я хотел бы сделать еще один шаг в отношении локального файла.

В случае, когда Google терпит неудачу, он должен загружать локальный источник, но, возможно, физический файл на сервере не обязательно является наилучшим вариантом. Я поднял этот вопрос, потому что в настоящее время я внедряю то же решение, только я хочу вернуться к локальному файлу, который генерируется источником данных.

Мои причины в том, что я хочу иметь некоторую рассудительность, когда дело доходит до отслеживания того, что я загружаю из Google, и того, что у меня есть на локальном сервере. Если я хочу изменить версии, я хочу, чтобы моя локальная копия синхронизировалась с тем, что я пытаюсь загрузить из Google. В среде, где есть много разработчиков, я думаю, что лучшим подходом будет автоматизировать этот процесс, так что все, что нужно сделать, это изменить номер версии в файле конфигурации.

Вот мое предлагаемое решение, которое должно работать теоретически:

In an application configuration file, I'll store 3 things: absolute URL for the library, the URL for the JavaScript API, and the version number Write a class which gets the file contents of the library itself (gets the URL from app config), stores it in my datasource with the name and version number Write a handler which pulls my local file out of the db and caches the file until the version number changes. If it does change (in my app config), my class will pull the file contents based on the version number, save it as a new record in my datasource, then the handler will kick in and serve up the new version.

Теоретически, если мой код написан правильно, все, что мне нужно сделать, это изменить номер версии в конфигурации моего приложения, а затем Viola! У вас есть запасное решение, которое автоматизировано, и вам не нужно хранить физические файлы на вашем сервере.

Что все думают? Возможно, это излишне, но это может быть элегантный способ поддержки ваших библиотек AJAX.

Желудь

 19 янв. 2010 г., 14:28
Если вы делаете всю эту работуjust для jQuery тогда я бы сказал, что это излишне. Однако, если у вас уже есть некоторые из этих компонентов для других частей вашего приложения (например, если вы уже загружаете скрипты из БД), то это выглядит довольно хорошо.
 07 дек. 2011 г., 21:24
+1 за тщательность и новизну, хотя я не уверен, что выгода оправдывает время и сложность разработки.
if (typeof jQuery == 'undefined') {
// or if ( ! window.jQuery)
// or if ( ! 'jQuery' in window)
// or if ( ! window.hasOwnProperty('jQuery'))    

  var script = document.createElement('script');
  script.type = 'text/javascript';
  script.src = '/libs/jquery.js';

  var scriptHook = document.getElementsByTagName('script')[0];
  scriptHook.parentNode.insertBefore(script, scriptHook);

}

В HTML5 вам не нужно устанавливатьtype приписывать.

Вы также можете использовать ...

window.jQuery || document.write('<script src="/libs/jquery.js"><\/script>');
 29 мая 2017 г., 19:40
Первый вариант, к сожалению, не загружаетсяsynchronously, Второй вариантdoes.
 27 февр. 2011 г., 06:48
+1 выглядит чище. в верхней части есть небольшая опечатка, которую я не могу очистить, так как ее второстепенные две закрывающие скобки после «неопределенного»;
 29 мая 2017 г., 18:30
Первый вариант позволяет избежать предупреждения Chrome[Violation] Avoid using document.write().

вы можете использовать встроенный yepnope.js для асинхронной загрузки ваших сценариев, в том числе jQuery (с резервным режимом).

Modernizr.load([{
    load : '//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js'
},{
    test : window.jQuery,
    nope : 'path/to/local/jquery-1.7.2.min.js',
    both : ['myscript.js', 'another-script.js'],
    complete : function () {
        MyApp.init();
    }
}]);

Это загружает jQuery из Google-CDN. После этого проверяется, была ли успешно загружена jQuery. Если нет ("nope"), загружается локальная версия. Также загружаются ваши личные скрипты - "оба" указывает, что процесс загрузки инициируется независимо от результата теста.

Когда все процессы загрузки завершены, выполняется функция, в случае «MyApp.init».

Я лично предпочитаю этот способ асинхронной загрузки скрипта. И поскольку я полагаюсь на функциональные тесты, предоставляемые modernizr при создании сайта, я все равно встраиваю его в сайт. Так что на самом деле нет накладных расходов.

 26 апр. 2013 г., 09:06
Я думаю, что вы упускаете суть вопроса - как бы вы поступили с загрузкой сценария moernizr из CDN?
 18 июн. 2017 г., 23:14
Modernizr был создан для решения проблем, как этот вопрос. +1
 01 янв. 2017 г., 01:01
Это был действительно хороший вариант во время ответа, но по состоянию на 2015 годyepnope.js устарела . увидетьstackoverflow.com/questions/33986561/…
 10 окт. 2014 г., 11:02
Таким образом, эта опция получает +16, по сравнению с 500/200 + другие опции получают. Но это звучит довольно хорошо. Это просто не популярно из-за использования Модернизатора? В любом случае, я использую Modernizer на нашем сайте, так что, если это лучше, чем другие ответы, кто-нибудь может дать мне знать? Я довольно новичок в JQuery, поэтому уточнение приветствуется.
 12 июн. 2014 г., 12:45
Я не могу рекомендовать загрузку Modernizr из CDN. Скорее следует получить наименьшую пользовательскую сборку от modernizr.com.

Также реализует задержки загрузки и тайм-ауты!

http://happyworm.com/blog/2010/01/28/a-simple-and-robust-cdn-failover-for-jquery-14-in-one-line/

 07 мая 2018 г., 20:37
Ответы только на ссылки бесполезны и считаются некачественными. Попробуйте скопировать соответствующие биты в свой ответ, указав, конечно, источник.
 08 мая 2018 г., 13:20
Я полностью согласен, я сам модерирую предложениями, но бессмысленно говорить об этом 7 лет спустя. Его следовало модерировать 7 лет назад, а не 7 лет спустя.
 08 мая 2018 г., 12:13
Да, это старый ответ. Хотя их предложение действительно. Ответы, которые являются просто ссылками в другом месте, являются кандидатами на удаление. Дальнейший читатель:meta.stackoverflow.com/q/8259
 08 мая 2018 г., 09:47
@cale_b Ты что, шутишь? Этому ответу более 7 лет, поэтому такой комментарий неоправдан.
 08 мая 2018 г., 15:11
@ Stuart.Sklinar - если бы я видел это 7 лет назад, я бы сделал это :) Я обнаружил, что здесь провожу некоторые исследования и вижу это впервые. Извините, что расстроил вас - я думаю, что наша работа на SO должна быть помощниками сайта, что иногда означает комментирование, редактирование или улучшение старых вопросов или ответов ...

document.write("<script></script>") Кажется, проще для откатов jQuery, Chrome выдает ошибку проверки в этом случае. Поэтому я предпочитаю взломать «скрипт» слово. Так становится безопаснее, как указано выше.

<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.11.1.min.js"></script>
<script>if (typeof jQuery === "undefined") {
   window.jqFallback = true;
   document.write("<scr"+"ipt src='http://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.1/jquery.min.js'></scr"+"ipt>");
} </script>

Для долгосрочных проблем было бы лучше регистрировать запасные варианты JQuery. В приведенном выше коде, если первый CDN недоступен, JQuery загружается из другого CDN. Но вы можете захотеть узнать этот ошибочный CDN и удалить его навсегда. (этот случай очень исключительный) Также лучше регистрировать проблемы с резервированием. Таким образом, вы можете отправлять ошибочные дела с AJAX. Поскольку JQuery не определен, вы должны использовать vanilla javascript для AJAX-запроса.

<script type="text/javascript">
    if (typeof jQuery === 'undefined' || window.jqFallback == true) {
        // XMLHttpRequest for IE7+, Firefox, Chrome, Opera, Safari
        // ActiveXObject for IE6, IE5
        var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
        var url = window.jqFallback == true ? "/yourUrl/" : "/yourUrl2/";
        xmlhttp.open("POST", url, true);
        xmlhttp.send();
    }
</script>

ajax.googleapis.com сcdnjs.cloudflare.com:

(function (doc, $)
{
    'use strict';

    if (typeof $ === 'undefined')
    {
        var script = doc.querySelector('script[src*="jquery.min.js"]'),
            src = script.src.replace('ajax.googleapis.com', 'cdnjs.cloudflare.com');

        script.parentNode.removeChild(script);
        doc.write('<script src="' + src + '"></script>');
    }
})(document, window.jQuery || window.Zepto);
You can stick to a jQuery version by specifying it in the string Perfect for Asset Management that doesn't work with HTML snips Tested in the wild - works perfect for users from China
 18 сент. 2017 г., 10:19
Версия является частью URL, который не будет затронут этим подходом ... jquery / 3.x.x / jquery.min.js
 11 июн. 2017 г., 07:51
Не могли бы вы пояснить следующее утверждение: «Вам не нужно заботиться о версии jQuery»?
 10 окт. 2017 г., 11:19
Я так не думаю ...
 23 сент. 2018 г., 00:44
-1, потому что это приведет к поломке, если jQuery внесет критические изменения, которые ваши скрипты пока не поддерживают, если не указана версия.
 18 сент. 2017 г., 13:41
Может ли это привести к поломке, когда jQuery переходит на версию 4 и вносит обратно несовместимые изменения?
if (typeof jQuery == 'undefined')) { ...

Или же

if(!window.jQuery){

Не будет работать, если версия cdn не загружена, потому что браузер будет проходить через это условие и во время него все еще загружает остальные javascripts, которым требуется jQuery, и он возвращает ошибку. Решением было загрузить сценарии через это условие.

    <script src="http://WRONGPATH.code.jquery.com/jquery-1.4.2.min.js" type="text/javascript"></script><!--  WRONGPATH for test-->
  <script type="text/javascript">
  function loadCDN_or_local(){
    if(!window.jQuery){//jQuery not loaded, take a local copy of jQuery and then my scripts
      var scripts=['local_copy_jquery.js','my_javascripts.js'];
      for(var i=0;i<scripts.length;i++){
      scri=document.getElementsByTagName('head')[0].appendChild(document.createElement('script'));
      scri.type='text/javascript';
      scri.src=scripts[i];
    }
  }
  else{// jQuery loaded can load my scripts
    var s=document.getElementsByTagName('head')[0].appendChild(document.createElement('script'));
    s.type='text/javascript';
    s.src='my_javascripts.js';
  }
  }
  window.onload=function(){loadCDN_or_local();};
  </script>
 27 февр. 2011 г., 10:42
Я обнаружил одну проблему при тестировании скриптов в Google Chrome - кеширование. Таким образом, для локального тестирования просто замените src в секции else на что-то вроде s.src = 'my_javascripts.js' + 'a'; + & ap;; Math.floor (Math.random () * 10001);
 19 апр. 2011 г., 03:16
Alex's answer не будет работать, если версия cdn не загружена, потому что браузер будет проходить через это условие и во время него все еще загружает остальные javascripts, которым требуется jquery, и он возвращает ошибку - & GT;JavaScript files being downloaded will block the next piece of code from being ran so it's not an issue.
Step 1: Did jQuery fail to load? (check jQuery variable)

Как проверить неопределенную переменную в JavaScript

Step 2: Dynamically import (the backup) javascript file

Как включить файл JavaScript в другой файл JavaScript?

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>window.jQuery || document.write('<script type="text/javascript" src="./scripts/jquery.min.js">\x3C/script>')</script>

Но также есть библиотеки, которые вы можете использовать для настройкиseveral Возможные резервы для ваших скриптов и оптимизации процесса загрузки:

basket.js RequireJS yepnope

Примеры:

basket.js Я думаю, что лучший вариант на данный момент. Кэширует ваш скрипт в localStorage, что ускорит следующие загрузки. Самый простой вызов:

basket.require({ url: '/path/to/jquery.js' });

Это вернет обещание, и вы можете сделать следующий вызов в случае ошибки или загрузить зависимости в случае успеха:

basket
    .require({ url: '/path/to/jquery.js' })
    .then(function () {
        // Success
    }, function (error) {
        // There was an error fetching the script
        // Try to load jquery from the next cdn
    });

RequireJS

requirejs.config({
    enforceDefine: true,
    paths: {
        jquery: [
            '//ajax.aspnetcdn.com/ajax/jquery/jquery-2.0.0.min',
            //If the CDN location fails, load from this location
            'js/jquery-2.0.0.min'
        ]
    }
});

//Later
require(['jquery'], function ($) {
});

yepnope

yepnope([{
  load: 'http://ajax.aspnetcdn.com/ajax/jquery/jquery-2.0.0.min.js',
  complete: function () {
    if (!window.jQuery) {
      yepnope('js/jquery-2.0.0.min.js');
    }
  }
}]);

который должен динамически загружать jQuery, если он еще не загружен, и если источник не работает, он переходит к запасным вариантам (сшитым из множества ответов):https://gist.github.com/tigerhawkvok/9673154

Обратите внимание, что я планирую обновлять Gist, но не этот ответ, поскольку он того стоит!

/* See https://gist.github.com/tigerhawkvok/9673154 for the latest version */
function cascadeJQLoad(i) { // Use alternate CDNs where appropriate to load jQuery
    if (typeof(i) != "number") i = 0;
    // the actual paths to your jQuery CDNs
    var jq_paths = [
        "ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js",
        "ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.0.min.js"
    ];
    // Paths to your libraries that require jQuery
    var dependent_libraries = [
        "js/c.js"
    ];
    if (window.jQuery === undefined && i < jq_paths.length) {
        i++;
        loadJQ(jq_paths[i], i, dependent_libraries);
    }
    if (window.jQuery === undefined && i == jq_paths.length) {
        // jQuery failed to load
        // Insert your handler here
    }
}

/***
 * You shouldn't have to modify anything below here
 ***/

function loadJQ(jq_path, i, libs) { //load jQuery if it isn't already
    if (typeof(jq_path) == "undefined") return false;
    if (typeof(i) != "number") i = 1;
    var loadNextJQ = function() {
        var src = 'https:' == location.protocol ? 'https' : 'http';
        var script_url = src + '://' + jq_path;
        loadJS(script_url, function() {
            if (window.jQuery === undefined) cascadeJQLoad(i);
        });
    }
    window.onload = function() {
        if (window.jQuery === undefined) loadNextJQ();
        else {
            // Load libraries that rely on jQuery
            if (typeof(libs) == "object") {
                $.each(libs, function() {
                    loadJS(this.toString());
                });
            }
        }
    }
    if (i > 0) loadNextJQ();
}

function loadJS(src, callback) {
    var s = document.createElement('script');
    s.src = src;
    s.async = true;
    s.onreadystatechange = s.onload = function() {
        var state = s.readyState;
        try {
            if (!callback.done && (!state || /loaded|complete/.test(state))) {
                callback.done = true;
                callback();
            }
        } catch (e) {
            // do nothing, no callback function passed
        }
    };
    s.onerror = function() {
        try {
            if (!callback.done) {
                callback.done = true;
                callback();
            }
        } catch (e) {
            // do nothing, no callback function passed
        }
    }
    document.getElementsByTagName('head')[0].appendChild(s);
}

/*
 * The part that actually calls above
 */

if (window.readyState) { //older microsoft browsers
    window.onreadystatechange = function() {
        if (this.readyState == 'complete' || this.readyState == 'loaded') {
            cascadeJQLoad();
        }
    }
} else { //modern browsers
    cascadeJQLoad();
}

UPDATE:
смотрите комментарии для реального объяснения.

Большинство из вас ответили на вопрос, но что касается заключительной части:

What would be the danger of both copies coming through?

Никто на самом деле. Вы тратили бы лишнюю пропускную способность, могли бы добавить несколько миллисекунд, загружая вторую бесполезную копию, но это не реальный вред, если они оба проходят. Вы должны, конечно, избегать этого, используя методы, упомянутые выше.

 29 июн. 2015 г., 15:03
почему бы вам не проверить это самостоятельно и вручную загрузить библиотеку jquery дважды. тогда ответ будет раскрыт.
 06 сент. 2013 г., 22:10
На самом деле, загрузка jQuery дважды может вызвать много проблем, согласноthis question.
 30 мая 2017 г., 18:07
Почему именно это так неправильно? @ ShadowCat7 Вы можете более конкретно рассказать о проблемах, которые это вызывает? Единственная проблема, которую я вижу в указанном вопросе, - это «очистка всех ранее загруженных плагинов». Но это не должно относиться к загрузке одного и того же файла jQuery дважды подряд, верно? Я спрашиваю, потому что другие решения здесь для локального отступления настолько запутаны, а document.write клевещет какevil в некоторыхplaces.

<!--[if lt IE 9]>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
    <script>window.jQuery || document.write('<script src="/public/vendor/jquery-legacy/dist/jquery.min.js">\x3C/script>')</script>
<![endif]-->
<!--[if gte IE 9]><!-->
    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
    <script>window.jQuery || document.write('<script src="/public/vendor/jquery/dist/jquery.min.js">\x3C/script>')</script>
<!--<![endif]-->
 11 июн. 2017 г., 07:47
Это не совместимо с разными браузерами.
 22 июн. 2017 г., 19:39
Джош, да, это так.

Ваш ответ на вопрос