Spec-Zone.ru › Deno 2

Создайте приложение Vue.js

Vue.js — это прогрессивный фреймворк JavaScript для фронтенда. Он предоставляет инструменты и возможности для создания динамичных и интерактивных пользовательских интерфейсов.

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

The Vue.js app in action

Создайте приложение Vue.js с Vite и Deno

Мы будем использовать Vite для создания базового приложения Vue.js. В терминале выполните следующую команду для создания нового приложения .js с Vite:

deno run -A npm:create-vite

При запросе присвойте вашему приложению имя и выберите Vue из предложенных фреймворков и TypeScript в качестве варианта.

После создания, cd в ваш новый проект и выполните следующую команду для установки зависимостей:

deno install

Затем выполните следующую команду для запуска вашего нового приложения Vue.js:

deno task dev

Deno запустит dev задачу из файла package.json, которая запустит сервер Vite. Щелкните ссылку вывода на localhost, чтобы увидеть ваше приложение в браузере.

Добавить бэкенд

Следующий шаг — добавление бэкенд-API. Мы создадим очень простой API, который возвращает информацию о динозаврах.

В корне вашего нового проекта vite создайте папку api. В этой папке создайте файл main.ts, который запустит сервер, и файл data.json, в котором мы разместим жестко закодированные данные.

Скопируйте и вставьте этот JSON-файл в api/data.json.

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

Используйте команду deno add для добавления необходимых зависимостей в свой проект:

deno add jsr:@oak/oak jsr:@tajpouria/cors

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

main.ts
import { Application, Router } from "@oak/oak";
import { oakCors } from "@tajpouria/cors";
import data from "./data.json" with { type: "json" };

const router = new Router();

После этого в том же файле мы определим три маршрута. Первый маршрут по адресу / вернет строку Welcome to the dinosaur API, затем мы настроим /dinosaurs для возвращения всех динозавров, а затем /dinosaurs/:dinosaur для возвращения конкретного динозавра на основе имени в URL:

main.ts
router
  .get("/", (context) => {
    context.response.body = "Welcome to dinosaur API!";
  })
  .get("/dinosaurs", (context) => {
    context.response.body = data;
  })
  .get("/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 ? dinosaur : "No dinosaur found.";
  });

Наконец, внизу того же файла создайте новый Application экземпляр и подключите только что определенные маршруты к приложению с помощью app.use(router.routes()) и запустите сервер, прослушивая порт 8000:

main.ts
const app = new Application();
app.use(oakCors());
app.use(router.routes());
app.use(router.allowedMethods());

await app.listen({ port: 8000 });

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

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

