Я ценю все, что строит Builder IO. Будь то митоз, qwik или partytown 🎉.

Моя главная цель при написании этой статьи — объяснить вам, как работает Qwik изнутри, на очень простом примере, который мы постараемся придумать.

Знакомство с Qwik

На мой взгляд, парадигма «возобновляемости», которую использует Qwik, заключается в том, чтобы просто загружать Javascript как можно позже и выполнять его только тогда, когда это необходимо. т. е. избегайте доставки JS и загружайте его только при необходимости и просто отправляйте HTML и CSS.

Вот как ваш веб-сайт смог получить высший балл 100 в тесте скорости понимания страницы.

Инженерное время

Если вы посмотрите на синтаксис, который предлагает Qwik, вы заметите, что «$» часто используется и имеет важное значение.

Например:

export const Counter = component$(() => {
  const store = useStore({ count: 0 });

  return <button onClick$={() => store.count++}>{store.count}</button>;
});

Вы можете заметить следующий компонент «$» и onClick в этом примере. Короче говоря, это говорит Qwik создать для него уникальный файл и медленно загружать его при необходимости.

Вы заметите кнопку, которая выглядит так, пока этот код преобразуется в HTML.

<button on:click="fileName.js#functionName">Hello World</button>

Если вы внимательно посмотрите, это недопустимый атрибут JS onclick; вместо этого это атрибут, созданный Builder IO.

В таких средах, как react, присоединение прослушивателей событий к DOM во время построения дерева DOM — это шаг, который Qwik пропускает в пользу использования глобального прослушивателя событий, в данном случае прослушивателя событий onclick.

Затем он просматривает путь события, чтобы увидеть, какие элементы были активированы, и только при необходимости извлекает и запускает код для этих функций прослушивателя.

Для ленивой загрузки и выполнения js Qwik в значительной степени полагается на динамический импорт.

Начиная с базового HTML и JS.

Посетите этот сайт github, если хотите увидеть код.
https://github.com/RavenColEvol/qwik-basic

index.html

Это очень простой HTML-документ с кнопкой, при нажатии на которую появляется сообщение «Hello World». (Ага, классическая реализация инженера-программиста 😜)
Если вы внимательно посмотрите, on:click относится к методу onClick, найденному в файле app.js.

Вышеупомянутый HTML также имеет скрипт index.js, который в нашем случае является нашей базовой реализацией Qwik.

app.js

В упомянутом выше файле app.js есть функция onClick, которая служит нашей основной логикой. 😝

index.js

Давайте потратим некоторое время на выяснение того, что делает наш Qwik.

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

В нашей реализации все подпрограммы onClick предварительно загружаются из нашего HTML-файла. Если вы посмотрите, работник службы выполняет предварительную выборку.
Когда JS делает запрос на получение, работник службы может создавать вызовы выборки, кэшировать результаты и воспроизводить кэшированные результаты.

Кроме того, у нас есть глобальный прослушиватель onClick, который, по сути, отслеживает событие onclick в документах, проверяет все элементы в пути клика и выполняет код после его получения.

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

По сути, сервисный работник предварительно выбирает и кэширует JS-файл, который может быть использован, и пытается ответить на запрос на получение файла, если он имеет файл в кеше.

Результаты

Несколько замечаний:

Вся вышеописанная реализация была сделана на основе того, что я понял из документации Qwik.

В этой статье не рассматривается, как Qwik решает проблему замыканий в парадигме возобновляемости.

Полезные ссылки:

https://qwik.builder.io/docs/think-qwik/
https://qwik.builder.io/docs/advanced/dollar/