nextjs

Next.js 提供了一种使用 React 创建应用程序的轻率、高度优化的方法。从路由到 API 定义再到图像渲染

即使Next.js可以在服务器端进行数据的初始渲染,客户端React依然可以接管后续的交互和数据更新,通过正常的React渲染流程来更新DOM。这种服务器端与客户端的组合使得Next.js非常强大和灵活。

Next.js 的主要特性

  1. 服务器端渲染(SSR)

    • Next.js 允许 React 组件在服务器上渲染,生成的 HTML 随后发送给客户端。这种方式可以提高首次加载性能,优化搜索引擎优化(SEO)。
  2. 静态网站生成(SSG)

    • Next.js 支持在构建时生成静态 HTML 页面,这些页面在访问时不需要服务器端处理,可以直接托管在 CDN 上。这对性能和扩展性非常有益。
  3. 文件系统路由

    • Next.js 使用基于页面的路由系统,你只需在 pages 目录下添加 React 组件文件,Next.js 将自动根据文件名创建路由。
  4. API 路由

    • 可以在同一个项目中创建 API 路由,通过这些 API 可以处理后端逻辑,如处理表单、与数据库交互等。这使得 Next.js 不仅限于前端框架,还可以构建全栈应用。
  5. 自动代码拆分

    • Next.js 会自动按页面拆分代码,确保只加载所需页面的代码,从而加快页面加载速度。
  6. 内置 CSS 和 Sass 支持,同时支持任何 CSS-in-JS 库

    • Next.js 允许你在组件级使用 CSS,提供了对 CSS Modules 的原生支持,并且也支持像 styled-components 这样的 CSS-in-JS 库。
  7. 快速刷新(Fast Refresh)

    • Next.js 实现了 React Fast Refresh,这使得在开发过程中的快速迭代成为可能,改进后的代码会即时更新,同时保持组件状态。
  8. 预渲染

    • 每个页面默认预渲染,这意味着在客户端 JavaScript 代码运行前,页面的 HTML 和 CSS 已经生成,提高了性能和SEO效果。
  9. TypeScript 支持

    • Next.js 为 TypeScript 提供了内置支持,可以无缝地使用 TypeScript 来开发应用。

###不同的渲染方式

1.客户端渲染 (Client-Side Rendering, CSR)
  • 定义:客户端渲染是指在浏览器中使用 JavaScript 动态生成 HTML 内容的过程。所有的逻辑、数据获取、模板渲染等均在用户的浏览器中完成。
  • 技术栈和工具
    • React.js:可以单独使用,配合客户端路由如 react-router
    • Vue.js:使用 Vue Router 进行客户端路由管理。
    • Angular:利用 Angular Router 管理前端路由。
    • JavaScript/HTML/CSS:无需任何框架,纯客户端 JavaScript 管理动态内容。
  • 优点
    • 动态交互性强。
    • 减少服务器负载。
  • 缺点
    • 首屏加载时间较长。
    • 不利于SEO,因为搜索引擎抓取工具可能无法完全等待或执行 JavaScript。
2. 服务器端渲染 (Server-Side Rendering, SSR)
  • 定义:服务器端渲染是指页面的 HTML 在服务器上生成,然后发送到客户端的过程,客户端加载完 HTML 后即可立即显示。

  • 技术栈:

    Next.js:为 React 提供服务器端渲染支持

  • 优点

    • 提高首屏加载速度。
    • 有利于搜索引擎优化(SEO),因为搜索引擎抓取工具可以直接获取渲染后的页面。
  • 缺点

    • 服务器负载较重。
    • 用户体验可能受到网络延迟的影响。
3. 静态站点生成 (Static Site Generation, SSG)
  • 定义:静态站点生成是指在构建过程中生成静态 HTML 文件的过程。这些静态文件可以被直接部署到 CDN 上,不需要动态服务器渲染。

  • 技术栈:

    Next.js:为 React 提供服务器端渲染支持

  • 优点

    • 极快的加载速度和优异的性能。
    • 安全性高,因为静态文件不容易遭受攻击。
    • 有利于SEO。
  • 缺点

    • 不适合高度动态的应用。
    • 更新内容时可能需要重新构建和部署整个站点。
4. 增量静态重新生成 (Incremental Static Regeneration, ISR)
  • 定义:增量静态重新生成是一种结合了 SSR 和 SSG 的优点的技术,允许静态页面在用户请求时按需重新生成,而无需重新构建整个站点。
  • 技术栈和工具
    • Next.js 9.5 及以上版本:支持 ISR,可在页面级别指定重新生成的频率。
  • 优点
    • 结合了静态生成的性能优势和服务器端渲染的灵活性。
    • 页面可以定期更新,无需人工干预。
  • 缺点
    • 实现复杂度较高。
    • 可能需要特定的平台或框架支持,如 Next.js。
