Привет всем, я Кассон.
На недавнем WWC22,builder.io
изCTO 「miško hevery」(в то же времяAngular
/AngularJS
из发明者)发表了一段充满想象力из演讲。
miško hevery
В своем выступлении он представил полнофункциональную структуру SSR. —— Qwik
,Эта основа называется«Могу помочь вам удалить 99% JS-кода в вашем проекте»。
как он это сделал,В этой статье мы познакомимQwik
。
Давайте сначала поговоримQwik
诞生из背景。
для многих2C web
приложение(Например, электронная коммерция),Показатели эффективности первого экрана связаны с удержанием пользователей.,Удержание пользователей зависит от того, сколько денег вы зарабатываете.
Поэтому скорость открытия приложения будет влиять на заработок.
Однако фронтенд-разработчикам нелегко оптимизировать показатели производительности на первом экране. Причина не в том, что разработчики недостаточно стараются.
Давайте посмотрим на два показателя производительности.
FCP
(First Contentful Paint,Первый рендеринг контента)Измерение«Время с момента загрузки страницы до завершения рендеринга какой-либо части содержимого страницы на экране»。
текущийweb
приложение普遍采用«Внешний фреймворк»развивать,Это означает, что большое количествоJS
код(рамка本身код、Код для сторонних зависимых пакетов...)
отHTML
Начать анализ до последней страницырендеринг,В середине вам еще придется пройти:
JS
кодJS
кодЭто приводит кFCP
индексиз下降。
Чтобы оптимизироватьFCP
,Автор фреймворка предложилSSR
(Server Side Render,Серверный рендеринг),Требуется для создания первого экрана на стороне сервераHTML
,Это дляFCP
Экономит время, необходимое для выполнения трех вышеуказанных шагов.。
но,TTI
Показатели все еще нуждаются в оптимизации。
TTI
(Time to Interactive,Время взаимодействия пользователя)Измерение«Время, необходимое, чтобы страница стала полностью интерактивной»。
Основным измерением является время, необходимое от 1 до 3 ниже:
FCP
времяиспользоватьSSR
назад,ХотяFCP
уменьшать,норамкаhydrate
(закачка воды,即рамка使页面能够响应交互)所需времяверноTTI
окажет влияние。
видимый,性能瓶颈из源头существоватьJS
код。
React18
изSelective Hydration
проходить«Сначала дайте части взаимодействия с пользователем увлажниться»оптимизироватьTTI
индекс。
но,Qwik
Более экстремальный,他из目标да —— 干掉所有不必要изJS
кропотливый,Затраченное здесь время включает в себя две части:
JS
作для静态资源加载изкропотливыйJS
运行时изкропотливыйЕсли говорить о традицияхSSR
из粒度да«Вся страница»。
ТакReact18
изSelective Hydration
из粒度да«Компоненты, которые создают взаимодействие»。
ТакQwik
из粒度да«Метод в компоненте»。
Приведите пример,НижеHelloWorld
компоненты(можно найти,Qwik
Используйте что-то вродеReact
из语法):
Соответствующий эффект рендеринга страницы:
Открыть браузерNetwork
панель,Сколько страниц будет на этой странице?JS
Запрос?
Поскольку это статический компонент,нет логики,так что ответ:НетJS
просить。
再来看看经典из计数器Counter
компоненты,по сравнению сHelloWorld
,добавлен"Логика изменения состояния кнопки нажатия",Код выглядит следующим образом:
Соответствующий эффект рендеринга страницы:
Открыть браузерNetwork
панель,Сколько страниц будет на этой странице?JS
Запрос?
Ответ по-прежнему:НетJS
просить。
Обратите внимание, что в коде этих двух компонентов компонент используется для определения компонента., естьсимвол。
В счетчике,onClickТакже есть обратный звоноксимвол。
существоватьQwik
середина,назад缀приносить$
из函数都да«Ленивая загрузка»из。
hydrate
из粒度有多细,Просто зависит$
定义из多细。
например В счетчике,onClickприноситьназад缀,Затем обратный вызов клика загружается лениво.,Итак, выше сгибарендерингне будет содержать«Логика после нажатия» соответствующий JS-код.
после нажатия кнопки,Будет инициировать2индивидуальныйJS
просить,Нет.一индивидуальныйпросить返回изда«Логика после нажатия»:
Нет.2индивидуальныйJS
просить返回изда«Логика перерисовки компонентов»:
После выполнения этих двух фрагментов кода,Counter
становиться1。
Осмотр элемента покажет,прежде чем нажать,button
on:click
属性середина保存了«Логический адрес»:
после щелчка,会отпереписываться地址下载JS
код,Выполните соответствующую логику.
Считаете ли вы, что он был оптимизирован до предела? еще нет.
За какое-то длительное присутствие на странице、нуждатьсяJS
驱动из模块(например轮播图),Перед отображением модуля,«Модуль, соответствующий JS»不да必要из。
Например, в приведенном ниже примере с часами на странице имеется длинный список высотой более одного экрана, а внизу списка находятся часы.
Вот как выглядит список при прокрутке до конца:
существоватьClock
компонентыизuseClientEffect$
середина定义«Логика качания стрелок часов»:
Qwik
середина也存существовать类似React
изuseEffect
,但существоватьQwik
середина这индивидуальныйHook
可ксуществовать服务端/Выполнение клиента。
чтобы отличить,useClientEffect
да«useEffect, который выполняется только на клиенте»。
добавлять$
назад缀,代表他да«Ленивая загрузка»。
Конкретный эффект: когда страница прокручивается до открытия часов,useClientEffect$
переписыватьсяJS
код都不会просить。
Когда часы раскрыты,Будет инициировать两индивидуальныйJS
资源просить:
useClientEffect
из逻辑Clock
компоненты重新рендерингиз逻辑Если вы проверите элемент, элемент, соответствующий указателю, не будет двигаться, пока не появятся часы:
когда колокольчик раскрывается,загрузить и выполнитьJS
кодназад,Просто начните выполнять анимацию:
существовать传统SSR
середина,Данные фактически инициализируются дважды:
HTML
середина已经携приносить Над сгибомрендерингиз数据hydrate
назад,Затем данные преобразуются в состояние внутри структуры для последующего использования.существоватьQwik
середина,页面初始化时会存существоватьtype
дляqwik/json
изscript
теги для хранения«Данные, соответствующие активированному статусу на текущей странице»:
как это называется«Активировано»Шерстяная ткань?
Например, вот область комментариев статьи. Вот как она выглядит после рендеринга первого экрана:
这些评论数据会出现существоватьqwik/json
保存из数据середина么?
Нет, потому что нет взаимодействия для их активации.
Мы обнаружили, что один комментарий был свернут. При нажатии на него комментарий разворачивается:
При нажатии на это действие будет запрошено:
JS
кодв это время,评论数据才会出现существоватьqwik/json
середина,Потому что взаимодействие с щелчком активирует эти данные.
所ксуществоватьQwik
середина,если в этом нет необходимости,Данные не инициализируются дважды.
HTML
середина存существовать«Неактивные данные»,qwik/json
изscript
标签середина保存了«Активированные данные»,Эта функция будет иметь очень интересный эффект:
复制调试工具середина«Структура DOM на панели «Элементы»»назад,Затем вставьте его на новую страницу,может быть воспроизведено«Текущий статус взаимодействия страницы»(например,Ранее введенный контент по-прежнему сохраняется в поле ввода):
Скопируйте содержимое в красное поле
Переход на другие фреймворки,можно только воспроизвести«Исходное состояние страницы»。
Некоторые студенты могут спросить,Если сеть плохая,交互时再проситьJS
код不会让交互变得卡顿么?
Qwik
позволяет указать«Какие компоненты с высокой вероятностью будут эксплуатироваться пользователями?»(Например, электронная коммерцияприложениесередина,Кнопка корзины имеет высокую вероятность нажатия).
这些компоненты逻辑переписыватьсяJS
код会prefetch
,Предварительно запрошено, не затрагивая рендеринг первого экрана:
并且这些компонентыprefetch
из顺序да可к调整из。
Это означает, что поведение пользователя можно отслеживать.,к«Частота взаимодействия с пользователем»дляиндекс,作длякомпонентыprefetch
优先级из依据,Эвристика повышает производительность приложений.
这才да真正из«ориентированный на пользователя»из性能优化,И это полностью автоматически.
Сегодня эпоха, когда интерфейсные фреймворки процветают, и разные фреймворки ищут свои уникальные преимущества.
Qwik
из卖点да:ВоляJS
кодиз拆分от常见из«Время компиляции»(напримерwebpack
Разбивка на части)、«Время выполнения»(напримерdynamic import
),становиться«При общении»。
верноJS
кодиз极致拆分,Просто для достижения одной цели - при рендеринге первого экрана,移除你项目середина99%изJS
код。
Что вы думаете об этой операции?