构建一个 Vue.js 应用
Vue.js 是一个渐进式前端 JavaScript 框架。它提供了创建动态和交互式用户界面的工具和功能。
在本教程中,我们将使用 Vite 和 Deno 构建一个简单的 Vue.js 应用。该应用将显示一个恐龙列表。当你点击其中一个时,它会带你到一个恐龙页面,显示更多详细信息。你可以在 GitHub 上查看完整的应用。

使用 Vite 和 Deno 创建 Vue.js 应用 跳转到标题
我们将使用 Vite 脚手架搭建一个基本的 Vue.js 应用。在你的终端中,运行以下命令来创建一个新的 Vite .js 应用
deno run -A npm:create-vite
当出现提示时,为你的应用命名,并在提供的框架中选择 Vue,然后选择 TypeScript 作为变体。
创建后,cd 进入你的新项目,并运行以下命令安装依赖
deno install
然后,运行以下命令来启动你的新 Vue.js 应用
deno task dev
Deno 将运行 package.json 文件中的 dev 任务,这将启动 Vite 服务器。点击输出的 localhost 链接以在浏览器中查看你的应用。
配置格式化程序 跳转到标题
deno fmt 支持使用 --unstable-component 标志的 Vue 文件。要使用它,运行此命令
deno fmt --unstable-component
要配置 deno fmt 始终格式化你的 Vue 文件,请将此添加到你的 deno.json 文件的顶层
"unstable": ["fmt-component"]
添加后端 跳转到标题
下一步是添加一个后端 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 实例来定义一些路由
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 中的名称返回特定恐龙。
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。
const app = new Application();
app.use(oakCors());
app.use(router.routes());
app.use(router.allowedMethods());
await app.listen({ port: 8000 });
你可以使用 deno run --allow-env --allow-net api/main.ts 运行 API 服务器。我们将创建一个任务来运行此命令,并更新 dev 任务以同时运行 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");
使用 deno add 将 Vue Router 模块添加到项目
deno add npm:vue-router
接下来,在 src 目录下创建一个 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> 组件
<template>
<RouterView />
</template>
组件 跳转到标题
Vue.js 将前端 UI 拆分为组件。每个组件都是可重用的代码片段。我们将创建三个组件:一个用于主页,一个用于恐龙列表,以及一个用于单个恐龙。
每个组件文件分为三个部分:<script>、<template> 和 <style>。<script> 标签包含组件的 JavaScript 逻辑,<template> 标签包含 HTML,<style> 标签包含 CSS。
在 /src/components 目录下,创建三个新文件:HomePage.vue、Dinosaurs.vue 和 Dinosaur.vue。
Dinosaurs 组件 跳转到标题
Dinosaurs 组件将从我们之前设置的 API 中获取恐龙列表,并使用 Vue Router 的 RouterLink 组件将它们渲染为链接。(因为我们正在创建一个 TypeScript 项目,不要忘记在 script 标签上指定 lang="ts" 属性。)将以下代码添加到 Dinosaurs.vue 文件中
<script lang="ts">
import { defineComponent } from "vue";
export default defineComponent({
async setup() {
const res = await fetch("https://: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 组件。RouterLink 组件的 :to 属性指定了点击链接时导航到的路由,:key 属性用于唯一标识每个恐龙。
Homepage 组件 跳转到标题
主页将包含一个标题,然后渲染 Dinosaurs 组件。将以下代码添加到 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 组件将显示特定恐龙的名称和描述,以及一个返回完整列表的链接。
首先,我们将为要获取的数据设置一些类型。在 src 目录下创建一个 types.ts 文件并添加以下代码
type Dinosaur = {
name: string;
description: string;
};
type ComponentData = {
dinosaurDetails: null | Dinosaur;
};
然后更新 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(
`https://: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 的 prop,该 prop 将传递给组件。mounted 生命周期钩子用于根据 dinosaur prop 获取恐龙的详细信息,并将其存储在 dinosaurDetails 数据属性中。然后,这些数据在模板中渲染。
运行应用 跳转到标题
现在我们已经设置好了前端和后端,我们可以运行应用了。在你的终端中,运行以下命令
deno task dev
在浏览器中访问输出的 localhost 链接以查看应用。点击恐龙以查看更多详细信息!

🦕 既然你已经能够在 Deno 中使用 Vite 运行 Vue 应用,你就可以开始构建实际应用了!如果你想在此演示的基础上进行扩展,可以考虑构建一个后端服务器来在构建后提供静态应用,这样你就可以将你的恐龙应用部署到云端了。