5. 渐进式增强 (Progressive Enhancement, PE)
  • 定义:渐进式增强是一种开发策略,旨在为所有用户创建基本的功能和核心体验,然后根据用户设备的能力逐步增强复杂的特性和布局。
  • 技术栈和工具
    • 基于标准的前端技术:HTML, CSS, JavaScript。
    • 服务端框架:任何可以输出基础 HTML 的后端技术,如 Node.js, Ruby on Rails, ASP.NET。
    • 前端框架:React, Vue, Angular 等,但要确保它们首先输出可用的 HTML,然后再通过客户端 JavaScript 增强功能。
  • 优点
    • 提供跨平台、跨设备的一致体验。
    • 确保了基本功能的可访问性,即使在低性能设备上也是如此。
  • 缺点
    • 可能需要更多的设计和开发工作来确保多层次的功能兼容。

nextjs使用

使用T3创建

npm create t3-app@latest

image-20240905181451213

创建一个名为 my-next-app 的新目录,并启动一个开发服务器,通常在 localhost:3000 上。

项目结构理解

Next.js 有一些特定的文件夹和文件约定:

  • pages/:这里的每个文件都会自动成为一个路由。例如,pages/about.js 将对应于 /about 路由。
  • public/:用于存放静态资源,如图片、字体等。
  • styles/:存放 CSS 文件。
创建页面

在 Next.js 中,页面是通过在 pages 目录中添加 React 组件来创建的。每个组件默认导出为一个 React 组件,Next.js 会自动处理路由。

1
2
3
4
5
6
7
8
// pages/index.js
export default function Home() {
return (
<div>
<h1>Welcome to Next.js!</h1>
</div>
);
}
使用链接和导航

Next.js 提供了一个内置的 <Link> 组件,用于客户端的路由导航。

1
2
3
4
5
6
7
8
9
10
11
12
import Link from 'next/link';

export default function Home() {
return (
<div>
<h1>Welcome to Next.js!</h1>
<Link href="/about">
<a>About Us</a>
</Link>
</div>
);
}
添加样式

Next.js 支持 CSS 模块,可以直接为每个组件导入 CSS 文件。

1
2
3
4
5
/* styles/Home.module.css */
.container {
padding: 20px;
background-color: #f0f0f0;
}
1
2
3
4
5
6
7
8
9
import styles from '../styles/Home.module.css';

export default function Home() {
return (
<div className={styles.container}>
<h1>Welcome to Next.js!</h1>
</div>
);
}
使用 API 路由

Next.js 允许你在 pages/api 目录下创建 API 路由,这些路由可以处理后端逻辑,如数据库操作、API 请求等。

1
2
3
4
// pages/api/hello.js
export default function handler(req, res) {
res.status(200).json({ name: 'John Doe' });
}
部署

Next.js 应用可以部署到多种环境。Vercel(Next.js 的主要开发者)提供了一个非常便捷的部署平台,也可以选择部署到其他支持 Node.js 的平台。

服务器客户端

##辨析

nodejs和go和java一样都属于后端编写方式,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Node.js 是一个开源、跨平台的 JavaScript 运行环境。它使得开发者能够使用 JavaScript 来编写服务器端的代码,从而实现前后端都用 JavaScript 进行开发。Node.js2009 年由 Ryan Dahl 发布,其设计的主要目标是优化高吞吐量和低延迟的网络应用。

核心特性
事件驱动和非阻塞 I/O:

Node.js 使用事件驱动模型,这意味着它可以在 I/O 操作(如读取文件、网络请求)执行过程中继续处理其他事务,而不是等待这些操作完成。这提高了效率和可扩展性,特别适合处理大量的并发连接。
单线程:

尽管 Node.js 在内部使用多线程,对于开发者来说,它表现为单线程。这意味着所有用户请求都在一个主线程上排队执行,通过事件循环(Event Loop)来处理请求,从而避免了传统多线程服务器模型中常见的线程管理和同步问题。
npm(Node Package Manager):

npm 是 Node.js 的官方包管理工具,提供了数十万个可重用的包,允许开发者轻松地添加、更新和管理依赖。npm 是目前世界上最大的软件注册中心。
跨平台:

Node.js 支持多个平台,包括 WindowsLinux 和 macOS,这让开发者可以在不同的操作系统上编写和部署他们的应用。
应用场景
Node.js 适用于构建各种网络应用,尤其是需要处理大量并发连接的场景,如:

