nextjs13如何进行服务端渲染?

目录

一、创建一个新项目

二、动态获取后端数据进行服务端渲染出现的问题

三、nextjs13如何进行服务端渲染


nextjs13是nextjs的一个重大升级,一些原本在next12当中使用的API在nextjs13上使用十分不便。本文将着重介绍在nextjs13及以上版本当中进行服务端渲染的方法。

一、创建一个新项目

npx create-next-app@latest

项目安装成功后,不可避免的要安装其他依赖进行项目开发。但是,在新项目下安装其他依赖的话,终端会爆出以下错误:

 以上错误可能会导致依赖安装不成功,解决的办法是删除node_modules,然后进行pnpm install(本人是用pnpm进行安装包的管理),然后在进行依赖的安装即可。

二、动态获取后端数据进行服务端渲染出现的问题

Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。

在我做的很多项目当中都使用axios进行前后端数据交互,几乎都已经形成习惯了。因此,在进行nextjs13项目当中,我也引入了axios安装包进行前后端数据交互,在客户端数据请求的时候没问题。在开发环境当中,进行服务端数据渲染没有问题。但是,在生产环境中,后端数据变化后,页面上进行服务端请求的数据,并没有发生变化。

问题在于使用axios进行服务端数据请求,在生产打包后,nextjs会将请求到的数据打包进去,生成一个静态的页面。因此,在后端数据发生变化后,静态页面的数据并不会跟着发生变化。

页面上的280000000000000000就是在build的时候,从后端请求回来的数据,生成了一个静态的页面,以后无论后端数据如何变化这个值都不会发生变化,除非重新部署。但是,这种效果很显然不是需求所想要的。既然是从后端拿数据,目的就是当时后端数据发生变化,页面的内容也跟着一起变化,而不是一直不变。写到这里,可能有人提出封装一个组件,进行客户端渲染。这就是个笑话了,使用nextjs的目的就是要进行服务端渲染,以利于SEO。如果什么事情都要客户端去做,那还不如用react构建一个单页面应用,还用nextjs干嘛呢。

三、nextjs13如何进行服务端渲染

遇到问题,凡事儿第一步就是先看官方文档。在官方文档的Fetching Data on the Server with fetch

其实已经给出了答案:

nextjs扩展了本地获取Web API,允许您为服务器上的每个获取请求配置缓存和重新验证行为。React扩展了fetch,以便在呈现React组件树时自动记住fetch请求。你可以在服务器组件、路由处理程序和服务器操作中使用带有async/await的fetch。

也就是说使用fetch进行数据请求,可以进行服务端组件数据渲染。

home.tsx

import fetch from '@/plugins/request/fetch';
import Image from 'next/image';
import HomeEarn from '@/compontent/HomeEarn';
import axios from '@/plugins/request/http';export default async function Home() {const data = await fetch.get('earn_info/liquidity_earn_amount');console.log('🚀 ~ file: page.tsx:18 ~ Home ~ data:', data);/* const res = await fetch('https://node3.ibax.io:8880/api/v1/earn_info/liquidity_earn_amount',{ next: { revalidate: 0 } });const data = await res.json();console.log('🚀 ~ file: page.tsx:22 ~ Home ~ data:', data); */return (<main className="flex min-h-screen flex-col items-center justify-between p-24"><div>{/*  {data.data.amount} */}<HomeEarn></HomeEarn><span>{data.amount}</span><span className="ml-1">{data.tokenSymbol}</span></div></main>);
}

 fetch封装:

