Зачем объявлять jQuery дважды? [дубликат]



этот вопрос уже есть ответ здесь:



какова цель следующего кода?



обратите внимание, что перед вторым кодом скрипта ниже,jquery.min.js комплект googleapis.



<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="/assets/js/vendor/jquery.min.js"></script>')</script>
423   4  

4 ответов:

это для отступления к jquery.min.js файл хранится на том же сервере, когда CDN не работает или не может быть достигнуто.

это, по сути, говорит:

// 1. Try to download and run https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js

// 2. Was jQuery successfully loaded from the CDN? If so, it will be defined:
if (window.jQuery) {
    // Yes, it's defined. Good. Nothing more needed.
}
else {
    // No, it's not defined. Use my copy:
    document.write('<script src="/assets/js/vendor/jquery.min.js"><\/script>')
}

подробнее здесь и вы можете найти исходный код здесь.

о window.jQuery || document.write(...) это по существу стенография для кода выше. Когда определено window.jQuery будет истина и так заявление на правой стороне || не будет выполняется; однако, если он не определен, это будет ложь и заявление на правой стороне ||будет быть казнен.

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

Если версия CDN загружается, окно.jQuery установлен,или короткое замыкание, и код идет дальше.

Если версия CDN не может быть загружена по какой-либо причине, она добавляет другой тег сценария на страницу, указывающую на локально размещенную версию из сценария.

Edit: как указывает MTCoster в комментарий выше, этот трюк зависит от того, как JavaScript обычно загружается. Браузер приостанавливает выполнение до тех пор, пока тег не загрузится или не истечет время ожидания. Если jQuery были загружены асинхронно с помощью асинхронные атрибут, этот трюк не будет работать.

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

второй попытается найти объект jQuery в window, и только если он не найдет его, то он загрузит библиотеку из внутренней ссылки. Это только запасной вариант в случае сбоя CDN.

window.jQuery || document.write(...)
// the code above means the same as the code below
if (window.jQuery === undefined) document.write(...)

в Javascript, кроме логических значений (true / false), есть истинные и ложные значения. Все, что отличается от 0,false,undefined и null является истинным значением.

в том случае, если jQuery свойство существует в окне, это будет объект, и это будет истинное значение, поэтому второе утверждение не будет выполняться (потому что первое уже истинно - и в OR оператор, если какое-либо из утверждений истинно, он пропускает остальные (слева направо).

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

это резервный механизм, если jquery от CDN не достигается по какой-то причине, как заблокирован брандмауэром, CDN вниз и т. д

добавлю еще один практический сценарий, с которым я столкнулся в прошлом году. Один из моих клиентов решил разместить и использовать веб-приложение, созданное мной в локальной сети без доступа в интернет. С локальным IIS приложение было развернуто правильно, но не удалось из-за отсутствия CDN, если бы я использовал код, упомянутый в вопросе, веб-приложение работало бы первый раз без каких-либо изменений.

Я надеюсь, что теперь это будет иметь смысл:) для меня это был урок.

Comments

    Ничего не найдено.