Кэширование и оптимизация статических веб-ресурсов

внешний интерфейс PWA

предисловие

Для статических ресурсов (html/js/css/img/webfont) на странице идеальный эффект:
  1. Страница получает все необходимые статические ресурсы с максимальной скоростью, а рендеринг быстрый;
  2. Когда статические ресурсы на сервере не обновляются, снова получить доступ к серверу, не запрашивая сервер;
  3. Когда статические ресурсы на сервере обновляются, запрашиваются последние ресурсы сервера, и загрузка происходит быстро.
Подводя итог, можно выделить 2 показателя:
  • Статическая скорость загрузки ресурсов
  • скорость рендеринга страницы
Скорость загрузки статических ресурсов приводит к нашей сегодняшней теме, потому что самый прямой путь — кэширование статических ресурсов. Скорость рендеринга страницы зависит от скорости загрузки ресурсов, но на нее также влияют порядок и время загрузки различных типов ресурсов, поэтому это также оставляет нам больше возможностей для оптимизации.
Конечно, помимо скорости кэширование имеет еще две важные функции: уменьшение пропускной способности, запрашиваемой пользователями, и снижение нагрузки на сервер.

Во-первых, используйте картинку, чтобы обобщить то, что будет рассмотрено в этой статье.


Общие типы кеша

1. Кэш браузера

Для внешнего интерфейса это может быть тип кеша, который мы, скорее всего, проигнорируем, потому что большинство настроек выполняются на уровне работы и обслуживания сервера, который не относится к области обслуживания фронтальной разработки. Тем не менее, время обновления контента статических ресурсов на самом деле является самым четким на фронтенде, и если вы сможете разумно настроить его на основе понимания стратегии кэширования браузера, эффект будет лучшим.
Стратегия кэширования браузера обычно определяется заголовком ответа ресурса, а html-файл также может быть определен http-equiv метатега в предыдущей спецификации.

Пример заголовка ответа:

Доступно на w3cофициальная документацияСм. определения всех полей заголовка HTTP-ответа в , а поля, связанные с кешем, в основном обведены кружком на рисунке выше:

    • общедоступный: ответы кэшируются и распределяются между несколькими пользователями.
    • private: значение по умолчанию, ответ может использоваться только как частный кеш (например, в браузере) и не может быть разделен между пользователями;
    • no-cache: ответ не будет кэшироваться, а будет запрашивать ресурсы с сервера в режиме реального времени.
    • max-age: значение в секундах, количество секунд между временем запроса и временем истечения срока действия. Относительный временной интервал на основе времени запроса (поле Дата), а не абсолютное время истечения срока действия;
Примечание. HTTP/1.0 не реализует Cache-Control, поэтому поле Pragma отображается для совместимости с HTTP/1.0.
  • Прагма: Существует только одна обычая прагма: NO-кэш, который точно такой же, как Cache-Control: NO-кэш. (Cache-Control: No-Cache предоставляется HTTP 1.1, поэтому Pragma: No-Cache может применить NO-CACE на http 1.0 и http 1.1.)
  • Истекает: указывает, сколько времени осталось до истечения срока действия страницы, кэшированной и сохраненной в браузере, что эквивалентно эффекту max-age в Cache-control.Если он существует в то же время, он будет перезаписан max-age Кэш-Контроля. Если его значение равно 0, это означает, что срок действия страницы истекает немедленно. И если это свойство установлено несколько раз на странице, берите минимальное значение.