Web 服务器:
使用 Node.js 可以轻松构建功能完整的 Web 服务器。配合 ExpressKoa 等框架,开发 RESTful API 或完整的 Web 应用变得非常简单。

实时应用:
如在线聊天应用、实时协作工具等,可以利用 Node.js 的高性能特性和 WebSocket 技术来实现。

网络工具:
编写用于网络监控、数据分析的后端服务等。

命令行工具:
如各种构建工具、脚手架,可以通过 Node.js 脚本来执行。

IoT 应用:
Node.js 在物联网领域也很流行,由于其非阻塞 I/O 和事件驱动的特性,适合用于处理来自大量设备的数据。
总结
Node.js 的引入标志着 JavaScript 应用的范围从浏览器端扩展到了服务器端,极大地促进了全栈开发的普及。其轻量级和高效的特性使得 Node.js 成为当前最受欢迎的服务器端技术之一。

nodejs(express)和react连接实现ts/js的全栈

nextjs建立在建立在 React和nodejs 之上,Next.js 提供了服务器端渲染、静态站点生成等高级功能,并且内置支持 TypeScript。

T3 Stack 是一个现代 web 开发的技术栈,它特别为全栈开发而设计,不仅不与 Node.js 矛盾,而且实际上在其核心使用了 Node.js。T3 Stack 旨在提供一个清晰、高效和协同的开发体验,通过选用一系列互相协调的技术来优化开发过程。

nodejs(js express)与go的比较
1.性能和并发处理
  • Go:Go 语言(也称为 Golang)由 Google 开发,设计初衷是为了解决多核处理器、网络系统和大型代码库中的并发问题。Go 内置了“goroutine”机制,使并发编程变得简单高效。Go 的编译器可以将程序编译成机器代码,因此其执行速度非常快。
  • Node.js:Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,可以让开发者在服务器端运行 JavaScript。Node.js 使用事件驱动、非阻塞 I/O 模型,非常适合处理大量的并发连接,但其单线程的特性在计算密集型任务上可能会成为瓶颈。
2. 用途和应用类型
  • Node.js:通常用于开发需要大量 I/O 操作的应用程序,如网站后端服务、实时通信应用和网络应用。Node.js 强大的包管理器 npm 提供了丰富的库和框架,支持快速开发。
  • Go:常用于系统编程、云服务和微服务架构中。Go 的静态类型和高效的内存管理使它成为开发高性能应用程序和网络服务器的理想选择。

T3 Stack

T3 Stack 的组成技术包括:

  • TypeScript:作为 JavaScript 的超集,TypeScript 提供了类型安全和现代语言特性,帮助开发者写出更可靠、易于维护的代码。
  • Next.js:建立在 React 之上,Next.js 提供了服务器端渲染、静态站点生成等高级功能,并且内置支持 TypeScript。
  • Tailwind CSS:一个实用主义的 CSS 框架,允许开发者快速构建设计。
  • TRPC:用于在 TypeScript 项目中无缝创建端到端类型安全的 API 路径,大大减少前后端数据交换中的类型错误和数据不一致问题。
  • Prisma:作为一个现代的 ORM(对象关系映射)工具,Prisma 提供易于使用的数据库管理功能,并与 TypeScript 紧密集成。

trpc使用

client 和 server

nextjs会自动把 api/trpc/请求 转发到 api/trpc/[trpc]/route.ts 来处理,然后 route.ts 根据请求的路由,转发给你写的各个 api 来处理

zod使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.input(z.object({
roomName: z.string(),
content: z.string(),
sender: z.string(),
}))
vs
.input({ // 直接使用一个对象接受输入,不进行结构和类型验证
roomName: 'string',
content: 'string',
sender: 'string',
})

await addMessage({ roomName: currentRoom, content: newMessage, sender: nickname });
setNewMessage('');
refetchMessages();


1. 类型安全

Zod 在运行时强制类型安全,确保提供的值与预期的类型(本例中为字符串)相匹配。这在 TypeScript 环境中特别有用,你想保持运行时行为与编译时类型系统的一致性。

2. 验证功能

Zod 不仅仅是检查类型;它还可以强制数据满足各种约束:

  • 你可以要求字符串匹配某个模式、具有最小或最大长度,甚至通过自定义验证函数进行验证。
  • 如果输入数据不符合预期格式,Zod 架构会抛出错误,这有助于在开发过程中早期捕捉错误。
3. 错误处理

使用 Zod 时,如果数据不符合指定的架构,Zod 会提供详细的错误描述出了什么问题以及问题发生在哪里。这可以通过提供清晰且可操作的反馈,显著改善调试和错误处理流程。