Почему не оба ¯ \ _ (ツ) _ / ¯? Скотт Хансельман (Scott Hanselman) написал отличную статью об использовании CDN для повышения производительности, но изящно прибегает к локальной копии на случай, если CDN не работает .
В зависимости от начальной загрузки вы можете выполнить следующие действия для загрузки из CDN с локальным резервом :
<head>
<!-- Bootstrap CSS CDN -->
<link rel="stylesheet" href="~https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css">
<!-- Bootstrap CSS local fallback -->
<script>
var test = document.createElement("div")
test.className = "hidden d-none"
document.head.appendChild(test)
var cssLoaded = window.getComputedStyle(test).display === "none"
document.head.removeChild(test)
if (!cssLoaded) {
var link = document.createElement("link");
link.type = "text/css";
link.rel = "stylesheet";
link.href = "lib/bootstrap.min.css";
document.head.appendChild(link);
}
</script>
</head>
<body>
<!-- APP CONTENT -->
<!-- jQuery CDN -->
<script src="~https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script>
<!-- jQuery local fallback -->
<script>window.jQuery || document.write('<script src="lib/jquery.min.js"><\/script>')</script>
<!-- Bootstrap JS CDN -->
<script src="~https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
<!-- Bootstrap JS local fallback -->
<script>if(typeof($.fn.modal) === 'undefined') {document.write('<script src="lib/bootstrap.min.js"><\/script>')}</script>
</body>
Обновления
- Вы также можете сделать тот же тест, используя YepNope или fallback.js
- согласно комментарию Flash и этому решению , обновленный ответ для проверки
.visible
класса вместо проверкиrgb(51, 51, 51)
- за комментарий Десте , обновленный для использования
.hidden
и .d-none
для Boostrap 3.x или 4
- при тестировании загрузки таблицы стилей необходимо найти стиль, который был бы применен, создать элемент и посмотреть, был ли он применен.
- Обновлена таблица стилей для немедленной загрузки в голове с помощью vanilla js. Вам необходимо создать тестовый элемент с помощью
Document.createElement()
, применить классы начальной загрузки, использовать Window.getComputedStyle()
для тестирования display:none
, а затем условно вставить таблицу стилей с помощью js.
Лучшие практики
На ваш вопрос о Best Practices есть много очень веских причин для использования CDN в производственной среде :
- Это увеличивает доступность параллелизма .
- Это увеличивает вероятность попадания в кеш .
- Это гарантирует, что полезная нагрузка будет как можно меньше .
- Это уменьшает количество полосы пропускания, используемой вашим сервером.
- Это гарантирует, что пользователь получит географически близкий ответ.
Что касается вашей работы с версиями, то любой CDN, достойный своего веса, позволяет вам ориентироваться на конкретную версию библиотеки, чтобы случайно не вносить критические изменения в каждом выпуске.
С помощью document.write
Согласно МДН на document.write
Примечание : при document.write
записи в поток документов , вызов document.write
закрытого (загруженного) документа автоматически вызывает document.open
, что приведет к очистке документа .
Тем не менее, использование здесь является намеренным. Код должен быть выполнен до полной загрузки DOM, а также в правильном порядке. Если jQuery дает сбой, нам нужно вставить его в документ, прежде чем мы попытаемся загрузить начальную загрузку, которая опирается на jQuery.
HTML-вывод после загрузки :
В обоих случаях мы звоним, пока документ еще открыт, поэтому он должен включать содержимое, а не заменять весь документ. Если вы ждете до конца, вам придется заменить на, document.body.appendChild
чтобы вставить динамические источники.
Кроме того : в MVC 6 это можно сделать с помощью помощников по ссылкам и тегам скриптов.
rgb(51, 51, 51)
кажется рискованным - что если кто-то изменит цвет и забудет обновить его? Есть ли более стабильное свойство, которое можно использовать?<body>
элемент. Этот ответ добавляет некоторую разметку с.hidden
DIV , а затем делает тест , чтобы увидеть , если это видно:$('#bootstrapCssTest').is(':visible')
. Этот класс, вероятно, гораздо реже будет иметь серьезные изменения с течением времени.Зависит от конкретного сайта.
У вас много пользователей? Вы заботитесь об использовании пропускной способности? Является ли производительность проблемой (CDN могут ускорить ответы)?
Вы можете сослаться на конкретную версию:
Или
Таким образом, вам не нужно беспокоиться об обновлениях библиотеки, поэтому рекомендуется постоянно обновляться.
Я не уверен, какова точная статистика по выбору разработчиков, но вы можете посмотреть здесь и увидеть, что миллиарды запросов отправляются в Bootstrap CDN, что означает, что он надежен и безопасен в использовании.
источник
Я пытался отредактировать ответ KyleMit, но форум отмечался как неправильный код с отступом, даже это не так, поэтому я добавляю свой вклад прямо ниже:
Поскольку вопрос помечен как твиттер-самозагрузка тема (и не только твиттер-самозагрузки-3 ), возможно, полезно обновить ответ для более новой версии Bootstrap.
Поскольку платформа добавила новый класс для сокрытия элементов в своей четвертой версии, мы должны использовать
.d-none
вместо этого.hidden
в этом случае.Все остальное остается тем же в этом случае, кроме версии lib (конечно!)
источник
Благодаря @KyleMit. Другой способ отступить - использовать объект 'window', как показано ниже:
Это работает так: если ссылка CDN работает, объект 'window' будет иметь свойство 'jQuery', доступное, иначе будет выполнена вторая часть скрипта, т.е. document.write, которая указывает на локальную копию.
Ответ на оригинальный вопрос. Наличие CDN имеет много преимуществ, таких как быстрая загрузка без ущерба для вашего сервера и пропускной способности. Наличие локальной копии имеет свою выгоду (как запасной вариант). В интрасети из-за настроек прокси-сервера, политик безопасности ссылка CDN может не работать или если связь CDN не работает, она может не работать. Прямой ответ - иметь оба.
источник
Почти все общедоступные CDN довольно надежны. Однако, если вы беспокоитесь о той части времени, когда CDN может быть недоступен, вы можете загрузить Bootstrap из одного CDN Bootstrap и перейти к альтернативному CDN в случае, если первый не работает.
О вашей второй проблеме: ссылки в этом посте - это жестко запрограммированные версии начальной загрузки и jquery. Таким образом, даже если библиотеки начальной загрузки и jquery постоянно развиваются и получают новые функции, ваш сайт со временем останется прежним.
источник