Примечание. Это правило позволяет исходным серверам для данного ответа предоставлять кэши HTTP/1.1 (или более поздней версии) с более длительным сроком действия, чем HTTP/1.0.
  • Дата: конкретное время и дата создания сообщения;
  • Last-Modified/If-Modified-Since: время последней модификации локального файла на сервере. По истечении срока действия кеша на сервер отправляется время последней модификации кэшированной страницы на стороне браузера. Сервер сравнивает это время со временем последней модификации фактического файла на сервере. Если время совпадает, то вернуть 304, и клиент будет напрямую использовать локальный кеш.
  • Etag/If-None-Match: (EntityTags) — это тег URL-адреса, который используется для указания того, изменился ли объект URL-адреса, как правило, хеш-значение сущности ресурса. Подобно Last-Modified, если сервер проверяет, что ETag ресурса не изменился (ресурс не был обновлен), он вернет статус 304, указывающий клиенту использовать локально кэшированный файл. Etag имеет более высокий приоритет, чем Last-Modified, и Etag в основном предназначен для решения некоторых проблем, которые не может решить Last-Modified.
    • Файл может периодически меняться, но его содержимое не меняется, и клиент не хочет получать его снова;
    • If-Modified-Since размер частиц, чтобы иметь возможность проверить уровень s;
    • Некоторые серверы не могут получить точное время последней модификации файла.

Процесс выполнения политики кэширования
По истечении срока действия локального кеша браузер отправит запрос на сервер, и запрос будет содержать следующие два поля:
  • If-Modified-Since: значение Last-Modified в предыдущем ответе;
  • If-None-Match: значением является Etag в предыдущем ответе (если он существует);
В оценке «файл изменен?» в правой части рисунка сервер прочитает два значения заголовка запроса, чтобы определить, являются ли ресурсы, кэшированные клиентом, актуальными. вернет заголовок ответа HTTP/304 Not Modified, но не тело ответа. После того, как клиент получит ответ 304, он прочитает соответствующий ресурс из кеша, в противном случае он вернет HTTP/200 и тело ответа.

meta — это вспомогательный тег в области заголовка языка html, а поле http-equiv в нем определяет некоторые поведения сервера и пользовательского агента. В предыдущей спецификации следующие значения в поле http-equiv мета функционируют аналогично полям, связанным с кэшированием заголовков http.
  • Cache-Control
  • Pragma
  • Expires
Инструкции:
<meta http-equiv="Cache-Control" content="no-cache" /> <!-- HTTP 1.1 -->
<meta http-equiv="Pragma" content="no-cache" /> <!-- 兼容HTTP1.0 -->
<meta http-equiv="Expires" content="0" /> <!-- 资源到期时间设为0 -->
но сейчасw3Эти значения были удалены из канонического поля c по уважительной причине:
Putting caching instructions into meta tags is not a good idea, because although browsers may read them, proxies won't. For that reason, they are invalid and you should send caching instructions as real HTTP headers.
На самом деле это тоже легко понять.Написанное в метатеге означает, что содержимое html должно быть проанализировано и прочитано, но прокси-сервер его не прочитает. Большинство браузеров больше не поддерживают его и игнорируют такой способ записи, поэтому кэш по-прежнему устанавливается через заголовки HTTP.
Примечание. Приоритет настройки кеша в заголовках HTTP выше, чем у http-equiv в мета.


2. Кэш приложения HTML5

Кэш приложения — это одно из решений для локального хранения, представленных html5, которое может создавать автономный кеш. В настоящее время его поддерживают все браузеры, кроме IE10.
инструкции

а. Добавить файл манифеста

Кэш приложения управляется через файл манифеста, который представляет собой простой текстовый файл, содержащий список файлов, которые необходимо кэшировать для автономного использования, и элементы управления файлами, которые не нужно кэшировать или которые не могут прочитать кэш.
  • Первая строка файла должна быть CACHE MANIFEST
  • Строки, начинающиеся с #, используются в качестве комментариев.
  • Кэш сайта не может превышать 5M
  • Путь к файловому ресурсу может использовать абсолютный или относительный путь.
  • Любой сбой кеша в списке файлов сделает недействительным весь кеш.
  • Вы можете использовать один и тот же файл minifest для своего сайта или по одному на страницу.
