Выбор jQuery 1.9 или 2.0 с использованием JavaScript и Require.JS

jQuery 2.0 становится все более зрелым: http://blog.jquery.com/2013/03/01/jquery-2-0-beta-2-released/

jQuery 2.0 нарушает совместимость со старыми браузерами, поэтому нужно знать, когда стоит с jQuery 1.9. Рекомендуемый подход заключается в использовании условных комментариев IE:

<!--[if lt IE 9]>
    <script src="jquery-1.9.1.js"></script>
<![endif]-->
<!--[if gte IE 9]><!-->
    <script src="jquery-2.0.0b2.js"></script>
<!--<![endif]-->
  • Современная передовая практика веб-разработки подсказывает, что нам следует избегать анализа синтаксического анализа браузером или пользовательского агента, но разве это не такие условные комментарии?

  • работает ли jQuery 2.0 только для совместимости со старым Internet Explorer? или есть ли другие браузеры, которые будут хуже в 2.0?

  • Если это влияет не только на Internet Explorer (это единственное место, где работают условные комментарии), то какую стратегию мы должны использовать для выбора лучшего jQuery?

  • существует ли глобально доступное значение/объект/функция/etc в среде JavaScript, чье присутствие может использоваться для сигнализации совместимости с jQuery 2.0 (например, с функцией обнаружения)?

главный вопрос

Мои проекты в настоящее время используют Require.JS для модульного кода. Мой код загружает jQuery только тогда, когда он встречает первый раздел, который требует его.

Каков наилучший способ загрузки правильной версии jQuery с помощью Require.JS?

Я сейчас рассматриваю:

  • с использованием условных комментариев IE до того, как я загружу Require.JS, а затем "определение" jQuery вручную

  • с использованием функции обнаружения JS в коде, который устанавливает пути Require.JS(прежде чем что-либо потребует jQuery), установив путь к 1.9 или 2.0 (мой предпочтительный метод)

  • всегда использует 1.9 независимо от того, что (самый безопасный и самый скучный подход)

Ответ 1

Адаптация niaccurshi отвечает спецификации AMD.

// Do this before your first use of jQuery.

var pathToJQuery
if('querySelector' in document
    && 'localStorage' in window
    && 'addEventListener' in window) {
    pathToJQuery = '//cdn/jQuery2.0'
} else {
    pathToJQuery = '//cdn/jQuery1.9'
}

require.configure({'paths':{
    'jquery': pathToJQuery
}})

require(['jquery'], function($){ /* you get the one you need here */ })

Ответ 2

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

Он по существу определяет браузеры, которые считаются new, и, следовательно, будет совместим с jQuery 2.0+ и, следовательно, оставляет все остальное в качестве браузера old. Вы можете воспроизвести это с помощью Require.js, но на самом деле вам не нужно...

if(querySelector in document
    && localStorage in window
    && addEventListener in window) {
    //Add jQuery 2.0+
} else {
    //Add jQuery 1.9.0+
}

//This is intended to be a flag that can be checked against to see if the jQuery library has been loaded into the browser.
var jQueryVersion = 0;
function jQueryRunning(ver) {
    //This could be "true", or could be a version number, it largely down to your own system needs!
    jQueryVersion = ver;
}

Источник: ссылка

Вы должны добавить функцию обратного вызова для каждого из сценариев для jQuery, которая вызывает jQueryRunning с параметром, равным номеру версии, это может помочь вам решить, какие дополнительные функции будут выполняться по линии, и полезно сообщить, когда внедрен код jQuery (just in case the connection is slow and it takes a while to download).

Если вы используете Require.js, это может быть не то, о чем вы хотите беспокоиться!

Я говорю, что это элегантное решение, потому что вы совершенно правы, проблема заключается не только в старых версиях IE, но и в старых версиях Firefox (before 3.5) и старых мобильных браузерах (если они даже имеют дело с javascript! )