Skip to content

Commit 0b1fd22

Browse files
committed
docs: add nuxt/server
1 parent 07f79b8 commit 0b1fd22

File tree

13 files changed

+332
-156
lines changed

13 files changed

+332
-156
lines changed

src/.vuepress/sidebar.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ export default sidebar({
77
children: 'structure',
88
collapsible: true,
99
icon: 'fluent:document-bullet-list-24-filled',
10-
prefix: '1.nuxt/',
11-
text: '1. Nuxt 教程',
10+
prefix: 'nuxt/',
11+
text: '1. Nuxt 笔记',
1212
},
1313
],
1414
})

src/nuxt/index.md renamed to src/nuxt/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
---
2+
index: false
3+
---
4+
15
# Nuxt 笔记
26

37
```component Catalog

src/nuxt/nuxt-tutorial/0.catalog.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# 0. Nuxt3 教程目录
2+
3+
本教程参考官方文档以及多份资料,力求帮助读者完整地入门并精通 Nuxt3。
4+
5+
本教程不会追求介绍完整 API 和函数功能用法,而是以最佳实践为主,帮助读者快速上手 Nuxt3,并快速完成实践项目。
6+
7+
本教程优先使用 `pnpm`,以及 Node.js 20+。
8+
9+
```component Catalog
10+
{}
11+
```
Lines changed: 55 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,55 @@
1-
# 1. 了解同构渲染
2-
3-
[[TOC]]
4-
5-
## 1.1 模板渲染
6-
7-
*@def* **模板渲染** 即动态网站使用相同的模板和不同的数据来生成不同的 HTML 页面。
8-
9-
可以在哪些位置进行渲染?
10-
11-
- 服务端渲染
12-
- 客户端渲染
13-
- 同构渲染
14-
15-
使用同构渲染系统中的数据,部分可能由服务端去渲染,而另一部分由客户端渲染。
16-
17-
Nuxt3 即同构渲染框架,帮助我们快速开发同构渲染页面。
18-
19-
## 1.2 服务端渲染
20-
21-
早期我们使用服务端渲染,数据通过模板字符串进行拼接,生成 HTML 返回给客户端。
22-
23-
每次请求页面服务器都进行一次渲染,然后返回整个页面的数据。但是浏览器会直接得到 HTML 内容,显示更快。
24-
25-
这类系统主要使用预处理模板的技术(如 PHP、JSP 等),并使用 MVC 设计模式。
26-
27-
传统的服务端渲染的主要缺点如下:
28-
29-
- 所有的渲染都发生在服务端,因此服务器压力较大
30-
- 常常需要返回整个 HTML 数据,占用带宽
31-
32-
## 1.3 客户端渲染
33-
34-
后来我们通过 AJAX 等相关的技术,通过服务器提供 JSON 格式的 API 接口,就可以在客户端渲染各种不同的数据。每次请求可以只请求必要数据,因而可以有更强的灵活性。
35-
36-
这类系统主要基于 SPA 类的框架(如 React、Vue 等),使用 MVVM 设计模式。
37-
38-
基于 MVVM 的客户端渲染的主要缺点如下:
39-
40-
- 首屏渲染慢
41-
- 不利于 SEO(搜索引擎优化)
42-
43-
## 1.4 Nuxt3 用于?
44-
45-
![app](./../images/app.svg)
46-
47-
> 图片来源于:<https://nuxt.com/docs/getting-started/views>
48-
49-
Nuxt3 是基于 Vue3 的混合式框架,用于解决:
50-
51-
- 首屏渲染慢的问题
52-
- SEO 优化问题
53-
- 同时兼备客户端渲染的优点
54-
55-
了解了基本概念之后,你可以在 [Nuxt 官方文档](https://nuxt.com/docs/getting-started/introduction)[Nuxt 中文文档](https://nuxt.com.cn/docs/getting-started/introduction) 中学习它的基本使用。
1+
# 1. 了解同构渲染
2+
3+
[[TOC]]
4+
5+
## 1.1 模板渲染
6+
7+
*@def* **模板渲染** 即动态网站使用相同的模板和不同的数据来生成不同的 HTML 页面。
8+
9+
可以在哪些位置进行渲染?
10+
11+
- 服务端渲染
12+
- 客户端渲染
13+
- 同构渲染
14+
15+
使用同构渲染系统中的数据,部分可能由服务端去渲染,而另一部分由客户端渲染。
16+
17+
Nuxt3 即同构渲染框架,帮助我们快速开发同构渲染页面。
18+
19+
## 1.2 服务端渲染
20+
21+
早期我们使用服务端渲染,数据通过模板字符串进行拼接,生成 HTML 返回给客户端。
22+
23+
每次请求页面服务器都进行一次渲染,然后返回整个页面的数据。但是浏览器会直接得到 HTML 内容,显示更快。
24+
25+
这类系统主要使用预处理模板的技术(如 PHP、JSP 等),并使用 MVC 设计模式。
26+
27+
传统的服务端渲染的主要缺点如下:
28+
29+
- 所有的渲染都发生在服务端,因此服务器压力较大
30+
- 常常需要返回整个 HTML 数据,占用带宽
31+
32+
## 1.3 客户端渲染
33+
34+
后来我们通过 AJAX 等相关的技术,通过服务器提供 JSON 格式的 API 接口,就可以在客户端渲染各种不同的数据。每次请求可以只请求必要数据,因而可以有更强的灵活性。
35+
36+
这类系统主要基于 SPA 类的框架(如 React、Vue 等),使用 MVVM 设计模式。
37+
38+
基于 MVVM 的客户端渲染的主要缺点如下:
39+
40+
- 首屏渲染慢
41+
- 不利于 SEO(搜索引擎优化)
42+
43+
## 1.4 Nuxt3 用于?
44+
45+
![Nuxt3](./images/app.svg)
46+
47+
> 图片来源于:<https://nuxt.com/docs/getting-started/views>
48+
49+
Nuxt3 是基于 Vue3 的混合式框架,用于解决:
50+
51+
- 首屏渲染慢的问题
52+
- SEO 优化问题
53+
- 同时兼备客户端渲染的优点
54+
55+
了解了基本概念之后,你可以在 [Nuxt 官方文档](https://nuxt.com/docs/getting-started/introduction)[Nuxt 中文文档](https://nuxt.com.cn/docs/getting-started/introduction) 中学习它的基本使用。
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# 2. 开始使用 Nuxt3
2+
3+
> [!TIP]
4+
> 如果你已经安装了 Node.js,请检查版本大于 18,命令:
5+
>
6+
> ```bash
7+
> node --version
8+
> ```
9+
10+
推荐 VS Code 安装插件 TypeScript Vue Plugin (Volar):
11+
12+
```bash
13+
code --install-extension Vue.volar
14+
```
15+
16+
## 2.1 创建项目
17+
18+
首先创建项目:
19+
20+
```bash
21+
pnpm dlx nuxi init $PROJECT_NAME
22+
```
23+
24+
然后安装依赖:
25+
26+
```bash
27+
cd $PROJECT_NAME
28+
pnpm install
29+
```
30+
31+
接着在 VS Code 中打开:
32+
33+
```bash
34+
code .
35+
```
36+
37+
启动开发模式:
38+
39+
```bash
40+
pnpm dev -o
41+
```
42+
43+
其中 `-o` 表示自动打开浏览器页面(<http://localhost:3000>),这样你可以直接看到效果了,请等待一会完成初始渲染。
File renamed without changes.
File renamed without changes.
File renamed without changes.

src/nuxt/nuxt-tutorial/6.server.md

Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
# 6. 服务端程序
2+
3+
[[TOC]]
4+
5+
`server/` 目录用于在应用中注册 API 和服务器处理程序。
6+
7+
每个文件应该默认导出由 `defineEventHandler()``eventHandler()` 定义的函数。
8+
9+
处理程序可以直接返回 JSON 数据、`Promise`,或使用 `event.node.res.end()` 发送响应。
10+
11+
```ts
12+
// server/api/hello.ts
13+
export default defineEventHandler((event) => {
14+
return {
15+
hello: 'world'
16+
}
17+
})
18+
```
19+
20+
## 6.1 服务器路由
21+
22+
### 路由参数
23+
24+
服务器路由可以使用文件名中括号内的动态参数,例如 `/api/hello/[name].ts`,并通过 `event.context.params` 访问。
25+
26+
```ts
27+
// server/api/hello/[name].ts
28+
export default defineEventHandler((event) => {
29+
const name = getRouterParam(event, 'name')
30+
return `Hello, ${name}!`
31+
})
32+
```
33+
34+
也可以配合验证器使用:
35+
36+
```ts
37+
// server/api/hello/[name].ts
38+
import { z } from 'zod'
39+
40+
const userSchema = z.object({
41+
name: z.string().default('Guest'),
42+
email: z.string().email(),
43+
})
44+
45+
export default defineEventHandler(async (event) => {
46+
const result = await readValidatedBody(event, body => userSchema.safeParse(body))
47+
// or `.parse` to directly throw an error
48+
49+
if (!result.success)
50+
throw result.error.issues
51+
52+
// User object is validated and typed!
53+
return result.data
54+
})
55+
```
56+
57+
### 匹配 HTTP 方法
58+
59+
可以使用形如 `name.[method].ts` 的文件名来匹配 HTTP 方法,例如 `hello.get.ts`
60+
61+
```ts
62+
// server/api/hello.get.ts
63+
export default defineEventHandler((event) => {
64+
return '...'
65+
})
66+
```
67+
68+
### 全局捕获路由
69+
70+
使用形如 `[...].ts``[...slug].ts` 文件名来捕获所有路由,其中可以通过 `event.context.params.slug` 获得 `slug` 的值。
71+
72+
### 读取请求体
73+
74+
使用 `readBody(event)` 或者使用 `readValidatedBody(event)` 来读取请求体。
75+
76+
`$fetch()` 一起使用,可以自动包装/解包 JSON 数据。
77+
78+
> [!WARNING]
79+
> 如果在 GET 等不支持请求体的方法中使用 `readBody(event)`,将会抛出错误并返回 405。
80+
81+
### 读取查询参数
82+
83+
使用 `getQuery(event)` 或者使用 `getValidatedQuery(event)` 来读取查询参数。
84+
85+
### 读取 Cookies
86+
87+
使用 `parseCookies(event)` 来读取请求中的 Cookies。
88+
89+
### 错误处理
90+
91+
在每个请求处理程序中,可以使用 `createError()` 来创建错误响应。
92+
93+
```ts
94+
export default defineEventHandler((event) => {
95+
const id = parseInt(event.context.params.id) as number
96+
97+
if (!Number.isInteger(id)) {
98+
throw createError({
99+
statusCode: 400,
100+
statusMessage: 'ID should be an integer',
101+
})
102+
}
103+
return 'All good'
104+
})
105+
```
106+
107+
可以使用 `setResponseStatus(event, code)` 来设置响应状态码。
108+
109+
### 配置
110+
111+
可使用 `useRuntimeConfig()` 来读取运行时配置。
112+
113+
将事件作为参数提供给 `useRuntimeConfig()` 是可选的,但建议传递它以获取服务器路由在运行时被环境变量覆盖的运行时配置。
114+
115+
```ts
116+
export default defineEventHandler(async (event) => {
117+
const config = useRuntimeConfig(event)
118+
119+
const repo = await $fetch('https://api.github.com/repos/nuxt/nuxt', {
120+
headers: {
121+
Authorization: `token ${config.githubToken}`
122+
}
123+
})
124+
125+
return repo
126+
})
127+
```
128+
129+
现在,环境变量 `NUXT_GITHUB_TOKEN` 将覆盖自定义的 `config.githubToken` 值。
130+
131+
### 重定向
132+
133+
```ts
134+
export default defineEventHandler(async (event) => {
135+
await sendRedirect(event, '/path/redirect/to', 302)
136+
})
137+
```
138+
139+
## 6.2 中间件
140+
141+
## 6.3 插件
142+
143+
## 6.4 高级
144+
145+
### 发送流
146+
147+
*@note:实验性* 现在可以使用 `sendStream(event, stream)` 来发送流。
148+
149+
```ts
150+
import fs from 'node:fs'
151+
import { sendStream } from 'h3'
152+
153+
export default defineEventHandler((event) => {
154+
return sendStream(event, fs.createReadStream('/path/to/file'))
155+
})
156+
```
157+
158+
### 服务端 K/V 存储
159+
160+
Nitro 集成了 [unjs/unstorage](https://unstorage.unjs.io/),支持在服务端存储 K/V 信息。可安装各种适配器以支持不同环境和中间件。请阅读 [官方文档](https://nitro.unjs.io/guide/storage) 了解详细信息。
161+
162+
下面以 Redis 为例:
163+
164+
```ts
165+
// nuxt.config.ts
166+
export default defineNuxtConfig({
167+
nitro: {
168+
storage: {
169+
redis: {
170+
driver: 'redis',
171+
/* redis connector options */
172+
port: 6379, // Redis port
173+
host: "127.0.0.1", // Redis host
174+
username: "", // needs Redis >= 6
175+
password: "",
176+
db: 0, // Defaults to 0
177+
tls: {} // tls/ssl
178+
}
179+
}
180+
}
181+
})
182+
```
183+
184+
使用:
185+
186+
```ts
187+
export default defineEventHandler(async (event) => {
188+
// List all keys with
189+
const keys = await useStorage('redis').getKeys()
190+
191+
// Set a key with
192+
await useStorage('redis').setItem('foo', 'bar')
193+
194+
// Remove a key with
195+
await useStorage('redis').removeItem('foo')
196+
197+
return {}
198+
})
199+
```
200+
201+
### WebSocket
202+
203+
建议使用 Socket.IO 等成熟的库来处理 WebSocket,Nuxt3 可用的库如 [nuxt-socket-io
204+
](https://www.npmjs.com/package/nuxt-socket-io)

src/nuxt/nuxt-tutorial/index.md renamed to src/nuxt/nuxt-tutorial/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
---
2+
index: false
3+
---
4+
15
# Nuxt3 教程
26

37
```component Catalog

0 commit comments

Comments
 (0)