Spec-Zone.ru › Deno 2

Создайте приложение React с использованием шаблона-заготовки

React — это наиболее широко используемая JavaScript-библиотека для фронтенда.

В этом руководстве мы создадим простое приложение React с использованием Deno. Приложение будет отображать список динозавров. При нажатии на динозавра вы будете перенаправлены на страницу динозавра с более подробной информацией. Вы можете увидеть репозиторий готового приложения на GitHub.

demo of the app

В этом руководстве будет использоваться Vite для локального запуска приложения. Vite — это инструмент сборки и сервер разработки для современных веб-проектов. Он хорошо сочетается с React и Deno, используя ES-модули и позволяя вам импортировать компоненты React напрямую.

Шаблон-заготовка

Мы подготовили шаблон-заготовку для вашего использования. Это позволит создать базовое приложение-заготовку с React, Vite и файлом deno.json для настройки вашего проекта. Перейдите в репозиторий GitHub по адресу https://github.com/denoland/react-vite-ts-template и нажмите кнопку "Использовать этот шаблон", чтобы создать новый репозиторий.

После создания нового репозитория по шаблону клонируйте его на свой локальный компьютер и перейдите в директорию проекта.

Клонирование репозитория локально

git clone https://github.com/your-username/your-repo-name.git
cd your-repo-name

Установка зависимостей

Установите зависимости проекта, выполнив команду:

deno install

Запуск сервера разработки

Теперь вы можете запустить ваше новое приложение React, выполнив команду:

deno run dev

Это запустит сервер Vite. Щелкните ссылку на вывод для localhost, чтобы увидеть ваше приложение в браузере.

О шаблоне

Клонированный репозиторий шаблона содержит базовое приложение React. Приложение использует Vite в качестве сервера разработки и предоставляет сервер статических файлов, созданный с помощью oak, который будет обслуживать готовое приложение при развертывании. Приложение React находится в папке client, а сервер back-end — в папке server.

Файл deno.json используется для настройки проекта и определения разрешений, необходимых для запуска приложения. Он содержит поле tasks, которое определяет задачи, которые можно выполнить с помощью deno run. В нем есть задача dev, которая запускает сервер Vite, задача build, которая собирает приложение с помощью Vite, и задача serve, которая запускает сервер back-end для обслуживания собранного приложения.

Добавление back-end API

Мы добавим API в сервер, предоставленный шаблоном. Именно здесь мы будем получать данные о динозаврах.

В каталоге server вашего нового проекта создайте папку api. В этой папке создайте файл data.json, который будет содержать данные о динозаврах в виде жестко закодированных данных.

Скопируйте и вставьте этот файл JSON в файл api/data.json. (Если бы вы создавали реальное приложение, вы, вероятно, получали бы эти данные из базы данных или внешнего API.)

Мы собираемся разработать несколько маршрутов API, которые будут возвращать информацию о динозаврах на сервер, который поставляется с шаблоном. Нам потребуется cors middleware для включения CORS.

Используйте команду deno install для добавления зависимости cors в ваш проект:

deno install jsr:@tajpouria/cors

Далее, обновите server/main.ts для импорта необходимых модулей и создания нового экземпляра Router для определения некоторых маршрутов:

main.ts
import { Application } from "jsr:@oak/oak/application";
import { Router } from "jsr:@oak/oak/router";
import { oakCors } from "@tajpouria/cors";
import routeStaticFilesFrom from "./util/routeStaticFilesFrom.ts";
import data from "./api/data.json" with { type: "json" };

export const app = new Application();
const router = new Router();

После этого в том же файле определим два маршрута. Один на /api/dinosaurs для возврата всех динозавров и /api/dinosaurs/:dinosaur для возврата конкретного динозавра на основе имени в URL:

main.ts
router.get("/api/dinosaurs", (context) => {
  context.response.body = data;
});

router.get("/api/dinosaurs/:dinosaur", (context) => {
  if (!context?.params?.dinosaur) {
    context.response.body = "No dinosaur name provided.";
  }

  const dinosaur = data.find((item) =>
    item.name.toLowerCase() === context.params.dinosaur.toLowerCase()
  );

  context.response.body = dinosaur ?? "No dinosaur found.";
});

В конце того же файла подключим только что определенные маршруты к приложению. Также необходимо включить сервер статических файлов из шаблона, и, наконец, запустим сервер, слушающий порт 8000:

main.ts
app.use(oakCors());
app.use(router.routes());
app.use(router.allowedMethods());
app.use(routeStaticFilesFrom([
  `${Deno.cwd()}/client/dist`,
  `${Deno.cwd()}/client/public`,
]));

if (import.meta.main) {
  console.log("Server listening on port http://localhost:8000");
  await app.listen({ port: 8000 });
}

Вы можете запустить сервер API с помощью команды deno run --allow-env --allow-net server/main.ts. Мы создадим задачу для выполнения этой команды в фоновом режиме и обновим задачу разработки для запуска как приложения React, так и сервера API.

В файле package.json обновите поле scripts следующим образом:

