Эта статья предназначена только для размышлений. У Сяо Цзяня недостаточно времени, чтобы попрактиковаться и изложить общие идеи.
Давайте сначала подведем итог, каковы методы обработки:
"ленивая загрузка"(Lazy Загрузка), также известная как отложенная загрузка, — это технология, оптимизирующая время загрузки веб-страниц или приложений. существовать В рамках этой стратегии,Содержание толькосуществоватьЗагружается и отображается при необходимости,Обычно относится к тому моменту, когда пользователь прокручивает раздел контента, который не требует немедленной загрузки.,Эта часть контента только что начала загружаться。Этот метод может улучшить скорость загрузки страницы.、Уменьшите первоначальную загрузку ресурсов и Улучшите пользовательский опыт особенно важен.
Характеристики ленивой загрузки:
Отложенная загрузка обычно происходит разными способами, включая, помимо прочего:
Intersection Observer
API для определения того, попадает ли элемент в видимую область.v-lazy
、Reactизlazy
иSuspense
ждать。Некоторые рекомендации и потенциальные проблемы, которые следует учитывать при покупке адаптивной загрузки:
loading="lazy"
свойствовыполнить图片иiframeиз Ленивая загрузка,этоВстроенная поддержка отложенной загрузки,упрощенныйвыполнить,И обеспечивает лучшую совместимость и производительность.
DOM
Обработка слияния операций — это стратегия оптимизации,цельсуществоватьУменьшите количество перерисовок и перекомпоновок браузера.,проходитьОбъединение нескольких операций DOM в один процесс обновления.для улучшения производительности страницы。 Этот подход особенно важен, поскольку частые, разбросанные операции DOM могут привести к тому, что браузер несколько раз пересчитает расположение элементов и повторно отрисует интерфейс. Эти операции требуют больших вычислительных ресурсов и могут существенно повлиять на скорость реагирования и производительность пользовательского интерфейса. Грубо говоря,то естьуменьшить как можно большеDOM
количество операций。
использоватьDocumentFragment:
DocumentFragment
этоОблегченный узел DOM,Может использоваться как временный контейнер для хранения нескольких узлов DOM. Вы можете применить все изменения в DocumentFragment.,Затем добавьте его в дерево DOM за один раз.,этот методПерекомпоновка и перерисовка будут запускаться только один раз.。
Эта вещьСобственный APIподдерживать,详细Понятно解Может参考掘金这一篇博客:juejin.cn/post/695249…
var fragment = document.createDocumentFragment();
for (let i = 0; i < items.length; i++) {
var element = document.createElement('div');
element.textContent = 'Item ' + i;
fragment.appendChild(element);
}
document.body.appendChild(fragment);
Минимизируйте прямое манипулирование DOM.:
style.cssText
и不да单独из样式свойство,чтобы уменьшить количество перерисовок и перекомпоновок.Пакетное чтение с последующей пакетной записью:
использоватьrequestAnimationFrame:
requestAnimationFrame
убеждатьсясуществовать Браузериз下一个重绘之前Выполнение обновлений DOM,Это позволяет избежать ненужной перекомпоновки и перерисовки.,这也да下面Воля要提到из“Покадровый рендеринг”requestAnimationFrame(() => {
// Выполнение обновлений DOM
});
Используйте современные интерфейсные фреймворки:
виртуальный список(Virtual List)это своего родаЭффективно отображать большие объемы элементов данныхизвнешний Технология оптимизации производительности интерфейса. Когда у тебя есть тысячи данных, нужен существованиевнешний. интерфейс При отображении в списке,нравиться果Рендеринг всех элементов данных непосредственно в DOM приведет к значительному снижению производительности.。 виртуальный список Технологии могут решить эту проблему,它из核心思想даРендеринг только элементов данных в пределах видимой области пользователя в данный момент времени.,Вместо рендеринга всего списка.
Принцип можно условно разделить на следующие пункты:
псевдокод:
class VirtualList {
constructor(container, options) {
this.container = container; // Элемент контейнера, например div
this.itemHeight = options.itemHeight; // Высота каждого элемента списка
this.renderAhead = options.renderAhead || 0; // Количество дополнительных элементов рендеринга для более плавной прокрутки.
this.items = options.items; // Полный список данных
this.totalHeight = this.items.length * this.itemHeight; // общая высота
this.visibleCount = Math.ceil(this.container.clientHeight / this.itemHeight); // Количество видимых элементов
this.container.addEventListener('scroll', () => this.handleScroll());
this.render();
}
handleScroll() {
this.render(); // Ререндеринг каждый раз при прокрутке
}
render() {
const scrollTop = this.container.scrollTop; // Получить текущую позицию прокрутки
const startIndex = Math.floor(scrollTop / this.itemHeight) - this.renderAhead; // Рассчитать стартовый индекс
const endIndex = startIndex + this.visibleCount + this.renderAhead * 2; // Вычислить конечный индекс
// создавать фрагменты документов для объединения операций DOM
const fragment = document.createDocumentFragment();
for (let i = Math.max(0, startIndex); i <= Math.min(endIndex, this.items.length - 1); i++) {
const item = this.items[i];
const div = document.createElement('div');
div.style.height = `${this.itemHeight}px`;
div.textContent = `Item ${item}`; // Предположим, что каждый элемент представляет собой простой текст.
fragment.appendChild(div);
}
// Опорожните контейнер и добавьте новые элементы.
this.container.innerHTML = '';
this.container.appendChild(fragment);
// Отрегулируйте высоту контейнера в соответствии с общей высота
this.container.style.height = `${this.totalHeight}px`;
}
}
// использовать Пример:
const list = new VirtualList(document.getElementById('listContainer'), {
itemHeight: 30,
items: Array.from({ length: 10000 }, (_, i) => `Item ${i}`), // Генерировать много данных
});
Этот код демонстрирует очень простой виртуальный список заполнения:
constructor
初始化基本свойствои事件监听。handleScroll
методсуществовать Срабатывает при прокрутке контейнера,Используется для воссоздания элементов в видимой области.render
метод计算когда前应该显示哪些项目,и обновляет DOM, чтобы отразить эти изменения.Примечание. Это всего лишь пример. В реальных приложениях может потребоваться более подробная информация и оптимизация, например обработка элементов разной высоты, оптимизация обработки большого количества элементов, добавление более плавной прокрутки и т. д.
На самом деле, это тоже можно отнести к категории ленивая. загрузка之середина。 Пакетная загрузка данных, также известная как постраничная загрузка или загрузка по требованию, — это метод, обычно используемый во внешней разработке для оптимизации обработки и представления больших объемов данных. Эта технология позволяет приложениямЗагрузка данных шаг за шагом,Вместо того, чтобы загружать их все сразу,从и提升应用из响应速度ипользовательский опыт。 например:прокатная загрузка。
выгода:
псевдокод:
let currentPage = 1;
const pageSize = 10;
function loadInitialData() {
fetchData(currentPage, pageSize).then(appendDataToView);
}
function loadMoreData() {
currentPage += 1;
fetchData(currentPage, pageSize).then(appendDataToView);
}
function fetchData(page, size) {
// Инициировать сетевой запрос для получения данных
return fetch(`/api/data?page=${page}&size=${size}`).then(response => response.json());
}
function appendDataToView(data) {
// Добавьте полученные данные в представление
data.forEach(item => {
const element = document.createElement('div');
element.textContent = item.content; // Предположим, что элемент данных имеет поле содержимого.
document.getElementById('dataList').appendChild(element);
});
}
// Предположим, есть кнопка для загрузки дополнительных данных.
document.getElementById('loadMoreBtn').addEventListener('click', loadMoreData);
// Начальная нагрузка
loadInitialData();
Упростите структуру DOM — это одна из ключевых стратегий оптимизации производительности внешнего интерфейса.
Оптимизированная и эффективная структура DOM может ускорить рендеринг страниц.,Улучшить скорость реакции взаимодействия с пользователем,И уменьшите использование памяти.
Вот несколько распространенных способов Упростить структуру DOM:
<div>
или<span>
элементы, используемые для макетаили ВОЗ样式修饰,Все это можно оптимизировать. использовать псевдокласс CSS или более продвинутые методы макетирования (такие как Flexbox или Grid) могут сократить использование таких элементов.<table>
,и избегайте использования таблиц для макета,Поскольку макет таблицы приведет к замедлению браузеррендеринга.<article>
、<section>
、<nav>
、<aside>
ждать),Это не только может сделать структуру DOM более понятной.,Это также помогает улучшить доступность веб-сайта и эффективность SEO.<iframe>
встреча创建额外из文档环境,Увеличьте сложность страницы. Только тогда, когда действительно существует необходимость встраивания внешнего контента в страницу.,талантиспользоватьiframe,И постарайтесь сократить их количество.Cache-Control
голова,делатькеш статические ресурсы браузера.<script async>
Загрузка некритичных скриптов,Избегайте блокировки рендеринга。<script defer>
Скрипт отложенной загрузки,до тех пор, пока анализ документа не будет завершен.Web Workers Предоставляет возможность запуска операции сценария в фоновом потоке. Этот сценарий не зависит от других сценариев и не влияет на производительность страницы. использовать Web С помощью Workers вы можете выполнять трудоемкие или трудоемкие задачи, не замораживая пользовательский интерфейс. Web О Workers много информации, я просто дам вам здесь краткое изложение. Если вам нужна подробная информация, вы можете обратиться к другим статьям или выполнить поиск в Браузер. 我推荐一篇Приходить自百度某团队из博客:juejin.cn/post/713971…
Если я правильно помню, Google, похоже, разработал библиотеку машинного обучения, я забыл конкретное название.
Создайте работника:
// Создайте Worker,worker.js этосуществовать Worker Скрипты, выполняемые в потоках
var myWorker = new Worker('worker.js');
существовать worker.js
войдите, напишите Worker Что должен делать поток:
// существовать worker.js в файле
self.addEventListener('message', function(e) {
var data = e.data;
// иметь дело сданные var result = processData(data);
// Отправьте результаты обратно в основной поток
self.postMessage(result);
});
function processData(data) {
// Логика обработки данных
return data; // Вернуть обработанные данные
}
существоватьосновная темасередина与 Worker Взаимодействие:
// К Worker 发送данные
myWorker.postMessage({ a: 1, b: 2 });
// получить от Worker новости
myWorker.addEventListener('message', function(e) {
console.log('Получено от Worker новости:', e.data);
});
Таким образом, веб-воркеры позволяют разработчикам переносить трудоемкие вычислительные задачи в фоновые потоки, улучшая скорость реагирования и производительность приложений.
Web Workers
из大概принципна основеМногопоточная среда, предоставляемая браузером,允许开发ВОЗсуществовать За кулисами Параллельное выполнениеJavaScript
код,иНе блокирует основной поток。
postMessage
направление метода Worker Отправляйте сообщения и слушайте message
события для получения Worker сообщение отправлено обратно. Аналогично, Рабочий Сам также провожу мониторинг message
события для полученияосновная темановости,ииспользовать postMessage
чтобы ответить.importScripts()
функций, что позволяет им использовать больше библиотек и инструментов для выполнения задач.terminate()
Метод завершается немедленно Worker исполнение, не дожидаясь его естественного завершения.Говоря об этом,Мне вспоминается «многопоточность» Node.,Его суть также заключается в моделировании многопоточных операций на основе другого подпроцесса.,Суть вроде бы однопоточная.
Следующее обсуждение взято из Интернета: Node.js Многопоточность отличается от многопоточности в традиционных серверных языках, таких как Java и C++. Node.js Концепция дизайна заключается в однопоточном неблокирующем вводе-выводе, что делает его очень эффективным при обработке большого количества одновременных соединений. Однако, чтобы в полной мере использовать многоядерные процессоры и параллельно обрабатывать ресурсоемкие задачи, Node.js Для имитации «многопоточности» предусмотрены некоторые механизмы:
child_process
модуль создает дочерние процессы, которые могут запускать программы Node.js или любую другую программу. Дочерний процесс выполняется независимо, а основной процесс Node может взаимодействовать с ним через IPC (межпроцессное взаимодействие). Хотя это не является многопоточным в традиционном понимании, но может балансировать на разных ядрах. выполнение Задача。child_process
Разный, Рабочий Threads Разрешить общую память (проходить SharedArrayBuffer), разные потоки выполняют JavaScript и существуют в одном и том же процессе Node.js. Это делает обмен данными и обмен данными более эффективными, а также уменьшает проблему Уведомления потоков. Безопасность.Хотя Node.js Предлагал такое Параллельное механизм выполнения кода, но они отличаются от многопоточности в традиционных серверных языках (таких как потоки в Java, std::thread в C++) существовать и восстанавливаться. Существует JavaилиC++, многопоточность — это встроенный язык анализа и среда выполнения, который может напрямую создавать потоки и управлять ими, и эти потоки совместно используют ресурсы процесса. Эти характеристики Node.js больше основаны на создании существующих процессов и рабочих потоков. Необходимо учитывать вопросы связи и совместного использования ресурсов между различными процессами и потоками.
Node.js Он основан на однопоточной модели цикла событий для обработки асинхронных операций, что означает, что основной поток выполнения Node.js является однопоточным. Так называемая «многопоточность» на самом деле представляет собой два основных механизма: Node.js Средняя симуляция восстановления:
child_process
Дочерний процесс, созданный модулем, на самом деле является полностью независимым процессом, созданным на уровне операционной системы. Каждый дочерний процесс имеет свой собственный экземпляр V8 и независимый поток выполнения. выполнение,Но межпроцессное взаимодействие (IPC) требует дополнительных накладных расходов. Хотя эти подпроцессы могут вычисляться параллельно,Но они не разделяют память и контекст выполнения.,Каждый процесс полностью независим.worker_threads
Модуль предоставляет возможность создавать несколько потоков в одном процессе Node.js. здесь каждый Worker Потоки могут выполнять независимый файл JavaScript и совместно использовать определенное пространство памяти (проходить SharedArrayBuffer),Параллельное Выполнение миссии. Хотя это ближе к многопоточности в традиционном смысле, каждый Worker Темы по-прежнему являются независимой средой выполнения, имеет собственный экземпляр V8 и цикл событий.Подводя итог, Node.js Основная логика приложения выполняется в отдельном основном потоке, полагаясь на цикл событий для обработки неблокирующих операций ввода-вывода. когда дело доходит до CPU Для интенсивных задач Node.js проходить child processes или worker threads Выбор имеет возможности параллельной обработки, аналогичные многопоточности, но это не меняет Node.js По своей сути существование основано на однопоточном цикле событий.
Излишне говорить, что позвольте мне полениться и позволить пользователю активно активировать ресурсы, которые ему нужно проверить, а затем визуализировать страницу после запуска, например: нажмите, чтобы увидеть больше.
нравиться果你看过Vue
иReact
частьпринципвыполнить,Тогда ты должен знатьdiff
Сравните эту операцию,Если вы этого не понимаете, вы можете поискать.
дифференциальное обновление(Differential Обновление) — это стратегия оптимизации, используемая для сокращения ненужных операций DOM, вызванных изменениями данных, тем самым повышая производительность веб-приложений. В основном он используется в существующих приложениях, особенно когда данные часто меняются. существующее дифференциальное обновлениесередина,Только измененная часть данных вызовет обновление DOM.,Вместо перестройки всего дерева DOM.
такойданные覆盖式更新то естьПолное обновление,всеВсе нужно перерисовывать。
Учитесь и применяйте,大количестводанныеизdiff
верно比Может配合上方изWeb Workers
Давайте оптимизируем дальше!
Серверный рендеринг(Server-Side Рендеринг (SSR) — это технология, которая генерирует полный HTML-код страницы на сервере, а затем отправляет его клиенту (Браузер). Клиент загружает отображаемый HTML-контент, не дожидаясь загрузки и выполнения всего JavaScript для визуализации содержимого страницы. . 也то естьСерверная часть отображает HTML-код во внешнем интерфейсе.,我们из
Vue
иReact
даSPA
программа,рендеринг全дасуществоватьклиент,Если контента слишком много, скорость загрузки будет медленной и зависающей.,И если данные большие,Плохая конфигурация клиента,那就更да难搞Понятно。 такУ нас непосредственно существующий сервер выдаст рендеринг страницы,Это значительно снизит нагрузку на клиента.,рендеринг естественно быстрый,Суть РСБ заключается в перекладывании бремени,Перенесите нагрузку с клиента на сервер. и且SSR оптимизирован для SEO, SPA – наоборот.。
Vue
иReact
也有自己изSSRрамка,分别даNuxt
иNext
,尤其даNext
Очень простой в использовании。
На самом деле Оптимизация анимации включает в себя Покадровый рендеринг, но о нем лучше поговорить отдельно.
transition
иanimation
свойство Приходить定义анимация,и不даJavaScriptизsetInterval
илиsetTimeout
。transform
иopacity
,Браузер Можетиспользоватьускорение графического процессорарендеринг вместо того, чтобы полагаться исключительно на процессор. Это может значительно улучшить производительность анимации.width
、height
、margin
、top
ждать。requestAnimationFrame
(rAF): requestAnimationFrame
контролироватьанимация,и不даsetInterval
илиsetTimeout
。requestAnimationFrame
встречасуществовать Браузер Выполняется перед перерисовкойанимациякод,Тем самым обеспечивая плавность анимации.На самом деле это содержит оптимизацию существования. анимация, но я все равно прихожу один на место. Покадровый рендеринг(Frame-by-frame анимация) — это технология анимации, в которой каждый кадр представляет собой независимую рендеринг. Этот метод часто используется для комплексной оптимизации анимации, такой как традиционная анимация или анимация высокоинтерактивных веб-приложений. существоватьWeb开发середина,Покадровый рендерингобычно относится кпроходитьJavaScriptОбновление покадровоанимациясостояние,这Можетпроходить
requestAnimationFrame
Приходитьвыполнить,Обязательно обновляйте кадр анимации перед каждым розыгрышем Браузера.
let currentFrame = 0;
const totalFrames = 60; // Допустим, в анимации всего 60 кадров.
function updateAnimation() {
// Обновите статус анимации, здесь просто увеличьте номер кадра.
currentFrame++;
// существует здесь обновляет DOMилиCanvas, чтобы отразить состояние анимации текущего кадра.
// Например, изменение положения и угла поворота элемента и т. д.
updateDOMForCurrentFrame(currentFrame);
// Если анимация не закончилась, запросите следующий кадр, чтобы продолжить обновление.
if (currentFrame < totalFrames) {
requestAnimationFrame(updateAnimation);
}
}
function updateDOMForCurrentFrame(frame) {
// Обновите DOM на основе текущего кадра, вот лишь пример
const element = document.getElementById('animated-element');
// Предполагая, что анимация является мобильным элементом, она перемещается на 1 пиксель каждый кадр.
element.style.transform = `translateX(${frame}px)`;
}
// начинатьанимация
requestAnimationFrame(updateAnimation);
существуют В этом примере:
updateAnimation
функцияда每帧执行изфункция,Это обновит статус анимации.,И существование называется каждый раз перед тем, как Браузер перерисовывает.updateDOMForCurrentFrame
функция根据когда前帧Приходить更新DOMилиCanvas。существовать这个例子середина,Он просто добавляет один элемент в каждый кадр.КДвигайтесь вправо1px。requestAnimationFrame(updateAnimation)
начинатьанимацияцикл。requestAnimationFrame
встречасуществовать Браузер Вызывается перед следующей перерисовкойupdateAnimation
функция,Таким образом обновляется покадровая анимация.Такой Подровый рендерингиз方式让анимация开发ВОЗ有更大из控制权,Можно комплексную настройку анимационного эффекта,При этом обеспечьте плавность анимации.
мы знаем,анимация и видео фактически разбиты на кадры.,Люди, знакомые с фотографией и анимацией, возможно, хорошо знают об этом.,Частота кадров определяет, насколько плавным будет видео.,Например, мой IQOO11S,существовать, когда частота обновления экрана составляет 60 Гц,Когда приложение прерывает анимацию, переход становится недостаточно плавным, видимым невооруженным глазом.,Но когда я установил частоту 144 Гц, все стало очень, очень плавно.
То же самое касается анимации и рендеринга в браузере.
Покадровый Принцип рендеринга основан на вычислении и рендеринге анимации одну за другой для создания непрерывного эффекта анимации. существует Веб-среда, Покадровый рендерингобычно зависит отrequestAnimationFrame
(rAF)метод Приходитьвыполнить。这里да其背后из Некоторый关键принцип:
requestAnimationFrame
вызов一个функция Приходить更新анимацияисуществоватьв следующий раз Браузер Выполняется перед перерисовкой。这иметь в виду您изанимациярамка с Браузериз刷新率(Обычно 60 раз в секунду, то есть один кадр каждые 16,67 миллисекунды.)синхронный,Таким образом максимально эффективно используется мощность рендеринга каждого кадра.,Убедитесь, что анимация плавная.requestAnimationFrame
руководитьанимацияиметь в виду Браузерспособен оптимизироватьанимацияиз性能,Уменьшите и избегайте искажений макета и ненужных перерисовок.,Потому что Браузер знает, что вы намерены создавать анимацию.,И можно оптимизировать для этого.requestAnimationFrame
из回调频率,для экономии вычислительных ресурсов и электроэнергии.requestAnimationFrame
в целомсуществовать被вызовизфункция内部再次вызов自己,Создайте рекурсивный цикл. Это позволяет Браузерсуществовать еще раз выполнить логику обновления анимации перед следующей перерисовкой.,Продолжайте продвигать последовательность анимации.requestAnimationFrame
да与Браузериз刷新率синхронныйиз,Это позволяет избежать чрезмерных кадров между обновлениями экрана.,Сократите растрату ресурсов,И обеспечить плавное визуальное восприятие.Проще говоря,Старайтесь не блокировать браузер。 для异步就不多说Понятно,
JavaScript
да异步玩из非常出色из语言,Маленькая Джейн была ленива.
WebAssembly (часто сокращенно Wasm) — это новый формат кода, созданный для Интернета, который позволяет реально запускать программы на веб-страницах со скоростью, аналогичной скорости машинного кода. WebAssembly Разработанный для работы с JavaScript, он призван стать альтернативой для веб-разработчиков, особенно в приложениях, чувствительных к производительности. Я мало что знаю об этом и на самом деле не сталкивался с этим, но помню, что он может компилировать другие языки в формат WebAssembly и выполнять его в существующем Браузер, что позволяет добиться очень высокой производительности обработки.
Хотя WebAssembly обычно необходимо скомпилировать после написания на поддерживаемом языке программирования.,Но ниже приведен упрощенный обзор процесса.,Никакого конкретного кода, но описаны общие шаги от C до WebAssembly:
WebAssembly постепенно становится важной частью веб-разработки, предоставляя мощный способ повышения производительности и возможностей веб-приложений.
Я еще не пробовал это,Просто узнал это,Поэтому мне сложно писать псевдокод.,Если вам интересно, вы можете проверить другую информацию.
ускорение графического Процессор относится к использованию графических процессоров (GPU) для ускорения рендеринга. графики и неграфические вычислительные процессы для повышения производительности приложений. существоватьWebНаправления развития,ускорение графического Процессор часто используется для ускорения рендеринга графики и анимации веб-страниц, обеспечивая более плавный и отзывчивый пользовательский интерфейс. опыт。
МожетпроходитьнекоторыйCSSсвойство Приходить提示Браузериспользоватьускорение графического процессора特定元素изрендеринг:
transform: translateZ(0)
илиtransform: translate3d(0, 0, 0)
применяется к элементам,Может Создайте新изслой композиции, хотя сама трансформация не имеет визуальных изменений.will-change
свойство Может用Приходить告知Браузер某个元素预计встреча有变化(нравитьсяанимация),Браузер можно оптимизировать заранее.Первая статья в новом году окончена. Давайте остановимся на этом. Моя печатающая рука онемела. Если можете, поставьте мне лайк. Если вам нужно перепечатать, не забудьте поставить подпись Сяоцзянь и указать источник! Быть оригинальным непросто, спасибо за поддержку.
Кстати, я рекомендую два крупномасштабных решения по оптимизации рендеринга данных для каскадного потока: