Не CDN единым

В последнее время стало модно говорить о доступности при разработке сайтов, писать rel, alt, делать версию для слабовидящих и так далее, однако почему бы сначала не подумать о нормальных пользователях. Подключая jQuery из CDN:

<script src="http://code.jquery.com/ui/1.9.0/jquery-ui.js"></script>

… многие забывают очень важную деталь.

Конечно же, нужно не забывать проверить, подгрузилась ли библиотека, и если нет, то подгрузить с собственного сайта. Для этого можно просто добавить:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.11.2.min.js"><\/script>')</script>

Это настолько просто, однако, многие крупные сайты грешат тем, что забывают про это. Реальный пример – крупный ресурс, завязанный на работу с клиентами из Китая, забыв про эту проверку, сделал невозможной работу этих клиентов с их сайтом, если клиент не использовал vpn. Причина проста: подгружали с CDN гугла, а в Китае почти все гугловское заблокировано (被和谐了).

Разработчики, пожалуйста, не забывайте об этом!

Ну а тех, кто не хочет замарачиваться с vpn, и при этом хочет чтоб скрипты с ajax.googleapis.com подгружались, можно порекомендовать следующий совет:
В файле hosts пропишите следующую строку
127.0.0.1	ajax.googleapis.com

Затем установить python, если он ещё не установлен в системе, и запустить скрипт:
#-*- coding: utf-8 -*-
import SocketServer
import SimpleHTTPServer
import urllib
import os

PORT = 80

class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        if '/ajax/libs/' in self.path:
            self.path = self.path.replace('/ajax/libs/','http://yastatic.net/')
            self.copyfile(urllib.urlopen(self.path), self.wfile)

if os.name == 'posix':
    httpd = SocketServer.ForkingTCPServer(('', PORT), Proxy)
else:
    httpd = SocketServer.ThreadingTCPServer(('', PORT), Proxy)

print "serving at port", PORT
httpd.serve_forever()