Файл содержит 3 директивы
  • КЭШ: файл ресурсов, который необходимо кэшировать, браузер автоматически кэширует html-страницу с атрибутом манифеста;
  • СЕТЬ: для файлов, которые не нужно кэшировать, можно использовать подстановочные знаки;
  • FALLBACK: невозможно получить доступ к альтернативному файлу для кэшированного файла, можно использовать подстановочные знаки.

б. Конфигурация сервера

Файл манифеста может использовать любое расширение, но для него необходимо добавить сопоставление типов MIME на сервере.Использовать apache относительно просто.Если вы используете .manifest в качестве расширения, добавьте его в файл конфигурации apache.
AddType text/cache-manifest .appcache

в. Ссылки в html

<html lang="zh" manifest="main.manifest">
Примечание. Не помещайте сам файл манифеста в список файлов кеша, иначе браузер не сможет обновить файл файла манифеста, лучше всего установить его срок действия немедленно в заголовках http файла манифеста.

Процесс загрузки и обновления кеша


1. События

  • cached/checking/downloading/error/noupdate/obsolete/progress/updateready

2. Процесс исполнения

Первая нагрузка:
  • Создание кэша приложений с манифестом (доступ к html-файлам с атрибутами манифеста, хранение файлов манифеста, загрузка html-файлов и других файлов ресурсов);
  • Событие Application Cache Checking (проверка списка файлов, подлежащих кэшированию)
  • Событие загрузки кеша приложения (начало загрузки файлов кеша)
  • Событие Application Cache Progress (0 из 4) (загрузка файлов кеша последовательно)
  • ...
  • Application Cache Progress event (4 of 4)
  • Событие Application Cache Cached (файл кэшируется)
Вторая загрузка:
  • Документ был загружен из кэша приложения с манифестом (файлы html и другие файлы статических ресурсов были прочитаны из кэша для отображения страницы)
  • Событие проверки кэша приложений (получение нового файла манифеста, проверка обновлений)
    • Да: повторно загрузить кешированный файл для следующего посещения (это не повлияет на содержимое, отображаемое текущим браузером).
      • Событие загрузки кеша приложения (начало загрузки файлов кеша)
      • Событие Application Cache Progress (0 из 4) (загрузка файлов кеша последовательно)
      • ...
      • Application Cache Progress event (4 of 4)
      • Cache Cheche UpdateAbready Event (обновление файла кэша завершено)
    • нет
      • Событие NoUpdate кэша приложений (ничего не делать)
Удалить ссылки на файлы манифеста в html
  • Документ был загружен из кэша приложения с манифестом (файлы html и другие файлы статических ресурсов были прочитаны из кэша для отображения страницы)
  • Событие проверки кэша приложений (получение нового файла манифеста, проверка обновлений)
  • Событие Application Cache Obsolete (удалить все файлы в локальном кеше, больше не использовать кеш)

некоторые проблемы
  1. Кэш приложения будет кэшировать HTML-документы, ссылающиеся на файлы манифеста по умолчанию, что является ямой для динамически обновляемых HTML-страниц (вы можете использовать хитрый метод встраивания iframe, чтобы избежать этого);
  2. Пока один ресурс в списке кеша не загружается, все файлы не будут кэшироваться;
  3. Если ресурс не кэширован и не задана NETWORK, он не будет загружен, поэтому в сети необходимо использовать подстановочные знаки;
  4. После обновления кеша в первый раз можно загрузить только файл манифеста, а другие статические ресурсы необходимо загрузить во второй раз, чтобы увидеть последний эффект;
  5. Файлы в списке кэшированных файлов сами по себе не будут повторно кэшироваться при обновлении браузера, так как же сообщить браузеру, что кэш необходимо обновить?
    • Обновите файл манифеста: измените номер версии или дату комментария.
    • Проверяйте наличие обновлений через интерфейс, предоставляемый кэшем приложений (window.applicationCache.swapCache).
