Qwik использует концепцию resumability вместо классической гидрации. Это означает, что приложение не “оживает” на клиенте путём повторного выполнения всего дерева компонентов, а продолжает выполнение с точки останова, восстанавливая состояние по мере необходимости. Такой подход радикально снижает объём JavaScript, исполняемого на старте.
Vite в этой архитектуре выступает как инструмент двух ключевых уровней:
Связка Vite + Qwik формирует среду, где разработка остаётся быстрой, а финальная сборка оптимизирована под ленивую загрузку и разбиение кода до уровня событий.
Qwik проект обычно создаётся через официальный шаблон, который уже включает Vite-конфигурацию и интеграцию с Qwik City (маршрутизация и SSR).
Структура проекта включает:
src/ — основная логика приложенияsrc/routes/ — файловая маршрутизацияsrc/components/ — UI-компонентыentry.ssr.tsx — серверная точка входаentry.dev.tsx — dev-режимentry.preview.tsx — предпросмотр production-билдаVite конфигурация находится в vite.config.ts и
подключает Qwik плагин:
import { defineConfig } from 'vite';
import { qwikVite } from '@builder.io/qwik/optimizer';
export default defineConfig(() => {
return {
plugins: [qwikVite()],
build: {
target: 'es2020',
},
server: {
port: 5173,
},
};
});
Qwik плагин выполняет трансформацию кода, необходимую для сериализации состояния и генерации lazy boundaries.
Vite в режиме разработки не бандлит приложение полностью. Вместо этого используется нативная ESM-модель браузера:
Qwik усиливает этот подход за счёт дополнительной компиляции:
Qwik City предоставляет файловую маршрутизацию, которая интегрируется с Vite через виртуальные модули.
Пример структуры маршрутов:
src/routes/
index.tsx
about/
index.tsx
product/
[id]/
index.tsx
Каждый файл становится отдельным route module.
Пример страницы:
export default component$(() => {
return <div>Главная страница</div>;
});
Vite автоматически регистрирует эти маршруты через плагин, создавая карту маршрутов на этапе сборки.
Одной из ключевых особенностей Qwik является lazy execution по событиям.
В отличие от React, где обработчики уже активны после гидрации, Qwik сериализует их:
import { component$, useSignal } from '@builder.io/qwik';
export default component$(() => {
const count = useSignal(0);
return (
<button onClick$={() => count.value++}>
{count.value}
</button>
);
});
Символ $ имеет критическое значение:
Vite при этом генерирует отдельные чанки для таких функций.
Qwik активно использует SSR (server-side rendering). Vite здесь выполняет роль:
Серверная точка входа:
import { renderToStream } from '@builder.io/qwik/server';
import Root from './root';
export function render(url: string) {
return renderToStream(<Root />, {
containerTagName: 'html',
});
}
Vite собирает этот код отдельно от клиентского бандла, обеспечивая изоляцию окружений.
Qwik требует строгого разделения:
Vite помогает реализовать это через:
src/server, src/client)Пример:
if (import.meta.env.SSR) {
// серверная логика
} else {
// браузерная логика
}
Production-сборка в Vite + Qwik включает несколько стадий:
Особенность Qwik — экстремальная гранулярность чанков. Вместо страницы как единицы загрузки используется:
Qwik активно использует предзагрузку через Vite-manifest.
Пример стратегии:
Это снижает TTI (Time To Interactive) до минимальных значений.
Состояние в Qwik основано на сигналах:
import { useSignal } from '@builder.io/qwik';
const state = useSignal(0);
Vite не вмешивается напрямую в модель состояния, но обеспечивает:
Hot Module Replacement работает на уровне:
При изменении файла Vite:
Qwik дополнительно минимизирует пересборку дерева, так как нет необходимости повторной гидрации.
Плагин Qwik расширяет Vite pipeline:
$-границПример расширенной конфигурации:
import { defineConfig } from 'vite';
import { qwikCity } from '@builder.io/qwik-city/vite';
import { qwikVite } from '@builder.io/qwik/optimizer';
export default defineConfig({
plugins: [
qwikCity(),
qwikVite(),
],
});
Production build через Vite формирует:
Результат ориентирован на edge-окружения и CDN.
Основной принцип — максимальное перемещение логики в lazy-load слой, оставляя HTML максимально функциональным без исполнения JavaScript.
Комбинация Vite + Qwik даёт следующие свойства:
Архитектурно это отличается от React/Vue тем, что Vite используется не только как сборщик, но как основа для компиляции событийной модели приложения.