deno.json
{
 "tasks": {
+   "dev": "deno run -A --node-modules-dir=auto npm:vite & deno run server:start",
   "build": "deno run -A --node-modules-dir=auto npm:vite build",
   "server:start": "deno run -A --node-modules-dir --watch ./server/main.ts",
   "serve": "deno run build && deno run server:start"
}

Если вы запустите deno run dev сейчас и перейдете по адресу localhost:8000/api/dinosaurs в своем браузере, вы увидите JSON-ответ со всеми динозаврами.

Обновление точки входа

Точка входа для приложения React находится в файле client/src/main.tsx. Наша будет очень простой:

main.tsx
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import "./index.css";
import App from "./App.tsx";

createRoot(document.getElementById("root")!).render(
  <StrictMode><App /></StrictMode>,
);

Добавление маршрутизатора

Приложение будет иметь два маршрута: / и /:dinosaur.

Мы будем использовать react-router-dom для построения логики маршрутизации, поэтому нам нужно добавить зависимость react-router-dom в ваш проект. В корне проекта выполните команду:

deno install npm:react-router-dom

Обновите файл /src/App.tsx для импорта и использования компонента BrowserRouter из react-router-dom и определения двух маршрутов:

App.tsx
import { BrowserRouter, Route, Routes } from "react-router-dom";
import Index from "./pages/index.tsx";
import Dinosaur from "./pages/Dinosaur.tsx";
import "./App.css";

function App() {
  return (
    <BrowserRouter><Routes><Route path="/" element={<Index />} /><Route path="/:selectedDinosaur" element={<Dinosaur />} /></Routes></BrowserRouter>
  );
}

export default App;

Прокси для переадресации запросов API

Vite будет обслуживать приложение на порту 3000, а наш API работает на порту 8000. Поэтому нам нужно настроить прокси, чтобы маршрутизатор мог обращаться к путям api/. Добавьте настройку прокси в vite.config.ts.

vite.config.ts
export default defineConfig({
 root: "./client",
 server: {
   port: 3000,
+   proxy: {
+     "/api": {
+       target: "http://localhost:8000",
+       changeOrigin: true,
+     },
+   },

Создание страниц

Мы создадим две страницы: Index и Dinosaur. На странице Index будет отображаться список всех динозавров, а на странице Dinosaur — подробная информация о конкретном динозавре.

Создайте папку pages в каталоге src и внутри нее создайте два файла: index.tsx и Dinosaur.tsx.

Типы

Обе страницы будут использовать тип Dino для описания формы данных, которые они ожидают от API. Поэтому создадим файл types.ts в каталоге src:

types.ts
export type Dino = { name: string; description: string };

index.tsx

На этой странице будет извлекаться список динозавров из API и отображаться в виде ссылок:

index.tsx
import { useEffect, useState } from "react";
import { Link } from "react-router-dom";
import { Dino } from "../types.ts";

export default function Index() {
  const [dinosaurs, setDinosaurs] = useState<Dino[]>([]);

  useEffect(() => {
    (async () => {
      const response = await fetch(`/api/dinosaurs/`);
      const allDinosaurs = await response.json() as Dino[];
      setDinosaurs(allDinosaurs);
    })();
  }, []);

  return (
    <main><h1>Welcome to the Dinosaur app</h1><p>Click on a dinosaur below to learn more.</p>{dinosaurs.map((dinosaur: Dino) => {
        return (
          <Link
            to={`/${dinosaur.name.toLowerCase()}`}
            key={dinosaur.name}
            className="dinosaur"
          >{dinosaur.name}</Link>
        );
      })}</main>
  );
}

Dinosaur.tsx

На этой странице будет извлекаться информация о конкретном динозавре из API и отображаться в абзаце:

Dinosaur.tsx
import { useEffect, useState } from "react";
import { Link, useParams } from "react-router-dom";
import { Dino } from "../types";

export default function Dinosaur() {
  const { selectedDinosaur } = useParams();
  const [dinosaur, setDino] = useState<Dino>({ name: "", description: "" });

  useEffect(() => {
    (async () => {
      const resp = await fetch(`/api/dinosaurs/${selectedDinosaur}`);
      const dino = await resp.json() as Dino;
      setDino(dino);
    })();
  }, [selectedDinosaur]);

  return (
    <div><h1>{dinosaur.name}</h1><p>{dinosaur.description}</p><Link to="/">🠠 Back to all dinosaurs</Link></div>
  );
}

Стиль списка динозавров

Поскольку мы отображаем список динозавров на главной странице, давайте немного отформатируем его. Добавьте следующее в конец файла src/App.css, чтобы отобразить список динозавров упорядоченно:

src/App.css
.dinosaur {
  display: block;
}

Запуск приложения

Для запуска приложения используйте ранее настроенную задачу.

deno run dev

Перейдите по ссылке на локальный сервер Vite в вашем браузере (localhost:5173), и вы увидите отображаемый список динозавров, по которому можно переходить к каждой записи.

demo of the app

Сборка и развертывание

Клонированный шаблон содержит задачу serve, которая собирает приложение и запускает его с сервером back-end. Выполните следующую команду для сборки и запуска приложения:

deno run serve

Если вы перейдете по адресу localhost:8000 в своем браузере, вы должны увидеть работающее приложение!

Вы можете развернуть это приложение на своем любимом облачном провайдере. Мы рекомендуем использовать Deno Deploy для простого и удобного развертывания.

Для развертывания в Deno Deploy перейдите на панель управления Deno Deploy и создайте новый проект. Затем вы можете развернуть приложение, подключившись к своему репозиторию GitHub и выбрав нужную ветку.

Дайте проекту имя и убедитесь, что build step установлено в значение deno run build, а Entrypoint равно ./server.main.ts.

Нажмите кнопку Deploy Project и ваше приложение будет доступно онлайн!

🦕 Теперь вы можете создать и разрабатывать приложения React с использованием Vite и Deno! Вы готовы создавать быстродействующие веб-приложения. Надеемся, вам понравится изучение этих передовых инструментов, и мы с нетерпением ждём, что вы создадите!

© 2018–2024 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/tutorials/how_to_with_npm/react

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API