import local from '@/network/local';
export type env = 'test' | 'production' | 'development';
const http = {Api() {console.log(process.env.BUILD_ENV);const currNetwork = local[process.env.BUILD_ENV as env];console.log('🚀 ~ file: fetch.ts:7 ~ Api ~ currNetwork:', currNetwork);//  console.log('🚀 ~ file: fetch.ts:5 ~ Api ~ currNetwork:', currNetwork);return currNetwork.api;},async get(url: string, params?: any) {const api = this.Api();const paramsUrl = params? `?${new URLSearchParams(params).toString()}`: '';const res = await fetch(`${api}/api/v1/${url}${paramsUrl}`, {headers: {method: 'GET','Content-Type': 'application/json; charset=utf-8',mode: 'cors'// 'Content-Type': 'application/x-www-form-urlencoded',},//  cache: 'force-cache'cache: 'no-cache'});if (!res.ok) {// This will activate the closest `error.js` Error Boundarythrow new Error('Failed to fetch data');}try {const data = await res.json();if (data.code === 0) {return data.data;} else {return null;}} catch (error) {return null;}},async post(url: string, data?: any) {const api = this.Api();const res = await fetch(`${api}/api/v1/${url}`, {headers: {method: 'POST', // *GET, POST, PUT, DELETE, etc.'Content-Type': 'application/json'// 'Content-Type': 'application/x-www-form-urlencoded',},//  cache: 'force-cache',cache: 'no-cache',body: data ? JSON.stringify(data) : ''});if (!res.ok) {// This will activate the closest `error.js` Error Boundarythrow new Error('Failed to fetch data');}try {const data = await res.json();if (data.code === 0) {return data.data;} else {return null;}} catch (error) {return null;}}
};
export default fetch;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/709273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux - 基本指令

1、ls 指令 语法&#xff1a;ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 常用选项&#xff1a; -a 列出目录下的所有文件&#xff0c;包括以 . 开头的隐含文件-l …

Docker本地部署GPT聊天机器人并实现公网远程访问

文章目录 前言1. 拉取相关的Docker镜像2. 运行Ollama 镜像3. 运行Chatbot Ollama镜像4. 本地访问5. 群晖安装Cpolar6. 配置公网地址7. 公网访问8. 固定公网地址9. 结语 前言 随着ChatGPT 和open Sora 的热度剧增,大语言模型时代,开启了AI新篇章,大语言模型的应用非常广泛&…

Linux Shell脚本练习(一)

一、 Linux下执行Shell脚本的方式&#xff1a; 1、用shell程序执行脚本&#xff1a; a、根据你的shell脚本的类型&#xff0c;选择shell程序&#xff0c;常用的有sh&#xff0c;bash&#xff0c;tcsh等 b、程序的第一行#!/bin/bash里面指明了shell类型的&#xff0c;比如#!/…

Matlab: Introduction to Hybrid Beamforming

文章目录 来源混合波束赋形的基本概念System Setup关键函数 来源 在matlab的命令行输入 doc hybrid beamforming 混合波束赋形的基本概念 混合波束形成简介 本例介绍了混合波束形成的基本概念&#xff0c;并说明了如何模拟这种系统。 现代无线通信系统使用空间复用来提高散…

讲述微信小程序 sitemap.json 索引作用配置

做过pc端国内网址的朋友 对SEO这个词不会陌生 主要就是通过条件搜索网址 目前 我们小程序也有这样的功能提供 那么 因为我们百度seo优化的处理程度不同 被搜索出来的东西 会进行一个先后顺序的排序 那么 我们小程序的 sitemap.json 就是用来配置 我们小程序 是否允许被微信索…

mac终端操作

macOS ls 显示当前目录的所有文件夹 cd cd .. 进入jupyter notebook

java小记(1)

从java8开始&#xff0c;接口可以拥有默认的方法实现。 接口的成员(字段 方法)默认都是 public 的&#xff0c;并且不允许定义为 private 或者 protected。 一个类可以实现多个接口&#xff0c;但不能继承多个抽象类。 重写&#xff1a;指子类实现了一个与父类在方法声明上…

物联网通信协议介绍

为了方便&#xff0c;将物联网通信协议分为两大类&#xff0c;一类是接入协议&#xff0c;一类是通讯协议。接入协议一般负责子网内设备间的组网及通信&#xff1b;通讯协议主要是运行在传统互联网TCP/IP协议之上的设备通讯协议&#xff0c;负责设备通过互联网进行数据交换及通…

web前端-html自定义列表

html 自定义列表 <!--有序列表 应用范围&#xff1a;试卷、问答--> <ol><li>Java</li><li>C</li><li>Python</li><li>C</li><li>VB</li> </ol><br><!--无序列表 应用范围&#xff1a…

3DGS进化,高效高质量的GaussianPro来袭!

作者&#xff1a;小张Tt | 来源&#xff1a;3DCV 在公众号「3DCV」后台&#xff0c;回复「原论文」获取论文 添加微信&#xff1a;dddvision&#xff0c;备注&#xff1a;3D高斯&#xff0c;拉你入群。文末附行业细分群 原文链接&#xff1a;3DGS进化&#xff0c;高效高质量…

大数据界面:客户又又又要求科技感了,如何破?

如果你问客户想要什么风格&#xff0c;大部分脱口而出科技感&#xff0c;不仅要求静态页&#xff0c;而且还要求动态效果&#xff0c;炫酷动画&#xff0c;贝格前端工场结合多个项目经历&#xff0c;帮助友友们梳理如何让界面科技动感。 一、没有科技感背后的潜台词 客户说大数…

[ffmpeg] x264 配置参数解析

背景 创建 x264 编码器后&#xff0c;其有一组默认的编码器配置参数&#xff0c;也可以根据需要修改参数&#xff0c;来满足编码要求。 具体参数 可修改的参数&#xff0c;比较多&#xff0c;这边只列举一些常用的。 获取可以配置的参数 方式1 查看 ffmpeg源码 libx264.c…

如何在宝塔面板中设置FTP文件传输服务并实现远程文件管理

文章目录 1. Linux安装Cpolar2. 创建FTP公网地址3. 宝塔FTP服务设置4. FTP服务远程连接小结 5. 固定FTP公网地址6. 固定FTP地址连接 宝塔FTP是宝塔面板中的一项功能&#xff0c;用于设置和管理FTP服务。通过宝塔FTP&#xff0c;用户可以创建FTP账号&#xff0c;配置FTP用户权限…

Leetcode—63. 不同路径 II【中等】

2024每日刷题&#xff08;115&#xff09; Leetcode—63. 不同路径 II 动态规划算法思想 实现代码 class Solution { public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m obstacleGrid.size();int n obstacleGrid[0].size();…

Eureka 入门教程

Eureka 介绍 1. 注册中心概述 什么是注册中心&#xff1f; 给客户端提供可供调用的服务列表&#xff0c;客户端在进行远程调用&#xff08;RPC&#xff09;时&#xff0c;根据服务列表选择服务提供方的服务地址进行服务调用 注册中心的核心功能 注册&#xff1a;服务提供者上…

智能双星:遥测终端机与柳林“巡检机器人“,助力智能运维新升级!

随着科技的不断发展&#xff0c;智能化、自动化的运维管理已经成为企业追求高效、稳定运营的重要方向。柳林遥测终端机、柳林e拍云平台以及巡检机器人的组合&#xff0c;为企业带来了一种全新的、前置的、无感的智能运维体验。 柳林遥测终端机&#xff0c;以其强大的数据采集和…

java 大学生社团管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 大学生社团管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5…

unity使用Registry类将指定内容写入注册表

遇到一个新需求&#xff0c;在exe执行初期把指定内容写入注册表&#xff0c;Playerprefs固然可以写入&#xff0c;但是小白不知道怎么利用Playerprefs写入DWORD类型的数据&#xff0c;因此使用了Registry类 一. 对注册表中键的访问 注册表中共可分为五类 一般在操作时&#…

Lombok的@Slf4j注解使用并集成Logback日志框架调试代码

1. 概述 我们平时在写代码的时候&#xff0c;除了IDE断点的形式以外&#xff0c;还会用到System.out.println在控制台中输出相关的调试信息。本文介绍了在控制台中输出调试信息的另一种实现方式&#xff0c;使用Logback日志框架可以在控制台中用自定义的格式&#xff0c;输出更…

代码随想录算法训练营第35天 | 435. 无重叠区间 ,763.划分字母区间 , 56. 合并区间

贪心算法章节理论基础&#xff1a; https://programmercarl.com/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 435. 无重叠区间 题目链接&#xff1a;https://leetcode.cn/problems/non-overlapping-intervals/ 思路&#xff1a; 相信…