Next.js中的客户端渲染和服务端渲染

embedded/2024/9/22 23:49:28/
前言

为什么会想着探究这个呢?因为我在学习的过程中发现:在next中默认是"use server"也就是如果使用服务端的话是不需要标明的,只有客户端才需要标明"use client",但是在我去掉代码中的"use server"后会报错code:500(完整代码如下),于是就有了本文章。

javascript">"use server";import connectDB from "@/lib/db";
import { User } from "@/models/User";
import { redirect } from "next/navigation";
import { hash } from "bcryptjs";
import { CredentialsSignin } from "next-auth";
import { signIn } from "@/auth";const login = async (formData: FormData) => {const email = formData.get("email") as string;const password = formData.get("password") as string;try {await signIn("credentials", {redirect: false,callbackUrl: "/",email,password,});} catch (error) {const someError = error as CredentialsSignin;return someError.cause;}redirect("/");
};const register = async (formData: FormData) => {const firstName = formData.get("firstname") as string;const lastName = formData.get("lastname") as string;const email = formData.get("email") as string;const password = formData.get("password") as string;if (!firstName || !lastName || !email || !password) {throw new Error("Please fill all fields");}await connectDB();// existing userconst existingUser = await User.findOne({ email });if (existingUser) throw new Error("User already exists");const hashedPassword = await hash(password, 12);await User.create({ firstName, lastName, email, password: hashedPassword });console.log(`User created successfully 🥂`);redirect("/login");
};const fetchAllUsers = async () => {await connectDB();const users = await User.find({});return users;
};export { register, login, fetchAllUsers };
省流

这里就直接放我的结论:

  • "use client":通常为react组件。
  • "use server":通常为CRUD、数据库处理等数据相关内容。
  • 代码报错的原因:如果不标识"use server",该文件将会是个抽离出去的函数,一个hook,而不是一个组件,组件常为jsx & tsx,而该文件后缀为.ts。(个人理解,非标准答案)。
  • 服务端渲染和客户端渲染各有利弊,两者是平等的渲染页面的方式,并不是某些地方必须用到客户端渲染而某些地方必须用到服务端渲染,是可选而非必须的。所以nextjs中区分客户端渲染和服务端渲染实际上是让我们考虑如何结合两者的优点来对页面渲染进行优化。

ps:以上为本人个人观点,如有错误欢迎评论区指正。 

正文

Reactjs 带有三个发布通道。第一个是稳定的金丝雀,最后一个是实验性的

Reactjs 指令是 React 18 中引入的新功能,当前的 reactjs 指令是金丝雀版本的一部分。

Reactjs 指令是 Reactjs 服务器组件的一部分。有些人将指令称为服务器操作。

服务器操作和 reactjs 指令都是相同的功能;不要混淆。

Reactjs 的指令是一组与 React Server 打包器兼容的指令。

Reactjs 的指令指导如何有效地捆绑和组织 React 组件。

大多数情况下,当你使用React.js服务器组件时,你可以在文件顶部使用 reactjs 指令。

javascript">'use client'; // define reactjs directiveimport React, { useState } from 'react';export const Counter = () => {const [count, setCount] = useState(0);// rest of code );
};

但你也可以在 JSX 函数或组件中使用 reactjs 指令。

javascript">export default function Page() {async function CreateAndaddToCart(formData: FormData) {'use server'// mutate data// revalidate cache}return <form action={create}>...</form>
}

为了更好地理解,react 指令有两种类型。

  1. 'use client'
  2. 'use server'

use client:

use client reactjs 指令运行或在客户端执行组件。你可以使用 React 钩子,如 useState、useEffect 等。

javascript">'use client'import React, { useState } from 'react';const Counter = () => {const [count, setCount] = useState(0);return (<div><button onClick={() => setCount(count + 1)}>+</button><p>{count}</p><button onClick={() => setCount(count - 1)}>-</button></div>);
};export default Counter;

use server

使用 serve react 指令在 serve 端运行或执行组件。您可以使用服务器组件处理数据提取 (CURD) 功能。

javascript">'use serve'export async function Posts() {const posts = await fetch('https://.../posts').then((res) => res.json())return posts.map((post) => <Post post={post} />) // return JSX serve side }
注意事项
  1. 不能对同一文件使用 and 操作。'use client''use server'
  2. 使用 use 服务器操作时,您不能使用像 useState、useEffect、useRef 等客户端钩子。
  3. 每个服务组件都在服务端呈现,而不是在客户端呈现。

 最后附上我参考过的两篇文章:

 Next.js 服务端组件和客户端组件区别及使用场景

浅谈服务端渲染(SSR) 与使用场景 - 掘金 (juejin.cn)


http://www.ppmy.cn/embedded/95992.html

相关文章

C#中的多线程

c#中的Task 在C#中&#xff0c;Task 是一个表示异步操作的类&#xff0c;它是 System.Threading.Tasks 命名空间下的一部分。Task 用于实现异步编程模型&#xff0c;允许开发者编写不会阻塞调用线程的代码&#xff0c;从而提高应用程序的响应性和性能。 以下是 Task 的一些关…

基于python的文件销毁工具设计与实现

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

安卓开发中的AppCompat框架简介

文章目录 安卓开发中的AppCompat框架简介如何在AppCompat中使用Toolbar&#xff1f; 安卓开发中的AppCompat框架简介 AppCompat 是 Android 开发中的一个支持库&#xff0c;旨在帮助开发者在不同版本的 Android 系统上实现一致的用户界面和功能。它提供了向后兼容的支持&#…

数字化营销在公域场景中的无限可能

在如今的商业领域&#xff0c;公域场景为企业提供了广阔的发展空间&#xff0c;而数字化营销则成为了企业在这些场景中脱颖而出的关键利器。 ​ 一、电商平台营销 当企业在淘宝、京东等大型电商平台开设店铺&#xff0c;数字化营销便开始大显身手。 企业不仅能踊跃参与像双十…

git本地仓库同步到远程仓库

整个过程分为如下几步&#xff1a; 1、本地仓库的创建 2、远程仓库的创建 3、远程仓库添加key 4、同步本地仓库到远程仓库 1、本地仓库的创建&#xff1a; 使用如下代码创建本地仓库&#xff1a; echo "# test" >> README.md git init git add README.md …

Moodle集成ONLYOFFICE:全面提升学习管理系统的数字教学质量

目录 前言一、什么是Moodle&#xff1f;二、什么是ONLYOFFICE 文档三、Moodle如何集成ONLYOFFICE1、使用Docker部署Moodle2、下载插件3、安装插件 四、在Moodle中集成ONLYOFFICE文档能干什么1、创建和管理文档活动2、附加可填写表单3、处理相关文档4、表单简化流程5、多人在线协…

每天一道C语言精选编程题之printf菱形

题目描述 输⼊⼀个整数n&#xff0c;打印对应2*n-1⾏的菱形图案 解法思路 输⼊的整数n决定了图案的⼤⼩ 1. ⾸先打印上半部分的菱形。需要注意的是&#xff0c;上半部分共有 n ⾏&#xff0c;第 i ⾏需要打印 2*i-1 个符号&#xff0c;⽽ 且这些符号需要居中对⻬。为了实现居中…

数据集与数据库:有什么区别?

数据集和数据库是我们在处理数据时经常听到的两个常用词。虽然它们听起来很相似&#xff0c;但它们具有不同的特征并用于不同的用途。本文深入探讨数据集和数据库之间的主要区别&#xff0c;探索了它们的结构、数据类型和各种其他功能&#xff0c;以帮助您做出明智的决定&#…