{
  "scripts": {
    "dev": "deno task dev:api & deno task dev:vite",
    "dev:api": "deno run --allow-env --allow-net api/main.ts",
    "dev:vite": "deno run -A npm:vite",
    // ...
}

Теперь, если вы выполните deno task dev и посетите localhost:8000, в браузере вы должны увидеть текст Welcome to dinosaur API!, а если вы посетите localhost:8000/dinosaurs, вы должны увидеть JSON-ответ со всеми динозаврами.

Построить фронтенд

Точка входа и маршрутизация

В каталоге src вы найдете файл main.ts. Это точка входа в приложение Vue.js. Наше приложение будет иметь несколько маршрутов, поэтому нам понадобится маршрутизатор для выполнения клиентской маршрутизации. Для этого мы будем использовать официальный Vue Router.

Обновите src/main.ts для импорта и использования маршрутизатора:

import { createApp } from "vue";
import router from "./router/index.ts";

import "./style.css";
import App from "./App.vue";

createApp(App)
  .use(router)
  .mount("#app");

Добавьте модуль Vue Router в проект с помощью deno add:

deno add npm:vue-router

Далее создайте каталог router в каталоге src. В нем создайте файл index.ts со следующим содержимым:

router/index.ts
import { createRouter, createWebHistory } from "vue-router";
import HomePage from "../components/HomePage.vue";
import Dinosaur from "../components/Dinosaur.vue";

export default createRouter({
  history: createWebHistory("/"),
  routes: [
    {
      path: "/",
      name: "Home",
      component: HomePage,
    },
    {
      path: "/:dinosaur",
      name: "Dinosaur",
      component: Dinosaur,
      props: true,
    },
  ],
});

Это настроит маршрутизатор с двумя маршрутами: / и /:dinosaur. Компонент HomePage будет отображаться по адресу /, а компонент Dinosaur будет отображаться по адресу /:dinosaur.

Наконец, вы можете удалить весь код из файла src/App.vue и обновить его, чтобы он содержал только компонент <RouterView>:

App.vue
<template>
  <RouterView />
</template>;

Компоненты

Vue.js разбивает пользовательский интерфейс фронтенда на компоненты. Каждый компонент — это повторно используемый фрагмент кода. Мы создадим три компонента: один для домашней страницы, один для списка динозавров и один для отдельного динозавра.

Каждый файл компонента разделен на три части: <script>, <template>, и <style>. Тег <script> содержит логику JavaScript для компонента, тег <template> содержит HTML, а тег <style> содержит CSS.

В каталоге /src/components создайте три новых файла: HomePage.vue, Dinosaurs.vue, и Dinosaur.vue.

Компонент Dinosaurs

Компонент Dinosaurs получит список динозавров из ранее созданного API и отобразит их в виде ссылок с использованием RouterLink компонента из Vue Router. (Так как мы создаем проект TypeScript, не забудьте указать атрибут lang="ts" в теге script.) Добавьте следующий код в файл Dinosaurs.vue:

Dinosaurs.vue
<script lang="ts">
import { defineComponent } from 'vue';

export default defineComponent({
    async setup() {
        const res = await fetch("http://localhost:8000/dinosaurs")
        const dinosaurs = await res.json() as Dinosaur[];
        return { dinosaurs };
    }
});
</script>

<template>
    <div v-for="dinosaur in dinosaurs" :key="dinosaur.name">
        <RouterLink :to="{ name: 'Dinosaur', params: { dinosaur: `${dinosaur.name.toLowerCase()}` } }" >
            {{ dinosaur.name }}
        </RouterLink>
    </div>
</template>

Этот код использует директиву Vue.js v-for для перебора массива dinosaurs и отображения каждого динозавра в виде компонента RouterLink. Атрибут :to компонента RouterLink определяет маршрут для перехода при щелчке по ссылке, а атрибут :key используется для уникальной идентификации каждого динозавра.

Компонент домашней страницы

Домашняя страница будет содержать заголовок, а затем отображать компонент Dinosaurs. Добавьте следующий код в файл HomePage.vue:

HomePage.vue
<script setup lang="ts">
import Dinosaurs from './Dinosaurs.vue';
</script>
<template>
  <h1>Welcome to the Dinosaur App! 🦕</h1>
  <p>Click on a dinosaur to learn more about them</p>
  <Suspense>
    <template #default>
      <Dinosaurs />
    </template>
    <template #fallback>
      <div>Loading...</div>
    </template>
  </Suspense>
</template>

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

Компонент Dinosaur

Компонент Dinosaur отобразит имя и описание конкретного динозавра, а также ссылку для возвращения к полному списку.

Сначала мы настроим некоторые типы данных для извлекаемых данных. Создайте файл types.ts в каталоге src и добавьте следующий код:

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

type ComponentData = {
  dinosaurDetails: null | Dinosaur;
};

Затем обновите файл Dinosaur.vue:

Dinosaur.vue
<script lang="ts">
import { defineComponent } from 'vue';

export default defineComponent({
    props: { dinosaur: String },
    data(): ComponentData {
        return { 
            dinosaurDetails: null 
        };
    },
    async mounted() {
        const res = await fetch(`http://localhost:8000/dinosaurs/${this.dinosaur}`);
        this.dinosaurDetails = await res.json();
    }
});
</script>

<template>
    <h1>{{ dinosaurDetails?.name }}</h1>
    <p>{{ dinosaurDetails?.description }}</p>
    <RouterLink to="/">🠠 Back to all dinosaurs</RouterLink>
</template>

Этот код использует опцию props для определения свойства dinosaur, которое будет передано в компонент. Хук жизненного цикла mounted используется для извлечения подробностей о динозавре на основе свойства dinosaur и хранения их в свойстве данных dinosaurDetails. Эти данные затем отображаются в шаблоне.

Запустить приложение

После настройки фронтенда и бэкенда мы можем запустить приложение. В терминале выполните следующую команду:

deno task dev

Перейдите по ссылке localhost в браузере, чтобы увидеть приложение. Нажмите на динозавра, чтобы увидеть подробности!

The vue app in action

🦕 Теперь, когда вы можете запустить приложение Vue в Deno с Vite, вы готовы создавать реальные приложения! Если вы хотите расширить эту демонстрацию, вы можете рассмотреть создание бэкенд-сервера для предоставления статического приложения после его сборки, тогда вы сможете развернуть ваше приложение динозавров в облаке.

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

Spec-Zone.ru

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