В предыдущей разработке я часто сталкивался с проблемой оптимизации производительности фронтенда, за это время я просмотрел серию курсов и блогов больших парней Ниже приводится сводка производительности фронтенда оптимизация.
1. Справочник
- Базовая оптимизация
- Анализ принципа фронтальной оптимизации
- HTML-оптимизация
- css-оптимизация
- js-оптимизация
- Оптимизация изображения
- оптимизация слияния файлов
- Расширенная оптимизация
- Ленивая загрузка и предварительная загрузка файлов
- Перерисовка и перекомпоновка
- кеш браузера
- Политика кэширования браузера
2. Базовая оптимизация
1. Анализ принципа фронтальной оптимизации
Вопрос 1: Что происходит с запросом с момента его отправки до результата?
Ниже приводится конкретное описание приведенного выше рисунка:Сначала пользователь вводит URL-адрес в браузере, а основной код в браузере разделяет и анализирует URL-адрес. Браузер отправит домен на DNS-сервер, DNS-сервер запросит соответствующий IP-адрес в соответствии с доменом и вернет IP-адрес браузеру.Следуйте протоколу, введите IP-адрес в протокол и перенесите все соответствующие параметры запроса, отправить его в нашу сеть, пройти через локальную сеть, коммутатор, маршрутизатор и магистральную сеть, а затем запрос дойдет до нашего сервера, который представляет собой архитектуру MVC. , запрос сначала попадет в контроллер, распределяем соответствующую логику в контроллере, вызываем уровень модели, модель взаимодействует с данными, при взаимодействии с данными получают данные из базы данных и, наконец, передаем наши визуализированные данные через слой представления, распространяемый по сети, ответ HTTP-запроса возвращается с сервера в браузер, и браузер начинает рендеринг.
Возможные точки оптимизации производительности:
- 1. кеш днс
- 2. Уменьшите количество http-запросов
- 3. Уменьшите размер http-запроса
- 4. Перейти к ближайшему сетевому запросу при выполнении сетевого запроса
- 5. Кэш браузера
Вопрос 2: Как веб-сайт отображается в браузере?
Ниже приводится конкретное описание приведенного выше рисунка:
Запрос возвращает HTML-документ, который будет проанализирован синтаксическим анализатором HTML в браузере.Тег преобразуется в токен в процессе лексического анализа, а токен, в свою очередь, анализируется из HTML-документа сверху вниз, потому что он непрерывно анализируется сверху вниз по пути следующего токена.В процессе лексического анализа теги, такие как скрипт ссылки, могут быть соответственно проанализированы, и соответствующие веб-ресурсы в таких тегах будут далее отправлены браузером в Сеть инициирует запрос. Запрошенные веб-ресурсы JavaScript будут переданы механизму выполнения JavaScript v8 в браузере для выполнения. После того, как запрос ресурса, связанный с css, вернется, браузер сгенерирует соответствующее дерево CSSOM. Предпосылка рендеринга страницы заключается в том, что после того, как дерево DOM и дерево CSSOM становятся доступными, создается дерево рендеринга, а затем выполняется макет для рисования.
СуммироватьИз приведенных выше двух вопросов мы видим, что ядро базовой оптимизации оптимизации производительности внешнего интерфейса заключается в сокращении HTTP-запросов и уменьшении размера HTTP-запросов.
2. Оптимизация HTML
- принцип
- Метод реализации
принципСжатие включает в себя пробелы, символы табуляции, символы новой строки и т. д., а некоторые символы с другими значениями, например комментарии HTML, также могут быть сжаты.
Метод реализации1. Используйте плагин gulp-htmlmin для сжатия в gulp 2. Сжатие с помощью программного обеспечения для онлайн-сжатия (не применимо к большим проектам).
gulp.task('htmlmin', function() {
var options = {
removeComments: true, //清除HTML注释
collapseWhitespace: true, //压缩HTML
collapseBooleanAttributes: true, //省略布尔属性的值 <input checked="true"/> ==> <input />
removeEmptyAttributes: true, //删除所有空格作属性值 <input id="" /> ==> <input />
removeScriptTypeAttributes: true, //删除<script>的type="text/javascript"
removeStyleLinkTypeAttributes: true, //删除<style>和<link>的type="text/css"
minifyJS: true, //压缩页面JS
minifyCSS: true //压缩页面CSS
};
var htmlSrc = './src/*.html',
htmlDst = './dist';
gulp.src(htmlSrc)
.pipe(htmlmin(options))
.pipe(gulp.dest(htmlDst)); //同名的html,会直接替换
});
3. Оптимизация CSS
- принцип
- Метод реализации
принципУдаление неверного кода, удаление пробелов, удаление вкладок
Метод реализации1, Гульпу в Гульп-Minify-CSS Plug-in 2. Сжатие с помощью программного обеспечения для онлайн-сжатия (не применимо к большим проектам).
4. JS-оптимизация
- принцип
- Метод реализации
принципУдаление недопустимых символов, удаление комментариев, сокращение и оптимизация семантики кода, защита кода (изменение некоторых семантических имен на a/b/c и т. д.)
Метод реализации1. Используйте плагин gulp-uglify для сжатия в gulp 2. Сжатие с помощью программного обеспечения для онлайн-сжатия (не применимо к большим проектам).
5. Оптимизация изображения
Тип изображения
- jpg сжатие с потерями высокая степень сжатия не поддерживает прозрачность
- png поддерживает прозрачность и хорошую совместимость с браузерами
- webp имеет лучшее сжатие и имеет проблемы совместимости с iOS webview
- Стиль изображения векторного изображения SVG относительно простая сцена
Решение
- Image Inline (уменьшает количество http-запросов)
- Карта спрайтов (уменьшить количество http-запросов)
Реализация
- онлайн-программа для сжатия изображений
- Плагин сжатия изображений gulp-imagemin для gulp
6. Объединение файлов и оптимизация
существующие проблемы
- Проблема рендеринга первого экрана (объединение нескольких файлов приводит к тому, что HTTP-запрос становится слишком большим, а время запроса слишком долгим)
- Проблема инвалидации кеша (изменение любого файла после слияния приведет к аннулированию кеша)
Решение
- Слияние общей библиотеки
- Объединение разных страниц
Реализация
Используйте плагин gulp-concat для слияния файлов.
3. Расширенная оптимизация
1. Ленивая загрузка и предварительная загрузка файлов
ленивая загрузка
- Запрашивать ресурсы изображения после того, как изображение попадает в видимую область
- Для электронной коммерции и других бизнес-сценариев с большим количеством изображений и длинных страниц
- Уменьшить загрузку недопустимых ресурсов
- Слишком много ресурсов, загруженных одновременно, заблокируют загрузку js и повлияют на нормальное использование веб-сайта.
Предварительная загрузка
- Предварительные запросы на статические ресурсы, такие как изображения, до их использования.
- Ресурсы могут быть загружены из кеша, когда они используются для улучшения взаимодействия с пользователем.
- Обслуживание зависимостей для отображения страницы
Метод реализации ленивой загрузкиHTML-код
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>lazyload</title>
<link rel="stylesheet" href="main.css" />
</head>
<body>
<div class="image-list">
<img src="" class="image-item" lazyload="true" data-original="https://gma.alicdn.com/i3/3851834739/TB2KAmyBHGYBuNjy0FoXXciBFXa_!!3851834739.jpg_100x100xzq75.jpg" />
<img src="" class="image-item" lazyload="true" data-original="https://gma.alicdn.com/i3/3851834739/TB2RYRxqeGSBuNjSspbXXciipXa_!!3851834739-0-item_pic.jpg_100x100xzq75.jpg" />
<img src="" class="image-item" lazyload="true" data-original="https://gma.alicdn.com/bao/uploaded/i3/1210506068553231586/TB2ZL6qt3RkpuFjy1zeXXc.6FXa_!!0-saturn_solar.jpg_240x240xzq75.jpg" />
<img src="" class="image-item" lazyload="true" data-original="https://gma.alicdn.com/i2/511076404/TB2J7wUApmWBuNjSspdXXbugXXa_!!511076404.jpg_100x100xzq75.jpg" />
<img src="" class="image-item" lazyload="true" data-original="https://gma.alicdn.com/bao/uploaded/i3/23745640/TB2zBv9D1uSBuNjy1XcXXcYjFXa_!!0-saturn_solar.jpg_240x240xzq75.jpg" />
<img src="" class="image-item" lazyload="true" data-original="https://gma.alicdn.com/i3/587488716/TB2OyN5wrSYBuNjSspiXXXNzpXa_!!587488716.jpg_100x100xzq75.jpg" />
<img src="" class="image-item" lazyload="true" data-original="https://gma.alicdn.com/bao/uploaded/i1/114335006/TB2IewMr41YBuNjy1zcXXbNcXXa_!!0-saturn_solar.jpg_240x240xzq75.jpg" />
<img src="" class="image-item" lazyload="true" data-original="https://gma.alicdn.com/i4/2782657655/TB2VvzUfYorBKNjSZFjXXc_SpXa_!!2782657655.jpg_100x100xzq75.jpg" />
<img src="" class="image-item" lazyload="true" data-original="https://gma.alicdn.com/bao/uploaded/i3/13016599/TB2TuxpuGSWBuNjSsrbXXa0mVXa_!!0-saturn_solar.jpg_240x240xzq75.jpg" />
<img src="" class="image-item" lazyload="true" data-original="https://gma.alicdn.com/i2/90919986/TB2KqfVxv9TBuNjy1zbXXXpepXa_!!90919986.jpg_100x100xzq75.jpg" />
<img src="" class="image-item" lazyload="true" data-original="https://gma.alicdn.com/bao/uploaded/i4/52863407/TB2mKqZDkKWBuNjy1zjXXcOypXa_!!0-saturn_solar.jpg_240x240xzq75.jpg" />
<img src="" class="image-item" lazyload="true" data-original="https://gma.alicdn.com/i3/1969607927/TB25oQdaIuYBuNkSmRyXXcA3pXa_!!1969607927.jpg_100x100xzq75.jpg" />
<img src="" class="image-item" lazyload="true" data-original="https://gma.alicdn.com/bao/uploaded/i2/31490775/TB26MyDb8smBKNjSZFsXXaXSVXa_!!0-saturn_solar.jpg_240x240xzq75.jpg" />
<img src="" class="image-item" lazyload="true" data-original="https://gma.alicdn.com/i1/886644258/TB29ufKvrxmpuFjSZJiXXXauVXa_!!886644258.jpg_100x100xzq75.jpg" />
<img src="" class="image-item" lazyload="true" data-original="https://gma.alicdn.com/i2/886644258/TB2D9pNwSxjpuFjSszeXXaeMVXa_!!886644258.jpg_100x100xzq75.jpg" />
<img src="" class="image-item" lazyload="true" data-original="https://gma.alicdn.com/bao/uploaded/i2/121453312/TB2iATKD29TBuNjy0FcXXbeiFXa_!!0-saturn_solar.jpg_240x240xzq75.jpg" />
<img src="" class="image-item" lazyload="true" data-original="https://gma.alicdn.com/i4/3083173120/TB2CCLWDr5YBuNjSspoXXbeNFXa_!!3083173120.jpg_100x100xzq75.jpg" />
<img src="" class="image-item" lazyload="true" data-original="https://gma.alicdn.com/bao/uploaded/i4/15303864/TB2eVxzhYsrBKNjSZFpXXcXhFXa_!!0-saturn_solar.jpg_240x240xzq75.jpg" />
<img src="" class="image-item" lazyload="true" data-original="https://gma.alicdn.com/i2/694223667/TB2N4cXy1ySBuNjy1zdXXXPxFXa_!!694223667.jpg_100x100xzq75.jpg" />
<img src="" class="image-item" lazyload="true" data-original="https://gma.alicdn.com/i4/73861778/TB2r8vgl4uTBuNkHFNRXXc9qpXa_!!73861778.jpg_100x100xzq75.jpg" />
<img src="" class="image-item" lazyload="true" data-original="https://gma.alicdn.com/bao/uploaded/i2/26868233/TB2j2jQAhSYBuNjSsphXXbGvVXa_!!0-saturn_solar.jpg_240x240xzq75.jpg" />
<img src="" class="image-item" lazyload="true" data-original="https://gma.alicdn.com/i3/694223667/TB21ohCqOCYBuNkHFCcXXcHtVXa_!!694223667.jpg_100x100xzq75.jpg" />
</div>
<script type="text/javascript" src="lazyload.js"></script>
</body>
</html>
CSS
.image-item{
width: 40%;
margin-right: 5%;
display: inline-block;
height: 400px;
background: gray;
}
.image-list{
margin-left: 5%;
}
JS
/**
* 原理 需要比较可视区域的高度和当前图片在区域内的top值来决定是否加载图片
* Element.getBoundingClientRect()方法返回元素的大小及其相对于视口的位置。
*
* dataset 用于获取某个属性的值
* */
var viewHeight = document.documentElement.clientHeight;
function lazyload(){
var eles = document.querySelectorAll('img[data-original][lazyload]');
Array.prototype.forEach.call(eles,function(item,index){
var rect;
if(item.dataset.original === '')
return;
rect = item.getBoundingClientRect();
if(rect.bottom >=0 && rect.top < viewHeight){
!function(){
var img = new Image();
img.src = item.dataset.original;
img.onload = function(){
item.src= img.src;
}
item.removeAttribute('data-original');
item.removeAttribute('lazyload');
}()
}
})
}
lazyload();
document.addEventListener('scroll', lazyload);
Метод реализации предварительной загрузки
img标签 + display:none
<img src="../a.png" style="display:none;" />
new Image()
var img =new Image();
img.src="sdsds.png";
2. Перерисовка и перекомпоновка
- вопрос
- Механизм перерисовки и перекомпоновки в браузере
- что такое перекрасить
- что такое рефлоу
- Какие операции можно перерисовывать и перекомпоновывать?
Вопрос 1: Производительность CSS замедляет работу JavaScript? (Могу)
CSS и JavaScript заблокируют друг друга (JavaScript может получить соответствующие результаты рендеринга в коде) Один нить => табассинг JavaScript Один нить => рендеринг пользовательского интерфейса
==== Все эти два потока взаимоисключающие ====
СуммироватьПричина, по которой оптимизация производительности внешнего интерфейса связана с перерисовкой и перекомпоновкой, заключается в том, что частое срабатывание перерисовки и перекомпоновки приведет к частому рендерингу пользовательского интерфейса, что в конечном итоге приведет к замедлению js и снижению производительности страницы.
переплавкаИзменения размера, макета, скрытия и т. д. требуют перестроения, которое называется перекомпоновкой.
Факторы, вызывающие оплавление:
- Свойства, связанные с блочной моделью
- Позиционирование и плавающие связанные свойства
- Структура внутреннего текста узла
перерисоватьВнешний вид и стиль меняются, не влияя на макет, и их необходимо перерисовывать.
3. Кэш браузера
- cookie
- localstroage sessionstorage
- Service Workers
4. Кэш
- cache-control
- expires
- last-modified
- etag