داده و کنترلگرهای مسیر
استقرارها را از app/api ارائه کنید، در یک صفحه واکشی کنید و استقرارهای جدید را ارسال کنید.
در این فصل
- کنترلگر مسیر
- دریافت داده در صفحه
- حالتهای بارگذاری و خطا
- ارسال جریانی
Acme Deploys به دادههای واقعی نیاز دارد. کنترلگرهای مسیر در کنار صفحههای شما در app/ قرار میگیرند، از APIهای وب Request و Response استفاده میکنند و با دستورهای text dev و text start اجرا میشوند. مبدأ آنها با برنامه یکسان است، پس درخواستها به تنظیم CORS نیاز ندارند.
کنترلگر مسیر
افزودهشده: import { DEPLOYMENTS, createDeployment } from "../../../lib/deployments";افزودهشده: افزودهشده: export function GET(): Response {افزودهشده: return Response.json(DEPLOYMENTS);افزودهشده: }افزودهشده: افزودهشده: export async function POST(req: Request): Promise<Response> {افزودهشده: const deployment = createDeployment(await req.json());افزودهشده: return Response.json(deployment, { status: 201 });افزودهشده: }هنگامی که دستور text dev در حال اجرا است، آن را از پرامپت کنسول فراخوانی کنید:
await (await fetch("/api/deployments")).json()دریافت داده در صفحه
دادهها را در یک افکت دریافت کنید و تا رسیدن دادهها یک <Spinner> نمایش دهید. کلید r دادهها را دوباره دریافت میکند؛ کلید n یک استقرار جدید ارسال میکند که با وضعیت در حال ساخت نمایش داده میشود و پس از پایان ساخت به وضعیت آماده تغییر میکند.
حذفشده: import { DEPLOYMENTS } from "../../lib/deployments";افزودهشده: import { useEffect, useState } from "react";افزودهشده: import { Spinner, useInput } from "@textjs/app";افزودهشده: import type { Deployment } from "../../lib/deployments";export default function DeploymentsPage() {افزودهشده: const [rows, setRows] = useState<Deployment[]>([]);افزودهشده: const [loading, setLoading] = useState(true);افزودهشده: افزودهشده: const refetch = async () => {افزودهشده: setLoading(true);افزودهشده: setRows(await (await fetch("/api/deployments")).json());افزودهشده: setLoading(false);افزودهشده: };افزودهشده: useEffect(() => void refetch(), []);افزودهشده: افزودهشده: useInput((e) => {افزودهشده: if (e.input === "r") void refetch();افزودهشده: if (e.input === "n") void fetch("/api/deployments", { method: "POST", body: "{}" }).then(refetch);افزودهشده: });افزودهشده: افزودهشده: if (loading) return <Spinner label="Loading deployments…" />; return ( <Box className="flex-col">حذفشده: {DEPLOYMENTS.map((d) => (افزودهشده: {rows.map((d) => ( <Box key={d.id} className="flex-row h-1 gap-2">افزودهشده: <Status status={d.status} /> …حالتهای بارگذاری و خطا
بهجای مدیریت دستی وضعیت loading، فایل loading.tsx در کنار صفحه هنگام تعلیق آن نمایش داده میشود و فایل error.tsx هر خطایی را که صفحه پرتاب کند میگیرد. هر دو کامپوننتهای معمولی هستند:
import { Spinner } from "@textjs/app";export default function Loading() { return <Spinner label="Loading deployments…" />;}ارسال جریانی
کنترلگرها میتوانند یک ReadableStream برگردانند؛ گزارشهای ساخت به همین روش خطبهخط به داشبورد ارسال میشوند. برای رویدادهای ارسالی از سرور و پروکسی کردن یک دیمن محلی، به کنترلگرهای مسیر مراجعه کنید.
امتحان کنید
این Acme Deploys در پایان فصل است که در DevTools اجرا میشود. روی پد کلیک کنید، سپس از کلیدهای زیر استفاده کنید.
باز کردن کنسول
برنامه در DevTools رندر میشود.ابتدا گزینهٔ «نمایش قابلیتها برای توسعهدهندگان وب» را در تنظیمات Safari ← پیشرفته فعال کنید. سپس اینجا کلیک کنید و r را فشار دهید.
باز کردن در رایانه
این برنامه در کنسول DevTools رندر میشود که به مرورگر دسکتاپ نیاز دارد.
آزمون
2 پرسشبرای تکمیل فصل به همهٔ پرسشها پاسخ دهید.