Quickstarters
How to Build a Qwik Frontend and Connect It to a Backend?
32 min
en este tutorial, construirás una aplicación de lista de tareas utilizando qwik y la conectarás a un backend robusto impulsado por back4app esta guía está diseñada para desarrolladores que desean aprovechar la reanudabilidad y las capacidades de carga diferida de qwik mientras integran operaciones crud esenciales (crear, leer, actualizar, eliminar) con un backend gestionado al final, tendrás una aplicación completamente funcional que demuestra cómo combinar un frontend moderno de qwik con los servicios de backend confiables de back4app construir una aplicación de pila completa puede ser un desafío porque implica la configuración del backend, la gestión de bases de datos, la autenticación y el despliegue para simplificar estas tareas, utilizamos back4app— un backend como servicio escalable (baas) —para que puedas concentrarte en construir tu aplicación qwik mientras se encarga de la hospedaje, bases de datos y apis back4app ofrece un conjunto completo de servicios de backend, que incluye una base de datos nosql lista para usar, autenticación, cloud code para lógica del lado del servidor y suaves integraciones de sdk su soporte de despliegue en contenedores lo convierte en una excelente opción para aplicaciones modernas de pila completa con estas herramientas al alcance de tu mano, puedes desarrollar y desplegar aplicaciones rápidamente sin la carga de gestionar la infraestructura del servidor conclusiones clave siguiendo este tutorial aprenderás a inicializar un proyecto moderno de qwik integrar un servicio backend para gestionar los datos de tu aplicación implementar operaciones crud esenciales para una interfaz de usuario interactiva desplegar una aplicación de lista de tareas completamente funcional utilizando flujos de trabajo en contenedores en back4app requisitos previos antes de comenzar, asegúrate de tener lo siguiente node js y npm instala la última versión lts desde nodejs org https //nodejs org/ y verifica con node v y npm v conocimientos básicos de qwik se recomienda familiaridad con los componentes de qwik, señales (usando usesignal ), y su concepto de reanudación si eres nuevo en qwik, revisa primero su documentación una cuenta de back4app regístrate en back4app https //www back4app com/ para configurar y gestionar tus servicios backend con estos requisitos previos en su lugar, estás listo para configurar tu proyecto y comenzar a construir configuración del proyecto comienza configurando tu entorno de desarrollo local e inicializando tu proyecto qwik confirma que node js (versión lts) está instalado node v npm v crea un nuevo proyecto qwik usando la cli de qwik ejecuta el siguiente comando npm create qwik\@latest responde a las preguntas que la cli te proporcionará nombra el proyecto todo app o reemplázalo con el nombre que prefieras cambia a tu directorio de proyecto cd todo app inicia el servidor de desarrollo para verificar tu configuración npm start tu aplicación qwik debería estar corriendo localmente ahora abre la url proporcionada en tu navegador para confirmarlo a continuación, configurarás tu backend en back4app para gestionar el almacenamiento de datos y las interacciones con la api creando el backend de todo back4app ofrece un servicio de backend completamente gestionado impulsado por parse este servicio proporciona una base de datos nosql, autenticación, cloud code y apis autogeneradas desde el principio esta sección te guía a través de la creación de un task modelo de datos para almacenar tus elementos de lista de tareas y vincularlo con tu frontend de qwik configurando tu aplicación de backend inicia sesión en tu panel de control de back4app https //www back4app com/ y haz clic en "crear una nueva aplicación " nombra tu aplicación (por ejemplo, todoqwikapp ) y selecciona nodejs/parse como el tipo de backend una vez creada, navega a "base de datos" > "navegador" haz clic en "crear una clase" y elige "personalizada" nombra la clase task y establece los permisos de nivel de clase para permitir lectura y escritura pública (puedes refinar estos ajustes más tarde) en la task clase, agrega los siguientes campos título (string) – el título de la tarea descripción (string) – detalles sobre la tarea completado (boolean) – indica si la tarea está completada fechadevencimiento (fecha) – la fecha límite para la tarea haz clic en "guardar" para finalizar tu esquema integrando back4app con qwik integra back4app en tu proyecto qwik usando el parse javascript sdk instala el sdk a través de npm npm install parse configura el sdk inicializándolo con tu id de aplicación y clave de javascript recupera estas credenciales desde tu panel de control de back4app en configuración de la app > seguridad y claves crea un archivo de configuración (por ejemplo, src/lib/parse js ) y agrega lo siguiente 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; ahora puedes importar esta configuración en tus componentes y rutas de qwik para interactuar con tu backend desarrollando el frontend con qwik ahora que tu backend está conectado, construye la interfaz de usuario para tu aplicación de lista de tareas utilizando qwik crearás componentes para agregar, mostrar, actualizar y eliminar tareas mientras gestionas el estado con señales de qwik organizando tus componentes tu aplicación incluirá los siguientes componentes clave taskform tsx – un componente para manejar la adición de nuevas tareas tasklist tsx – un componente para mostrar todas las tareas y proporcionar controles para marcar tareas como completas o eliminarlas taskitem tsx – un componente que representa una tarea individual con acciones para alternar la finalización o eliminarla crea una components carpeta dentro de src y agrega estos archivos mkdir src/components touch src/components/taskform tsx src/components/tasklist tsx src/components/taskitem tsx gestionando el estado con señales de qwik utilice el usesignal de qwik para la gestión del estado reactivo en su página principal (por ejemplo, src/routes/index tsx ), configure el estado y la obtención de datos de la siguiente manera 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> ); }); construyendo el componente del formulario de tareas en src/components/taskform tsx , crea un componente de formulario para agregar tareas usa las señales reactivas de qwik para las entradas del formulario 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> ); }); construyendo la lista de tareas y los componentes de ítems en src/components/tasklist tsx , renderiza la lista de tareas 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> ); }); en src/components/taskitem tsx , crea un componente para tareas individuales con acciones para alternar la finalización o eliminar la tarea 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> ); }); estilizando tu aplicación crea un src/global css archivo para agregar estilos básicos / 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; } } importa los estilos globales en tu archivo raíz (por ejemplo, src/root tsx ) import " /global css"; finalizando la interfaz de usuario tu aplicación qwik to do list ahora cuenta con un frontend dinámico integrado con back4app y un estilo personalizado la aplicación te permite agregar, mostrar, actualizar y eliminar tareas mientras asegura una comunicación fluida entre el frontend y el backend a continuación, desplegarás tu aplicación qwik utilizando la plataforma de despliegue web de back4app desplegando el frontend en back4app web deployment back4app web deployment proporciona un entorno completamente gestionado y containerizado para alojar tus aplicaciones con despliegues basados en docker, puedes empaquetar tu aplicación qwik y desplegarla sin problemas agregar el adaptador del servidor express qwik te permite configurar adaptadores de despliegue para objetivos específicos agregaremos el adaptador express para servir tu proyecto en producción instala el adaptador npm run qwik add luego selecciona adaptador servidor express de node js y confirma la instalación esto actualiza tu readme y agrega nuevos scripts de despliegue en tu package json actualiza el script de inicio abre package json y cambia el script de inicio a "start" "node server/entry express" opcionalmente, mantén un script de desarrollo separado si es necesario esto asegura que tu proyecto use express para servir la versión de producción configurando qwik para producción construye tu sitio qwik listo para producción con npm run build creando un dockerfile para tu aplicación crea un dockerfile en la raíz del proyecto para contenerizar tu aplicación 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"] subiendo a github y desplegando a través de back4app sube tu proyecto a 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 luego, despliega usando el despliegue web de back4app inicie sesión en back4app web deployment https //www back4app com/containers haga clic en "crear nueva aplicación" , proporcione un nombre y seleccione repositorio de github autorice a back4app a acceder a su repositorio y seleccione su repositorio del proyecto qwik elija despliegue de dockerfile y confirme la configuración de la construcción haga clic en "desplegar" para iniciar el proceso de construcción monitoreo y gestión de despliegues después del despliegue, use el panel de control de back4app para ver registros para solucionar problemas monitorear el rendimiento del contenedor y el uso de recursos activar redeployments cuando se envían nuevos commits configurar dominios personalizados si es necesario pruebas y depuración de su aplicación una vez desplegada, prueba a fondo tu aplicación qwik verificar la conectividad de la api abre la consola de desarrollador de tu navegador (f12 → red) para verificar las llamadas a la api durante las operaciones de tarea agregar y recuperar tareas usa la interfaz de usuario para agregar tareas, luego actualiza para confirmar la persistencia de datos en el navegador de la base de datos de back4app probar operaciones crud asegúrate de que marcar tareas como completas y la eliminación se reflejen correctamente en el backend manejar casos extremos valida las entradas del formulario y simula condiciones de red lentas utilizando herramientas de desarrollador si surgen problemas, revisa los registros de back4app o verifica nuevamente tu configuración de api mejores prácticas para usar los servicios de back4app mejora el rendimiento y la seguridad de tu aplicación al optimizar las llamadas a la api usa solicitudes por lotes para múltiples operaciones y consulta solo los campos necesarios asegurar datos sensibles almacena credenciales como el id de la aplicación y la clave de javascript en variables de entorno en qwik, crea un env archivo vite parse app id=your app id vite parse js key=your js key habilitando la auto escala activa la auto escalabilidad en el despliegue web de back4app para gestionar el alto tráfico mejorando la seguridad restringe los permisos a nivel de clase (clps) para controlar las modificaciones de datos y configura acls según sea necesario utilizando cloud code descarga la lógica compleja a cloud code para mejorar el rendimiento y reducir la exposición de la api conclusión ahora has construido una aplicación de lista de tareas de pila completa utilizando qwik para el frontend y los robustos servicios backend de back4app este tutorial te guió a través de la configuración de un proyecto qwik, la integración del sdk de parse y el despliegue de tu sitio utilizando flujos de trabajo en contenedores en back4app a medida que continúes desarrollando, considera agregar características como autenticación avanzada de usuarios, actualizaciones en tiempo real e integraciones de terceros para más información y soporte, consulta la documentación de back4app https //www back4app com/docs