Quickstarters
How to Build a Qwik Frontend and Connect It to a Backend?
31 мин
в этом учебном пособии вы создадите приложение «список дел» с использованием qwik и подключите его к надежному бэкенду на базе back4app этот гид предназначен для разработчиков, которые хотят использовать возможности возобновляемости и ленивой загрузки qwik, интегрируя основные операции crud (создание, чтение, обновление, удаление) с управляемым бэкендом к концу вы получите полностью функциональное приложение, которое демонстрирует, как объединить современный фронтенд qwik с надежными бэкенд сервисами back4app создание полнофункционального приложения может быть сложной задачей, так как это включает настройку бэкенда, управление базами данных, аутентификацию и развертывание чтобы упростить эти задачи, мы используем back4app— масштабируемый бэкенд как услуга (baas) — решение, позволяющее вам сосредоточиться на создании вашего приложения qwik, в то время как оно заботится о хостинге, базах данных и api back4app предлагает комплексный набор бэкенд сервисов, включая готовую к использованию nosql базу данных, аутентификацию, cloud code для серверной логики и плавные интеграции sdk его поддержка контейнерного развертывания делает его отличным выбором для современных полнофункциональных приложений с этими инструментами под рукой вы можете быстро разрабатывать и развертывать приложения без необходимости управления серверной инфраструктурой ключевые выводы следуя этому руководству, вы научитесь инициализировать современный проект qwik интегрировать бэкенд сервис для управления данными вашего приложения реализовать основные операции crud для интерактивного пользовательского интерфейса развернуть полнофункциональное приложение списка дел с использованием контейнеризованных рабочих процессов на back4app предварительные требования перед началом убедитесь, что у вас есть следующее node js и npm установите последнюю lts версию с nodejs org https //nodejs org/ и проверьте с помощью node v и npm v базовые знания qwik рекомендуется знакомство с компонентами qwik, сигналами (используя usesignal ), и концепцией возобновляемости если вы новичок в qwik, сначала ознакомьтесь с его документацией аккаунт на back4app зарегистрируйтесь на back4app https //www back4app com/ для настройки и управления вашими бэкенд сервисами с этими предварительными требованиями вы готовы настроить ваш проект и начать разработку настройка проекта начните с настройки вашей локальной среды разработки и инициализации вашего проекта qwik подтвердите, что node js (lts версия) установлен node v npm v создайте новый проект qwik с помощью qwik cli выполните следующую команду npm create qwik\@latest ответьте на вопросы, которые предоставит cli назовите проект todo app или замените его на любое другое имя, которое вам нравится перейдите в каталог вашего проекта cd todo app запустите сервер разработки, чтобы проверить вашу настройку npm start ваше приложение qwik теперь должно работать локально откройте предоставленный url в вашем браузере, чтобы подтвердить далее вы настроите свой бэкенд на back4app для управления хранением данных и взаимодействиями с api создание бэкенда todo back4app предлагает полностью управляемый бэкенд сервис на базе parse этот сервис предоставляет nosql базу данных, аутентификацию, cloud code и автоматически сгенерированные api из коробки этот раздел проведет вас через создание task модели данных для хранения ваших задач и связывания ее с вашим qwik фронтендом настройка вашего бэкенд приложения войдите в вашу панель управления back4app https //www back4app com/ и нажмите "создать новое приложение " назовите ваше приложение (например, todoqwikapp ) и выберите nodejs/parse в качестве типа бэкенда после создания перейдите в "база данных" > "обозреватель" нажмите "создать класс" и выберите "пользовательский" назовите класс task и установите разрешения на уровне класса для разрешения публичного чтения и записи (вы можете уточнить эти настройки позже) в классе task добавьте следующие поля title (строка) – название задачи description (строка) – подробности о задаче completed (булевый) – указывает, завершена ли задача duedate (дата) – срок выполнения задачи нажмите "сохранить" для завершения вашей схемы интеграция back4app с qwik интегрируйте back4app в ваш проект qwik, используя parse javascript sdk установите sdk через npm npm install parse настройте sdk, инициализировав его с вашим application id и javascript key получите эти учетные данные на вашей панели управления back4app в разделе app settings > security & keys создайте файл конфигурации (например, src/lib/parse js ) и добавьте следующее import parse from "parse/dist/parse min js"; const parse app id = 'your application id'; const parse js key = 'your javascript key'; const parse server url = 'https //parseapi back4app com/'; parse initialize(parse app id, parse js key); parse serverurl = parse server url; export default parse; теперь вы можете импортировать эту конфигурацию в ваши компоненты и маршруты qwik для взаимодействия с вашим бэкендом разработка фронтенда с qwik теперь, когда ваш бэкенд подключен, создайте пользовательский интерфейс для вашего приложения список дел с использованием qwik вы создадите компоненты для добавления, отображения, обновления и удаления задач, управляя состоянием с помощью сигналов qwik организация ваших компонентов ваше приложение будет включать следующие ключевые компоненты taskform tsx – компонент для добавления новых задач tasklist tsx – компонент для отображения всех задач и предоставления управления для отметки задач как выполненных или их удаления taskitem tsx – компонент, представляющий отдельную задачу с действиями для переключения выполнения или удаления создайте components папку внутри src и добавьте эти файлы mkdir src/components touch src/components/taskform tsx src/components/tasklist tsx src/components/taskitem tsx управление состоянием с помощью сигналов qwik используйте usesignal для реактивного управления состоянием на вашей главной странице (например, src/routes/index tsx ), настройте состояние и получение данных следующим образом import { component$, usesignal, usevisibletask$, $ } from '@builder io/qwik'; import parse from ' /lib/parse js'; import taskform from ' /components/taskform'; import tasklist from ' /components/tasklist'; export default component$(() => { const tasks = usesignal< { id string; createdat string; updatedat string; title string; description string; completed boolean; }\[] \>(\[]); const fetchtasks = $ ( async () => { try { const task = parse object extend("task"); const query = new parse query(task); const results = await query find(); tasks value = results map(task => ({ id task id ?? '', createdat task createdat ? task createdat toisostring() '', updatedat task updatedat ? task updatedat toisostring() '', title task get('title') ?? '', description task get('description') ?? '', completed task get('completed') ?? false, })); } catch (error) { console error("error fetching tasks ", error); } }); usevisibletask$(async () => { await fetchtasks(); }); return ( \<div class="container"> \<h1>to do list\</h1> \<taskform ontaskadded$={fetchtasks} /> \<tasklist tasks={tasks value} ontaskschange$={fetchtasks} /> \</div> ); }); создание компонента формы задач в src/components/taskform tsx , создайте компонент формы для добавления задач используйте реактивные сигналы qwik для ввода данных формы import { component$, usesignal, $, qrl } from '@builder io/qwik'; import parse from ' /lib/parse js'; interface taskformprops { ontaskadded$ qrl<() => void>; } export default component$((props taskformprops) => { const title = usesignal(''); const description = usesignal(''); const handlesubmit$ = $(async (e event) => { e preventdefault(); try { const task = parse object extend("task"); const task = new task(); task set("title", title value); task set("description", description value); task set("completed", false); await task save(); title value = ''; description value = ''; return true; } catch (error) { console error("error adding task ", error); return false; } }); return ( \<form preventdefault\ submit onsubmit$={async (event) => { const success = await handlesubmit$(event); if (success) { await props ontaskadded$(); } }} \> \<input type="text" placeholder="task title" value={title value} oninput$={(e) => title value = (e target as htmlinputelement) value} required /> \<input type="text" placeholder="description" value={description value} oninput$={(e) => description value = (e target as htmlinputelement) value} required /> \<button type="submit">add task\</button> \</form> ); }); создание компонентов списка задач и элементов в src/components/tasklist tsx , отобразите список задач import { component$ } from '@builder io/qwik'; import taskitem from ' /taskitem'; interface task { id string; title string; description string; completed boolean; } interface tasklistprops { tasks task\[]; ontaskschange$ () => void; } export default component$((props tasklistprops) => { return ( \<div> {props tasks length === 0 ? ( \<p>no tasks available\</p> ) ( props tasks map(task => ( \<taskitem key={task id} task={task} ontaskschange$={props ontaskschange$} /> )) )} \</div> ); }); в src/components/taskitem tsx , создайте компонент для отдельных задач с действиями для переключения завершения или удаления задачи import { component$, $ } from '@builder io/qwik'; import parse from ' /lib/parse js'; interface task { id string; title string; description string; completed boolean; } interface taskitemprops { task task; ontaskschange$ () => void; } export default component$((props taskitemprops) => { const handletoggle = $(async () => { try { const query = new parse query("task"); const tasktoupdate = await query get(props task id); tasktoupdate set("completed", !props task completed); await tasktoupdate save(); props ontaskschange$(); } catch (error) { console error("error updating task ", error); } }); const handledelete = $(async () => { try { const query = new parse query("task"); const tasktodelete = await query get(props task id); await tasktodelete destroy(); props ontaskschange$(); } catch (error) { console error("error deleting task ", error); } }); return ( \<div class={`task item ${props task completed ? "completed" ""}`}> \<h3>{props task title}\</h3> \<p>{props task description}\</p> \<button onclick$={handletoggle}> {props task completed ? "undo" "complete"} \</button> \<button onclick$={handledelete}>delete\</button> \</div> ); }); стилизация вашего приложения создайте файл src/global css для добавления базовой стилизации / src/global css / container { max width 600px; margin 40px auto; padding 0 20px; text align center; font family sans serif; } container h1 { margin bottom 20px; } form { display flex; flex direction column; align items center; gap 10px; margin bottom 20px; } form input\[type="text"] { width 80%; max width 400px; padding 8px; box sizing border box; font size 1rem; } form button { padding 8px 16px; cursor pointer; font size 1rem; border none; background color #eaeaea; transition background color 0 2s ease; } form button\ hover { background color #ccc; } container p { font size 1rem; } task item { display flex; flex direction column; align items center; justify content center; gap 12px; border 1px solid #ccc; border radius 6px; padding 15px; margin 10px 0; background color #fafafa; text align center; transition background color 0 2s ease; } task item completed h3, task item completed p { text decoration line through; color #888; } task item h3 { margin 0; font size 1 1rem; } task item p { margin 0; font size 1rem; } task item button { padding 6px 12px; border none; background color #eaeaea; cursor pointer; font size 0 9rem; } task item button\ hover { background color #ccc; } @media (min width 600px) { task item { flex direction row; } } this is an example text импортируйте глобальные стили в ваш корневой файл (например, src/root tsx ) import " /global css"; завершение пользовательского интерфейса ваше приложение qwik to do list теперь имеет динамичный интерфейс, интегрированный с back4app и с пользовательским стилем приложение позволяет вам добавлять, отображать, обновлять и удалять задачи, обеспечивая при этом плавное взаимодействие между фронтендом и бэкендом далее вы развернете ваше приложение qwik, используя платформу веб развертывания back4app развертывание фронтенда на back4app web deployment back4app web deployment предоставляет полностью управляемую, контейнеризованную среду для хостинга ваших приложений с развертываниями на основе docker вы можете упаковать ваше приложение qwik и развернуть его без проблем добавьте адаптер сервера express qwik позволяет вам настраивать адаптеры развертывания для конкретных целей мы добавим адаптер express, чтобы обслуживать ваш проект в производственной среде установите адаптер npm run qwik add затем выберите адаптер node js express server и подтвердите установку это обновит ваш readme и добавит новые скрипты развертывания в ваш package json обновите скрипт запуска откройте package json и измените скрипт запуска на "start" "node server/entry express" при необходимости, оставьте отдельный скрипт разработки это гарантирует, что ваш проект использует express для обслуживания производственной сборки настройка qwik для производства создайте ваш готовый к производству сайт qwik с помощью npm run build создание dockerfile для вашего приложения создайте dockerfile в корне проекта, чтобы контейнеризировать ваше приложение qwik # build stage from node\ lts alpine as builder user node workdir /home/node copy package json run npm ci copy chown=node\ node run npm run build \# final run stage from node\ lts alpine as runner env node env=production user node workdir /home/node copy from=builder chown=node\ node /home/node/package json copy from=builder chown=node\ node /home/node/node modules /node modules copy from=builder chown=node\ node /home/node/dist /dist copy from=builder chown=node\ node /home/node/server /server arg port expose ${port 3000} cmd \["node", "server/entry express"] публикация на github и развертывание через back4app отправьте ваш проект на github git init git add git commit m "initial commit for back4app deployment" git branch m main git remote add origin \<your github repository url> git push u origin main затем разверните с помощью развертывания в вебе back4app войдите в back4app web deployment https //www back4app com/containers нажмите "создать новое приложение" , укажите имя и выберите github repository авторизуйте back4app для доступа к вашему репозиторию и выберите репозиторий вашего проекта qwik выберите dockerfile deployment и подтвердите настройки сборки нажмите "развернуть" для начала процесса сборки мониторинг и управление развертываниями после развертывания используйте панель управления back4app для просмотр журналов для устранения неполадок мониторинг производительности контейнера и использования ресурсов запуск повторных развертываний при новых коммитах настройка пользовательских доменов при необходимости тестирование и отладка вашего приложения после развертывания тщательно протестируйте ваше приложение qwik проверьте подключение к api откройте консоль разработчика вашего браузера (f12 → сеть), чтобы проверить вызовы api во время выполнения задач добавление и получение задач используйте интерфейс для добавления задач, затем обновите страницу, чтобы подтвердить сохранение данных в браузере базы данных back4app тестирование операций crud убедитесь, что отметка задач как завершенных и удаление отражаются корректно на сервере обработка крайних случаев проверьте вводимые данные формы и смоделируйте медленные сетевые условия с помощью инструментов разработчика если возникнут проблемы, просмотрите журналы back4app или дважды проверьте вашу конфигурацию api лучшие практики использования сервисов back4app улучшите производительность и безопасность вашего приложения, следуя этим рекомендациям оптимизация вызовов api используйте пакетные запросы для нескольких операций и запрашивайте только необходимые поля защита конфиденциальных данных храните учетные данные, такие как идентификатор приложения и ключ javascript, в переменных окружения в qwik создайте env файл vite parse app id=your app id vite parse js key=your js key включение авто масштабирования активируйте авто масштабирование в развертывании back4app для управления высоким трафиком улучшение безопасности ограничьте разрешения на уровне классов (clp), чтобы контролировать изменения данных и настраивайте acl по мере необходимости использование облачного кода перенесите сложную логику в облачный код для повышения производительности и уменьшения воздействия api заключение теперь вы создали полнофункциональное приложение список дел, используя qwik для фронтенда и надежные бэкенд сервисы back4app этот учебник провел вас через настройку проекта qwik, интеграцию parse sdk и развертывание вашего сайта с использованием контейнеризованных рабочих процессов на back4app по мере продолжения разработки рассмотрите возможность добавления таких функций, как расширенная аутентификация пользователей, обновления в реальном времени и интеграции с третьими сторонами для получения дополнительной информации и поддержки обратитесь к документации back4app https //www back4app com/docs