И последний вопрос, стандарт был удален из веб-стандартов...
Эта функция была удалена из веб-стандартов, хотя некоторые браузеры все еще поддерживают ее в настоящее время, но могут перестать поддерживать ее в будущем, пожалуйста, постарайтесь не использовать эту функцию. В настоящее время крайне не рекомендуется использовать описанную здесь функцию кэширования приложений, поскольку она находится в процессе удаления с веб-платформы. Пожалуйста, используйте вместо этогоService Workersзаменять.

3. PWA (сервисный работник)

Полное название PWA — «Progressive Web Apps», прогрессивное веб-приложение, а Service Worker — одна из его основных технологий.
Service worker is a programmable network proxy, allowing you to control how network requests from your page are handled.
Правильно, это официально рекомендуемая альтернатива Application Cache. Еще в 2014 году W3C опубликовал черновик Service Worker. Он действует как отдельный поток, скрипт, работающий в фоновом режиме. Его внешний вид позволяет веб-приложениям иметь возможности автономного использования, отправки сообщений и автоматического фонового обновления, аналогичные собственным приложениям.
Однако он имеет следующие ограничения:
  • Не могу получить доступ к доме
  • Невозможно использовать синхронный API
  • Требуется протокол HTTPS (также доступен http://localhost или http://127.0.0.1)
Хотя сейчас егоПоддержка браузераОн не очень обширен, но в будущем его следует поддерживать на большой территории. Эта статья дает краткое введение. Для конкретного использования, пожалуйста, обратитесь к официальному документу "The Offline Cookbook".

Простой в использовании

1. Во-первых, чтобы использовать Service Worker, вам нужно добавить js-файл Service Worker, а затем прописать ссылку на этот файл на нашей html-странице.
index.html
<script>
navigator.serviceWorker
    .register('./sw.js')
   .then(function (registration) {
       // 注册成功
   });
</script>

2. Во-вторых, дополняем события жизненного цикла Service Worker в js файле. В жизненном цикле сервис-воркера есть три этапа: регистрация, установка и активация.
Вообще говоря, нам нужно зарегистрировать 3 события:
self.addEventListener('install', function(event) { 
  /* 安装后... */
  // cache.addAll:把缓存文件加进来,如a.css,b.js
});

self.addEventListener('activate', function(event) {
 /* 激活后... */
 // caches.delete :更新缓存文件
});

self.addEventListener('fetch', function(event) {
  /* 请求资源后... */ 
  // cache.put 拦截请求直接返回缓存数据
});
Для извлечения и кэширования файлов сервис-воркеры полагаются на два API:Fetch(стандартный способ получения контента через Интернет) иCache(Хранилище контента для данных приложения, этот кеш не зависит от кеша браузера и состояния сети).
Реагировать на строительные лесаcreate-react-appФункция PWA встроена, давайте взглянем на файловую структуру в папке упакованной сборки:

Файл index.html ссылается на static/js/main.js, а service-worker.js зарегистрирован в main.js. В service-worker.js мы видим две переменные: precacheConfig (список кеша) и cacheName (номер версии). Отключив сеть, мы видим, что файлы в списке precacheConfig все еще могут загружаться локально.


механизм обновления

Взяв в качестве примера регистрационный файл service-worker.js, каждый раз, когда вы посещаете страницу, контролируемую ServiceWorker, браузер будет загружать последний файл service-worker.js.По сравнению с текущим файлом service-worker.js, если так как содержимое отличается, просмотр извлечет и установит новый файл. Однако это не вступит в силу немедленно, исходный ServiceWorker по-прежнему будет работать, а новый ServiceWorker будет активирован только тогда, когда все страницы, контролируемые ServiceWorker, будут закрыты.


4. Локальное хранилище

Хотя LocalStorage — это кэш на стороне браузера, сколько людей используют его для кэширования файлов? Во-первых, чтение кеша должно опираться на выполнение js, поэтому обязательным условием является возможность чтения сегментов кода html и js; во-вторых, контроль версий файлов приведет к увеличению затрат на обслуживание на уровне кода, поэтому LocalStorage больше подходит для ключевых бизнес-данных, а не для статических ресурсов.


5. Кэш CDN

Это пространственно-временное решение, которое уменьшает задержку доступа пользователя и снижает нагрузку на исходный сайт.
Браузер клиента сначала проверяет, истек ли срок действия локального кеша. Если срок его действия истек, он инициирует запрос к пограничному узлу CDN. Пограничный узел CDN определяет, истек ли срок действия кеша данных запроса пользователя. будет напрямую отвечать на запрос пользователя. Завершение HTTP-запроса завершено; если срок действия данных истек, CDN также необходимо отправить запрос обратно к источнику на исходный сайт.


механизм обновления

Стратегия кэширования пограничного узла CDN различается у разных поставщиков услуг, но обычно следует стандартному протоколу http.Время кэширования данных пограничного узла CDN задается в поле Cache-control: max-age в заголовке ответа http. Кроме того, кеш можно обновить через интерфейс «обновления кеша», предоставляемый поставщиком услуг CDN.

prebrowsing

Предварительная загрузка — это подсказка браузера к ресурсам, которые могут быть использованы в будущем, некоторые ресурсы могут использоваться на текущей странице, а некоторые — на некоторых будущих страницах. Как разработчики, мы знаем наше приложение лучше, чем браузер, поэтому мы можем использовать эту технологию для наших основных ресурсов.
Некоторые файлы можно кэшировать заранее с помощью предварительного просмотра, что можно использовать как средство оптимизации загрузки статических ресурсов. Существуют следующие виды предварительного просмотра:
  • dns-prefetch: предварительное разрешение DNS, которое сообщает браузеру, что мы можем получить ресурсы с определенного URL-адреса в будущем, и когда браузер фактически использует ресурс в домене, разрешение DNS может быть завершено как можно скорее. В основном используется при использовании сторонних ресурсов.
  • предварительное подключение: предварительное подключение, завершение предварительного разрешения DNS, а также выполнение установления связи TCP и установка протокола транспортного уровня.
  • prerender: предварительная визуализация, предварительная загрузка всех ресурсов документа, аналогичная открытию ссылки в скрытой вкладке — загрузит все ресурсы, создаст структуру DOM, завершит макет страницы, применит стили CSS, выполнит скрипты JavaScript, и т.п.
  • prefetch: Prefetch, ресурс, объявленный с помощью prefetch, является подсказкой для браузера, предполагающей, что ресурс может использоваться в «будущем», и подходит для кэширования ресурсов для других страниц маршрутизации, на которые можно перейти. Время загрузки предварительно выбранных ресурсов определяется браузером, обычно приоритет низкий, и загрузка будет выполняться, когда браузер «простаивает».
  • preload: Предварительная загрузка, активное уведомление браузера о получении ключевых ресурсов этой страницы, просто предварительная загрузка и не будет выполняться после загрузки ресурсов;

prefetch & preload

Для первых трех браузеров многие браузеры были оптимизированы внутри по умолчанию, а предварительная выборка и предварительная загрузка требуют, чтобы разработчики вручную устанавливали код в соответствии с ситуацией.

совместимость

отprefetchа такжеpreloadС точки зрения поддержки браузеров предварительная выборка поддерживается всеми основными браузерами, кроме Safari, но предварительная загрузка, как новая спецификация, имеет плохую совместимость, но Safari постепенно поддерживает этот стандарт, например расширенный вариант Safari в iOS.Экспериментальные функции WebkitУже есть опция для предварительной загрузки ссылок в .

приоритет

Предварительная загрузка — это декларативный FETCH, который может заставить браузер запрашивать ресурсы, не блокируя документы.onloadСобытие указывает браузеру предварительно запросить ресурсы (ключевые скрипты, шрифты, основные изображения), необходимые для текущей страницы.
prefetch информирует браузер о том, что ресурс может понадобиться в будущем, но оставляет решение о том, следует ли и когда загружать ресурс браузеру. Вариант использования для предварительной выборки немного отличается — ресурсы, которые пользователь может использовать в других частях (например, представлениях или страницах) в будущем.
Как видно из приведенного выше описания, для объявлений preload и prefetch preload значительно выше, чем prefetch.


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


заявление

был тронутNext.jsВсе студенты знают, что next.js предоставляет модуль с функцией предварительной выборки: next/prefetch, которая выглядит аналогично предварительной выборке, но ее приоритет аналогичен предварительной загрузке.
<Link prefetch href='/'><a>Home</a></Link>

<Link prefetch href='/features'> <a>Features</a></Link>

{ /* we imperatively prefetch on hover */ }
<Link href='/about'>
  <a onMouseEnter={() => { Router.prefetch('/about'); console.log('prefetching /about!') }}>About</a>
</Link>

<Link href='/contact'><a>Contact (<small>NO-PREFETCHING</small>)</a> </Link>
Поскольку ссылка функций настроена на предварительную выборку, при доступе к странице индекса браузер будет получать файл feature.js с сервера после загрузки страницы. не запрашиваться с сервера, а будет кэшироваться непосредственно из локального кеша.Чтение; контакт не обрабатывается, а файл concact.js запрашивается с сервера при доступе к контакту из index.
Мы также можем обнаружить, что в заголовке html-файла, упакованного next.js, три файла index.js/error.js/app.js будут загружены в качестве предварительной загрузки, потому что эти три файла должны использоваться на этой странице ресурса. .

попытка оптимизации

разные типы файлов

1. HTML-файл

Хотя большая часть html будет меняться только каждый раз, когда она публикуется в сети, например, при обновлении ссылочного адреса ресурсов js/css, обычно устанавливается короткое значение max-age в заголовках HTTP, например cache-control: max-age =300, в противном случае рекомендуется, чтобы сервер включил Etag.
Однако для веб-сайтов с контентом в реальном времени (например, финансовые услуги), чтобы ускорить открытие страницы, все данные домашней страницы будут сгенерированы в html путем создания фоновой службы, что экономит время ожидания пользователя для фона. запрос интерфейса при загрузке в первый раз. Обычно устанавливается контроль кеша: no-cache.

2. файлы js/css/img

Управление версиями теперь обычно выполняется по имени файла. Именование упаковки Webpack может генерировать хеш-значение имени файла в соответствии с содержимым файла, и хэш-значение повторно создается только при изменении содержимого для каждой упаковки. В этом случае вы можете установить большее время кеша в HTTP-заголовках, например, max-age=2592000, чтобы избежать 304 запросов и как можно больше запрашивать подключения к серверу.

// js
output: {
    path: config.build.assetsRoot,
    filename: utils.assetsPath('js/[name].[chunkhash].js'),
    chunkFilename: utils.assetsPath('js/[id].[chunkhash].js'),
}
// css
new ExtractTextPlugin({
    filename: utils.assetsPath('css/[name].[contenthash].css'),
}),

3. веб-шрифт

файлы веб-шрифтов особенные, т.к.эта статьясказал в:
  • Браузер загрузит файл веб-шрифтов только тогда, когда найдет @font-face в селекторе CSS DOMNode.В это время браузер загрузил файл html/css/js;
  • Если вы скажете браузеру загрузить файл шрифта до того, как браузер обнаружит, что ему нужно загрузить файл шрифта, это ускорит загрузку файла и скорость загрузки страницы.
На самом деле время загрузки файлов шрифтов в разных браузерах разное: некоторые будут загружаться при встрече с объявлением CSS, а некоторые будут ждать, пока DOM-узел совпадет с объявлением CSS.

Практика оптимизации
Основываясь на перечисленных выше предложениях по кэшированию, оптимизируйте текущий мобильный проект. Предыстория проекта такова:
  • React + + Mobx + Webpack
  • Одностраничный React-Router/динамическая загрузка пакета-загрузчика/использование больших файлов веб-шрифтов
1. Конфигурация кэша
  • Выполните описанную выше настройку кэша заголовков HTTP для файлов статических ресурсов;
  • Все статические файлы ресурсов кэшируются и загружаются в автономном режиме через Service Worker, и демонстрация не будет повторяться, как указано выше;
2. Другие оптимизации
Возьмите одну из отдельных страниц в качестве примера, эффект страницы выглядит следующим образом:

динамически загружаемый js

Эта одностраничная страница откроет несколько небольших страниц (часть красного круга), которые будут выглядеть так после упаковки с помощью веб-пакета:
  • index.ef15ea073fbcadd2d690.js
  • static/js/0.1280b2229fe8e5582ec5.js
  • static/js/1.f3077ec7560cd38684db.js
  • static/js/2.39ecea8ad91ddda09dd0.js
  • static/js/3.d7ecc3abc72a136e8dc1.js
Среди них первый index.js будет загружаться впервые на странице, а остальные четыре js будут загружаться динамически при переключении маршрута. Рассмотрим бизнес-сценарий этой страницы, пока вы входите на эту страницу, обязательно будут доступны несколько других маршрутов. Так что, если после загрузки страницы, пока пользователь думает, он проявит инициативу для загрузки оставшихся нескольких js, разве это не идеально.
выбрано здесьpreload-webpack-pluginЭтот плагин, который может быть упакован для предварительной загрузки динамических маршрутов.
webpackConfig.plugins.push(new PreloadWebpackPlugin({
    rel: 'prefetch',
}));

Атрибут rel также может выбирать режим предварительной загрузки/предварительной выборки. Он упакован так:

При посещении страницы видно, что, не влияя на загрузку dom, браузер предварительно загружает несколько других js, которые будут использоваться позже, а при переходе на соответствующий маршрут он также будет напрямую загружаться из кеша, а не запрашивать ресурсы из кеша. сервер. .


css-файл

CSS нединамически загружаемых (маршрутизируемых) страниц будет упакован отдельно и указан в html-файле. В дополнение к использованию некоторых подключаемых модулей упаковки для оптимизации размера кода, CSS можно разделить на более мелкие фрагменты, такие как CSS домашней страницы + CSS всплывающего окна + CSS переключения меток страницы и т. д. . За исключением css главной страницы, он сначала предварительно загружается, а затем получается динамически. Но вообще говоря, размер CSS страницы не будет слишком большим после сжатия gzip при разумных условиях кода, поэтому эффект от оптимизации не будет слишком очевидным.

CSS в маршруте динамической загрузки разделен не отдельно, а в js маршрута, поэтому его можно оптимизировать только с помощью js.


файл веб-шрифта

Для файлов шрифтов, помимо уменьшения размера файла и установки времени кеша, вы также можете предварительно загрузить браузер, чтобы загрузить его заранее, чтобы улучшить скорость рендеринга первого экрана. Предварительная загрузка веб-шрифтов должна выполняться с помощью веб-пакета.html-webpack-pluginВ сочетании указанный шрифт вставляется в html при упаковке. Я поискал в Интернете и не смог найти готовый плагин, поэтому написал его сам.

1. Напишите плагин

fontpreload-webpack-plugin

2. Используйте плагины

  • Установить плагин
npm install fontpreload-webpack-plugin --save-dev
  • Добавьте после плагина HtmlWebpackPlugin в конфигурационный файл webpack:
const FontPreloadWebpackPlugin = require('fontpreload-webpack-plugin');
webpackConfig.plugins.push(new FontPreloadWebpackPlugin({
    rel: 'prefetch',
    fontNameList: ['fontawesome-webfont'],
    crossorigin: true,
}));

3, упакованный эффект



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