При этом, естественно, нужно убедиться в том, что скрипты с yastatic.net у вас грузятся.
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 47

    +6
    Эти слова да в уши всем…

    CDN — это самая большая проблема всех серьёзных сайтов. Буквально недавно лежал gitter просто потому, что их собственная cdn не отдавала данные, из-за чего сервер нормально работал, но сам сайт не функционировал. Конечно же это не единственный пример из жизни — я почти уверен, что у многих были такие же проблемы.
      +2
      У нас суровые прокси-админы требуют имя сайта для добавления в белый лист, но потом оказывается что добрые разработчики напихали ссылки на десяток js скриптов и библиотек себе на сайтик (причем именно ссылок на другие сайты) и юзер после эпопеи мыторств с разблокировкой сайта получает нерабочий сайт и не знает кому жаловаться. И у нас не Китай, а просто корп. сеть. С техподдержкой (от слова худо) во Франции.
        +2
        если минусующие не поняли, я поддерживаю стремление хостить весь необходимый контент на своём сайте во избежание трудностей с его разблокировкой на корп. проксях
          +3
          Да не только из-за этого (из-за корп.сетей) стоит хостить у себя:

          Плюсы CDN:
          — Распределённая сеть, которая позволяет быстрее получать контент из разных точек мира
          — Сервера заточены для раздачи статики
          — Разгрузка основного сервера

          Минусы CDN:
          — Спорная выгода по скорости (может быть даже проигрыш):
          — для подключения к cdn требуется новое подключение и новый резолв сервера\dns, а то что браузеры игнорят стандарт http/1.1 по части количества одновременных подключений к одному серверу ни для кого не секрет.
          — скорость отдачи может быть такой же, как у родителя

          — Почти всегда объединение и минификация ассетов в разы выигрышнее и удобнее, нежели отдача кусочками с разных серверов
          — Gzip работает эффективнее
          — Грузится один раз и кешируется — пользователь особо не заметит разницу между двумя скриптами\стилями по 300кб и одним в 600кб (учитывая издержки на создание нового подключения и существование проблемы «забитого канала» мелкими файликами — второй вариант может быть даже лучше)

          — Не придётся придумывать всякие откаты, когда cdn лежит
          — Если сайт работает — он работает весь, если не работает, то не работает весь — никаких полумер из-за проблем в cdn.

          Итог:
          Я соглашусь, что для хранения всякого видео или картиночек стоит использовать именно CDN — это довольно сильно разгрузит основной сервер и сократит трафик (при высоких нагрузках это более чем необходимо). Но для всяких скриптов и\или стилей — это в любом случае минус, нежели что-то необходимое.
            +3
            Основной плюс использования больших чужих CDN в том, что видя адрес библиотеки code.jquery.com/ui/1.9.0/jquery-ui.js браузер вообще никуда не пойдёт, а возьмёт её из кэша, где она появилась сто лет назад, когда пользователь заходил на другой сайт который подключал библиотеку с этого же CDN.

            Если CDN свой, то вы скорее всего очень крупный проект и вам без CDN никак.
              +5
              А вы считали сколько таких кеш-хитов, а сколько промахов? Особенно учитывая, что сайты либо в основном хостят у себя, либо все на разных CDN, а кеш браузера тоже не резиновый.
                +4
                … и еще и разные версии.
                  +2
                  Я использую jquery со страницы выдачи яндекса — она там 1.8.3 но меня устраивает. Для рунета самое то
                0
                это в теории. А на практике как-то получается, что это всё работает только в Северной Америке.
                0
                Также сомнительны тезисы:
                — Почти всегда объединение и минификация ассетов в разы выигрышнее и удобнее, нежели отдача кусочками с разных серверов
                Я уже выше написал, что при подключении популярных библиотек с CDN загрузки вообще скорее всего не будет. Грузить с разных хостов быстрее, потому что в браузере ограничение на количество соединений на один хост.Вы конечно могли бы склеить вообще все крипты в один файл, но тогда клиентам прийдется при малейшей правке сайта перетягивать все ваши мегабайты скриптов.

                — Gzip работает эффективнее
                Гзип работает эффективнее чего? CDNа? Это технологии которые решают схожие (но не одни и те же) проблемы разными способами, их вообще сомнительно сравнивать. И уж конечно все CDN'ы отдают библиотеки гзипованными (по крайней мере те которые я знаю).

                — Грузится один раз и кешируется — пользователь особо не заметит разницу между двумя скриптами\стилями по 300кб и одним в 600кб
                1) загрузки 300кб библиотеки скорее всего не будет, потому что она уже в кэше
                2) при минимальном изменении вашего сайта прийдется перекачивать не только ваши 300кб но 300кб библиотеки, потому что вы все сжали в 1 файл
                3) кэш вашего сайта может быть вытеснен и все прийдется перекачивать по новой, в то время как кэш CDN'овской библиотки с большей вероятностью будет живой (к нему обращения скорее всего будут идти чаще чем к вашему)
                4) пользователи мобильного интернета замят разницу в 300кб.
                  +6
                  Я уже выше написал, что при подключении популярных библиотек с CDN загрузки вообще скорее всего не будет.

                  1) Версии одного только Jquery
                  Скрытый текст
                  2.1.3, 2.1.2, 2.1.1, 2.1.0, 2.0.3, 2.0.2, 2.0.1, 2.0.0, 1.11.2, 1.11.1, 1.11.0, 1.10.2, 1.10.1, 1.10.0, 1.9.1, 1.9.0, 1.8.3, 1.8.2, 1.8.1, 1.8.0, 1.7.2, 1.7.1, 1.7.0, 1.6.4, 1.6.3, 1.6.2, 1.6.1, 1.6.0, 1.5.2, 1.5.1, 1.5.0, 1.4.4, 1.4.3, 1.4.2, 1.4.1, 1.4.0, 1.3.2, 1.3.1, 1.3.0, 1.2.6, 1.2.5, 1.2.4, 1.2.3, 1.2.2, 1.2.1, 1.2.0

                  2) Из cdn: google, yandex, microsoft, cdnjs, jsdelivr, amazon и боюсь ещё небольшая кучка найдётся. То что совпадёт и версия и cdn — шанс один на… хм… Вы действительно верите в этот мистический шанс?
                  3) Как уже выше было сказано — кеш периодически может чиститься (актуально у мобильных браузеров)

                  Гзип работает эффективнее чего? CDNа?

                  Gzip работает эффективнее на бо́льших объёмах данных, т.к. словарь больше. Как следствие результирующий (на отдачу) объём данных с jq и без него может быть почти что одинаковым.

                  А по поводу последнего:
                  Объём jquery (если на реальных цифрах) 34kb (не 300) — это примерно столько же, сколько одна картиночка на странице, размером 200х200 (например на том же сайте jquery). А своё мнение на все остальные аргументы я выше уже озвучил.
                  +1
                  но тогда клиентам прийдется при малейшей правке сайта перетягивать все ваши мегабайты скриптов

                  Именно для этого собирают не в один файл, а в несколько логических, и не заставляют пользователя перезагружать то, что не меняется.
                    0
                    Но тогда всплывет проблема установления соединения (хотя есть надежда что используется Keep-Alive), которая приводится как минус использования CDN, ограничение на количество запросов на один хост (котрого кстати нет в случае CDN) еще и куки надо по сети лишний раз гонять, и кэш не общий с другими сайтами. В общем если жать в несколько файлов то совсем не понятно почему бы просто не использовать CDN. Если критична работоспособность на случай падения yandex.st или ajax.googleapis.com можно сделать фоллбэк.
            0
            В добавление к этому можно добавить ещё немного логики для short circuiting (circuit breaker), чтобы в случае недоступности CDN не все пользователи ждали таймаута, а только первые.
              +3
              А хостить jquery у себя — не выход???
              А то сейчас расплодятся завирусованные роутеры, подсовывающие левую jquery и начнут тырить все, до чего дотянутся…
                +3
                Это ведь для ускорения загрузки придумано, зачем грузить сто раз один и тот же файл на разных сайтах, о пользователях, мол, думают.
                  0
                  «Сейчас расплодятся»? Да их уже тысячи. Только бороться с этим нужно иначе: использовать HTTPS.
                  –3
                  предпочитаю делать сборку скриптов в один файл через RequireJS, а jquery и прочее подтягивать через bower

                    0
                    Когда-то раньше я так и делал. Но к сожалению на практике проверка существования библиотеки работала ненадежно. Не знаю почему.
                      +24
                      Немного не тот случай, но тоже о важности контроля чужих скриптов. Есть такой известный сайт продажи билетов ponominalu.ru. Захожу как-то, прохожу все круги процесса заказа, остается последняя и самая важная кнопка собственно заказа и перехода к оплате. И она не работает. Занажимайся. Страницу перезагрузил, адблок выключил — не работает. Полез в JS-консоль и все прояснилось. Они вешают на кнопку заказа событие яндекс-метрики, а у меня в hosts mc.yandex.ru указывает на 127.0.0.1. В общем, скрипт метрики у меня не грузится, а событие не проверяет существует ли объект метрики перед обращением к нему. То есть они сделали самую важную, приносящую деньги кнопку, зависимой от стороннего скрипта. Забавно еще, что так как эти сбои и связаны со скриптом метрики, в статистике они этих отказов не увидят и будут думать, что все хорошо.
                        +1
                        Эта проблема известна. На самом деле потери подобных клиентов — 1%. Если рассчитывать на то, что каждый клиент будет себе что-то прописывать в hosts файле, или будет использовать, например, IE 6, кнопка «оформить заказ» не покроет расходов на разработку. Можно было бы еще в hosts файле указать ponominalu.ru на 127.0.0.1 и написать об этом пост на хабре, что сайт не работает.
                          0
                          В большинстве случаев, возможно, это так, однако в частных случаях эта мелочь может стать решающей.
                          Прожив в Китае всего год, я был поражен насколько мало сервисов заботится о таких как я пользлователях, почти каждый день наталкиваюсь на не рабочие сайты. Пользователей интернета в Китае не так мало, чтобы не думать о них совсем, особенно если ваш сервис расчитан на азиатский рынок.
                            0
                            Ну конечно, то что я прописал в hosts домен яндекса — моя проблема. Однако сервис может быть недоступен по другой причине. Ту же метрику может блокировать какой-нибудь плагин браузера, да и вообще она может просто упасть. Наверное метрика падает очень редко, но это дополнительная точка отказа. Да и 1% может быть немало в денежном эквиваленте.
                              0
                              Насчет отказа метрики — соглашусь. В данном конкретном случае устранение подобной проблемы не оказалось затруднительным, ponominalu проблему уже исправил. Но в целом, потенциальных проблем в подобной категории очень много, всего не предусмотришь, по разным причинам.
                            +1
                            Спасибо. Поправили.
                            +2
                            буквально вчера столкнулся с проблемой неработающего jQuery на сайте Кинопоиск. Причина оказалась в том, что они подгружают jQuery c yandex.st, а расширение Disconnect для хрома по моему указанию режет лишние запросы к яндексу — в итоге был заблокирован и запрос к jQuery-библиотеке
                              +2
                              Код не рабочий. Надо как-то так:
                              document.write(unescape("%3Cscript src='/js/jquery.js' type='text/javascript'%3E%3C/script%3E"));
                              
                                0
                                спасибо, исправил пост.
                                +1
                                Раз уже речь зашла о Китае, у них есть локальные CDN (Baidu CDN Library, Sina Public Resources, UpYun Library) — context.tips/seo/hosting-javascript-bibliotek-pri-prodvizhenii-v-kitae/
                                  +1
                                  Кстати, сайт в приведенной вами ссылке, тоже грузит jQuery с ajax.googleapis.com не проверяя, и главное меню из-за этого не работает у пользователей из Китая не использующих vpn, это я как один из таких пользователей говорю.
                                  +11
                                  Чем строить сайт «по-модному», когда через десяток CDN и хостов грузятся пара десятков файликов css и js, куда лучше собрать их в единый css и в единый js, и отдавать со своего сервера. Выйдет мало что быстрее, так еще и надежнее.

                                  Дело в том, что логика «jQuery юзают все, так что, указав его cdn как источник файла, можно заставить файл не грузиться, а браться из кеша браузера» разбивается о то, что

                                  1) версий jQuery не одна и не две (умножайте, кстати, на два: кто-то .min использует, кто-то — «просто»). Не факт, что у юзера в кеше есть нужная, зато факт, что на ДНС-ресолвинг и на установление соединения уйдет свое время.
                                  2) сайты нынче толстые, время жизни кеша не глядя ставят в огромные значения. На выходе имеем, что эпизодические посещение одних сайтов выдавливает из кеша важдые библиотеки из cdn-ов, использованных на других сайтах. Получается, что от кеша эффекта куда меньше, чем хочется увидеть.

                                  Но вот шанс сломать себе сайт или затянуть его загрузку от использования чужого хоста как источника файлика с normalize.css или jquery.min.js — он вполне реальный, и, увы, не нулевой. Если же через cdn у вас грузятся еще и веб-фонты, все становится еще грустнее: страница висит пустой долгие секунды, и юзеры, не дождавшись, могут вообще ее закрыть.

                                  Вывод: если вы не гугл по посещению, не страдайте «оптимизацией» там, где это не необходимо!
                                    0
                                    Когда значение hit/miss низкое, то кэширование становится вредным
                                    +1
                                    На самом деле это не совсем панацея. Я как-то не мог скайп скачать потомучто у меня CDN от майкрософт не работал. А таймаут стоял такой зверский, что я просто устал ждать прогрузки страницы…

                                    Видимо лучший вариант на данный момент все JS сжимать на сайте в один файлик и грузить со своего сервера.
                                      0
                                      Почему-то в каждом втором комментарии вспоминают про кеширование с CDN (которое не факт что происходит), но никто не задумывается о лимите параллельных соединений браузера. А ведь это по идее тоже влияет на скорость загрузки сайта, даже если не учитывать кеширование.
                                        +2
                                        В последнее время стало модно говорить о доступности (accessibility) при разработке сайтов, писать rel, alt, делать версию для слабовидящих и так далее, однако почему бы сначала не подумать о нормальных пользователях. Подключая jQuery из CDN:


                                        Какой-то бред! Причём здесь противопоставление с accessibility? Да и какое вообще отношение это имеет к accessibility (как на уровне хаба, так и на уровне тегов)?

                                        Призыв-то хороший, только по-моему у вас в голове каша и перепутаны понятия accessibility и availability.

                                        • Accessibility — это свойство продукта, характеризующее возможность его использование наибольшим числом лиц, обладающих ограничениями. То есть речь о каких-то проблемах на стороне пользователя, например, физических (нарушения зрения, слуха и пр.) или технических (невозможность обработать контент, передаваемый не универсальной технологией, типа Flash и пр.).
                                        • Availability — это свойство некой системы, характеризующее степень невыполненного обслуживания пользователя. То есть речь о ликвидации сбоев и минимизации простоев.


                                        Ваш пост про availability, и как уж обеспечение accessibility может помешать и перехватить приоритеты у availability совсем не понятно. Разве что на уровне общего бюджета проекта, но тогда противопоставлять можно всё, что угодно. Да и, откровенно говоря, если разработчик не научился писать alt, которые декларируются спецификацией, то о какой проверке доступности CDN вообще можно говорить, ему мат. часть надо идти учить.
                                          0
                                          Accessibility refers to the design of products, devices, services, or environments for people with disabilities

                                          Да, с хабом погорячился.
                                          На счет помешать и перехватить приоритеты, ресурсы всегда ограничены, будь то время или деньги, и в первую очередь стоит уделить время на проработку наиболее узких мест в проекте, одним из которых может стать внешний cdn или, как пример из коментариев, метрика.
                                          +1
                                          Забыли дописать в плюсы хранения у себя то, что при атаке на сайт популярной JS библиотеки недавно очень много сайтов оказались под угрозой, используя копию библиотеки от поставщика
                                            0
                                            В том же самом boilerplate есть решение короче:
                                            <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
                                            <script>window.jQuery || document.write('<script src="js/vendor/jquery-1.11.2.min.js"><\/script>')</script>
                                            
                                              0
                                              Да, мы ужасно долбались с этим аспектом. Сначала в России прибили часть адресов CloudFlare, потом в Китае грохнули нашу собственную CDN, в результате код для загрузки скриптов выглядит как атомная война — эвристики, запасные варианты всякие.

                                              Проблема усложняется, когда на сайте много пользователей и «локальная» jquery.min.js, отданная с мастер-сервера без CDN, за сутки сжирает терабайт трафика.
                                                0
                                                за сутки терабайт? Это 100 млн уникальных посетителей в сутки?
                                                  0
                                                  Ну там не только jquery, еще несколько толстеньких жс-файлов.

                                                  Не сто, но сколько-то миллионов пользователей в сутки, да.
                                                    0
                                                    именно разных посетителей, а не хитов. Ведь у вас же кешируется посетителю жс, верно?
                                                +1
                                                Как-то не круто говорить, что люди делают херово и приводить в пример тоже херовый вариант — unescape является deprecated методом.
                                                  0
                                                  Оставил вариант из boilerplate'а.

                                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                Самое читаемое