Мы объединяем файлы CSS и JavaScript, чтобы уменьшить количество HTTP-запросов, что повышает производительность. В результате HTML выглядит так:
<link rel="stylesheet" href="all-my-css-0fn392nf.min.css">
<!-- later... -->
<script src="all-my-js-0fn392nf.min.js"></script>
Если у нас есть логика на стороне сервера / сборки, чтобы сделать все это для нас, почему бы не сделать еще один шаг вперед и не внедрить эти сцепленные стили и сценарии в HTML?
<style>.all{width:100%;}.my{display:none;}.css{color:white;}</style>
<!-- later... -->
<script>var all, my, js;</script>
Это на два меньше HTTP-запросов, но я не видел эту технику на практике. Почему бы нет?
javascript
html
css
front-end
GladstoneKeep
источник
источник
Ответы:
Потому что сохранение HTTP-запросов бесполезно, когда вы достигаете этого, нарушая кэширование. Если таблицы стилей и сценарии обслуживаются отдельно, они могут очень хорошо кэшироваться и амортизироваться по множеству запросов на совершенно разные страницы. Если они размещены на одной и той же HTML-странице, их необходимо повторно передавать с каждой. Не замужем. Запрос.
Например, HTML-код этой страницы сейчас составляет 13 КБ. 180 КБ CSS попали в кеш, как и 360 КБ JS. Оба попадания в кэш занимали незначительное количество времени и практически не потребляли пропускную способность. Извлеките сетевой профилировщик вашего браузера и попробуйте его на некоторых других сайтах.
источник
Просто потому, что веб-производительность действительно имеет значение! 99% раз это даст вам быстрое время отклика конечного пользователя.
Вот несколько примеров из Velocity Conf.
Стив Соудерс, пионер в области оптимизации веб-производительности,
Использование внешних файлов приводит к созданию более быстрых страниц, поскольку файлы JavaScript и CSS кэшируются браузером / network / proxies (как определено в протоколе HTTP с заголовками Cache). JavaScript и CSS, которые встроены в документы HTML, загружаются каждый раз, когда запрашивается документ HTML. Это уменьшает количество необходимых HTTP-запросов, но увеличивает размер HTML-документа. Если вы используете Jquery-подобные сценарии, легко сослаться на 300 КБ сценариев и не полагать, что у всех есть пропускная способность 100 Мбит / с с низкой задержкой, при этом на вашем веб-сайте запускается одно приложение - браузер. 99% раз это даст вам быстрое время отклика конечного пользователя.
Частота, с которой кэшируются внешние компоненты JavaScript и CSS относительно количества запрашиваемых документов HTML, также важна. Если у пользователей на вашем сайте есть несколько просмотров страниц за сеанс, и многие ваши страницы повторно используют одни и те же сценарии и таблицы стилей (связки), это дает большую потенциальную выгоду от кэшированных внешних файлов.
Но встраивание - иногда - предпочтительнее для одностраничных приложений или веб-сайтов с одним просмотром одной страницы за сеанс. Не существует золотого правила, и обычно его забывают, поскольку оно касается в основном очень специфических веб-сайтов, которые действительно влияют на производительность конечных пользователей.
Вы можете прочитать здесь, почему производительность имеет значение (Отказ от ответственности: я автор)
источник
Последняя версия HTTP была создана еще в 1999 году. В 1999 году все подключились к Интернету по телефонной линии. Интернет был очень медленным. 16 лет спустя многое изменилось, а протоколы, которые мы используем, - нет.
Ответы, которые мы не должны указывать «потому что это мешает кешированию», немного вводят в заблуждение, особенно в эпоху сверхбыстрого Интернета. Когда вы на самом деле делаете расчеты, часто существует незначительная разница между временем загрузки для пользователей с высокой и минимальной кэш-памятью, если вы указали. Тот факт , что это небольшая разница не по своей сути , потому что вы встраиваемыми, но из - за негибкой конструкции HTTP / 1.1.
Протокол SPDY реализует то, что называется push-сервером . Это, по сути, берет вставку из самого документа HTML и в протокол. Интеллектуальный сервер будет знать, какие ресурсы уже есть у клиента. Тупой сервер просто отправит все, что угодно - это все равно будет выигрыш в производительности, но может стоить с точки зрения пропускной способности. Если браузер имеет содержимое в своем кэше, он может просто отбросить входящие копии. Сервер ожидает загрузки HTML, прежде чем отправлять дополнительные ресурсы - теоретически браузер может отправить сигнал для отмены отправки сервера.
HTTP / 2.0 основан на SPDY и, скорее всего, будет реализовывать серверную загрузку, но теоретически вы можете начать использовать SPDY уже сегодня. Таким образом, настоящая причина, по которой мы не подключаемся, заключается в том, что унаследованные протоколы устарели и недостаточно гибки для достижения «встраивания на уровне протокола».
источник
В дополнение к проблемам с кэшированием и поиском, которые возникают в других ответах, я хотел бы выделить еще одну, более неясную проблему: анализ .
JavaScript, появляющийся в HTML, может столкнуться с проблемами разбора, как в этом примере:
... это означает, что вам придется трансформировать ваш скрипт, чтобы избежать некоторых символов, которые запускаются в HTML. Эта проблема исчезает, когда вы предоставляете CSS и JavaScript в качестве внешних ресурсов, поскольку им больше не нужно принимать во внимание «родительский» контекст синтаксического анализа.
Если вы используете свой контент как XML, у вас есть возможность обойти это, используя разделы CDATA. CDATA, однако, имеет аналогичную проблему:
Инлайнеры остерегаются.
источник
Отделение контента от стиля его представления обычно является большим преимуществом, чем меньшее количество http-запросов.
Разделение всех стилей позволяет и поощряет повторное использование и совместное использование файлов.
Содержимое файлов также будет более статичным и доступным для кэширования на серверах и клиентах как для этой страницы, так и для других посещаемых страниц.
Для вас конкретный вопрос, хотя ... Если сервер выполнен для минимизации, это усложняет обслуживание ресурсов и устраняет проблемы. Однако многие фреймворки теперь делают это на уровне файлов, например, все cs и все js. Например, структура ruby on rails теперь минимизирует свои активы для производства. 5-10 дополнительных http-запросов обычно не являются узким местом, их больше, если есть более 100 http-запросов (которые вы часто получаете с изображениями).
Дополнительным шагом фактического включения кода на самих страницах будет недостаток больших страниц, так как вам придется тщательно управлять последовательностью загрузки и не иметь возможности часто отображать контент без остальной части (теперь большой) страницы. загружается.
источник
источник
Встроенные стили / скрипты должны быть загружены с каждым запросом страницы:
Эти стили не могут быть кэшированы браузером и повторно использованы для другой страницы. Из-за этого рекомендуется встраивать как можно меньше CSS / JS.
Скорость сайта увеличивается для нескольких запросов страниц:
Когда человек впервые заходит на ваш сайт, его браузер загружает HTML-код текущей страницы, а также связанный файл CSS и JS. Когда они переходят на другую страницу, их браузеру требуется только загрузить HTML-код новой страницы, файл CSS / JS кэшируется, поэтому его не нужно загружать снова. Это может иметь большое значение, особенно если у вас большой файл стиля и сценария.
источник