19. Деплой
Qwik City поддерживает деплой на множество платформ через систему адаптеров. Каждый адаптер оптимизирует приложение для конкретной среды исполнения.
Адаптеры деплоя
Заголовок раздела «Адаптеры деплоя»# Cloudflare Pages/Workersnpm run qwik add cloudflare-pages
# Vercel Edge Functionsnpm run qwik add vercel-edge
# Netlify Edge Functionsnpm run qwik add netlify-edge
# Node.js (Express/Fastify)npm run qwik add expressnpm run qwik add fastify
# Статический сайт (SSG)npm run qwik add staticCloudflare Pages
Заголовок раздела «Cloudflare Pages»Cloudflare — рекомендуемая платформа для Qwik. Бесплатный tier очень щедрый, и Workers работают на edge по всему миру.
import { cloudflarePagesAdapter } from '@builder.io/qwik-city/adapters/cloudflare-pages/vite';import { extendConfig } from '@builder.io/qwik-city/vite';import baseConfig from '../../vite.config';
export default extendConfig(baseConfig, () => ({ build: { ssr: true, rollupOptions: { input: ['src/entry.cloudflare-pages.tsx'] }, }, plugins: [cloudflarePagesAdapter()],}));# Деплой на Cloudflare Pagesnpm run buildnpx wrangler pages deploy distwrangler.toml:
name = "my-qwik-app"pages_build_output_dir = "dist"compatibility_date = "2024-01-01"
[vars]API_URL = "https://api.example.com"Vercel Edge Functions
Заголовок раздела «Vercel Edge Functions»import { vercelEdgeAdapter } from '@builder.io/qwik-city/adapters/vercel-edge/vite';import { extendConfig } from '@builder.io/qwik-city/vite';import baseConfig from '../../vite.config';
export default extendConfig(baseConfig, () => ({ build: { ssr: true, rollupOptions: { input: ['src/entry.vercel-edge.tsx'] }, }, plugins: [vercelEdgeAdapter()],}));vercel.json:
{ "framework": "qwik", "buildCommand": "npm run build", "outputDirectory": ".vercel/output"}Node.js сервер
Заголовок раздела «Node.js сервер»import { nodeServerAdapter } from '@builder.io/qwik-city/adapters/node-server/vite';import { extendConfig } from '@builder.io/qwik-city/vite';import baseConfig from '../../vite.config';
export default extendConfig(baseConfig, () => ({ build: { ssr: true, rollupOptions: { input: ['src/entry.express.tsx'] }, }, plugins: [nodeServerAdapter({ name: 'express' })],}));// Запуск// server/express.js (автогенерируется)import express from 'express';import { handle } from '../server/entry.express';
const app = express();app.use(handle);app.listen(3000, () => console.log('Сервер запущен на :3000'));Docker деплой
Заголовок раздела «Docker деплой»# DockerfileFROM node:18-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ciCOPY . .RUN npm run build
FROM node:18-alpine AS runnerWORKDIR /appCOPY --from=builder /app/server ./serverCOPY --from=builder /app/dist ./distCOPY package*.json ./RUN npm ci --only=production
EXPOSE 3000CMD ["node", "server/entry.express.js"]Переменные окружения
Заголовок раздела «Переменные окружения»// В routeLoader$ или routeAction$export const useConfig = routeLoader$(async ({ env }) => { const apiKey = env.get('API_KEY'); // Серверная переменная const publicUrl = env.get('PUBLIC_API_URL'); // Публичная
return { publicUrl };});API_KEY=secret-keyPUBLIC_API_URL=https://api.example.comVITE_APP_NAME=MyQwikApp # Доступна в клиентском коде через import.meta.env