Next.js的静态生成和服务端渲染,你搞懂了吗?

Next.js的静态生成和服务端渲染,你搞懂了吗?

嘿,各位前端小伙伴们!今天咱们来聊聊Next.js中那令人又爱又恨的静态生成(Static Generation)和服务端渲染(Server-side Rendering)。这两个概念常常让新手开发者摸不着头脑,甚至有时候连老鸟也会搞混。不过别担心,看完这篇文章,保证你能对这两种渲染方式了如指掌,甚至还能在下次技术分享会上侃侃而谈。

静态生成:build时就把你"拍"下来

首先,让我们来看看静态生成。简单来说,静态生成就是在构建时(build time)就生成HTML页面。这就像是给你的网页拍了一张"全家福",然后把这张照片挂在网上,谁来看都是这一张。

听起来很简单,对吧?但是等等,这里面还有点小花样。

静态生成的两种方式

  1. 无数据依赖的静态生成

    这种方式就像是你穿着平常的衣服拍照。不需要特殊准备,直接就能生成HTML。

    function About() {return <div>关于我们</div>
    }export default About
    

    这个页面在构建时就会生成一个静态的HTML文件。简单粗暴,效率拉满!

  2. 有数据依赖的静态生成

    这种方式就像是你要穿上特定的衣服,化好妆,然后才能拍照。需要先准备好数据,然后才能生成HTML。

    function Blog({ posts }) {return (<ul>{posts.map((post) => (<li key={post.id}>{post.title}</li>))}</ul>)
    }export async function getStaticProps() {const res = await fetch('https://api.example.com/posts')const posts = await res.json()return {props: {posts,},}
    }export default Blog
    

    在这个例子中,getStaticProps函数会在构建时获取数据,然后Next.js使用这些数据来渲染页面。

静态生成的优缺点

优点:

  • 超快的加载速度(因为页面已经准备好了)
  • 可以直接部署到CDN
  • 降低服务器负载

缺点:

  • 内容更新需要重新构建
  • 不适合频繁变化的数据
  • 大型站点构建时间可能很长

服务端渲染:每次都给你化个新妆

而服务端渲染则是每次请求到来时,服务器都会即时生成HTML页面。这就像是你每次出门都会重新化妆,确保自己状态最佳。

服务端渲染的实现

在Next.js中,你可以使用getServerSideProps函数来实现服务端渲染:

function Page({ data }) {return <div>最新数据:{data}</div>
}export async function getServerSideProps(context) {const res = await fetch(`https://api.example.com/data`)const data = await res.json()return {props: { data }, // 将作为props传递给页面组件}
}export default Page

每次有请求访问这个页面时,getServerSideProps函数都会运行,获取最新的数据,然后用这些数据渲染页面。

服务端渲染的优缺点

优点:

  • 始终显示最新数据
  • 适合动态内容
  • 有利于SEO(搜索引擎总能看到最新内容)

缺点:

  • 相对较慢的TTFB(Time To First Byte)
  • 增加服务器负载
  • 缓存策略相对复杂

如何选择?

看到这里,你可能会问:"这两种方式我该选哪个呢?"别急,让我们来个简单的决策树:

  1. 你的页面内容经常变化吗?

    • 是 → 考虑服务端渲染
    • 否 → 继续看第2点
  2. 你的页面需要针对每个用户显示不同的内容吗?

    • 是 → 考虑服务端渲染
    • 否 → 继续看第3点
  3. 你的网站需要极快的首屏加载速度吗?

    • 是 → 考虑静态生成
    • 否 → 你真的不在乎速度吗?再考虑一下
  4. 你的网站有大量页面需要预渲染吗?

    • 是 → 可能需要增量静态生成(ISR)
    • 否 → 静态生成可能是个不错的选择

记住,这不是非黑即白的选择。Next.js的强大之处在于,你可以在同一个应用中混合使用这两种方式。某些页面使用静态生成,某些页面使用服务端渲染,简直不要太灵活!

实战小贴士

  1. 利用getStaticPaths进行动态路由的静态生成

    如果你有动态路由,但又想使用静态生成,getStaticPaths就是你的好帮手:

    export async function getStaticPaths() {const res = await fetch('https://api.example.com/posts')const posts = await res.json()const paths = posts.map((post) => ({params: { id: post.id },}))return { paths, fallback: false }
    }export async function getStaticProps({ params }) {const res = await fetch(`https://api.example.com/posts/${params.id}`)const post = await res.json()return { props: { post } }
    }
    
  2. 使用SWR进行客户端数据获取

    有时候,你可能想在静态页面上展示一些实时数据。这时候,可以考虑在客户端使用SWR库:

    import useSWR from 'swr'function Profile() {const { data, error } = useSWR('/api/user', fetcher)if (error) return <div>加载失败...</div>if (!data) return <div>加载中...</div>return <div>你好,{data.name}!</div>
    }
    
  3. 增量静态再生成(ISR)

    如果你想要静态生成的好处,又不想完全放弃数据的新鲜度,可以尝试ISR:

    export async function getStaticProps() {const res = await fetch('https://api.example.com/posts')const posts = await res.json()return {props: {posts,},revalidate: 60, // 每60秒重新生成页面}
    }
    

结语

好了,到这里,你应该对Next.js的静态生成和服务端渲染有了更深入的理解。记住,没有绝对的好坏之分,关键是要根据你的具体需求来选择合适的渲染策略。

下次如果有人问你"Next.js的静态生成和服务端渲染有什么区别",你就可以自信满满地说:“哦,那不就是build时拍照和每次出门化妆的区别吗?”

好了,今天的课程到此结束。下课!别忘了课后练习:试着在你的Next.js项目中混合使用这两种渲染方式,看看效果如何。加油,相信你一定能成为Next.js渲染大师!

海码面试 小程序

包含最新面试经验分享,面试真题解析,全栈2000+题目库,前后端面试技术手册详解;无论您是校招还是社招面试还是想提升编程能力,都能从容面对~

下课!别忘了课后练习:试着在你的Next.js项目中混合使用这两种渲染方式,看看效果如何。加油,相信你一定能成为Next.js渲染大师!

海码面试 小程序

包含最新面试经验分享,面试真题解析,全栈2000+题目库,前后端面试技术手册详解;无论您是校招还是社招面试还是想提升编程能力,都能从容面对~

[外链图片转存中…(img-gQIGO9tW-1720775442347)]

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

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

相关文章

软设之中介者模式

设计模式中&#xff0c;中介者模式的意图是:用一个中介对象来封装一系列的对象间的交互。它使各个对象不需要显式互相调用&#xff0c;从而达到低耦合&#xff0c;还可以独立改变对象间的交互。 比方&#xff0c;飞机与塔台之间&#xff0c;如果没有塔台&#xff0c;飞机就得需…

双语|如何给教授/教职员发送电子邮件

斯坦福大学提出建议&#xff0c;指导学生如何给教授或者教职员发送电子邮件&#xff0c;这些建议对于访问学者、博士后及联合培养博士也很适用&#xff0c;故知识人网小编用双语对照的形式进行节选转发。 Whether youre writing a professor to ask for an extension or to loo…

笔记:在Entity Framework Core中使用乐观并发控制来处理数据更新的冲突

一、目的&#xff1a; 在Entity Framework Core (EF Core) 中配置乐观并发控制主要涉及到使用并发令牌。并发令牌是在模型中定义的属性&#xff0c;用于在数据库操作期间检测并发冲突。当两个或更多用户尝试同时更新同一条记录时&#xff0c;EF Core 会使用这些令牌来确定是否有…

C++图像转换过程中的内存异常报错

问题描述 在OpenCV中&#xff0c;将输入的图像转到Lab颜色空间中&#xff0c;使用cv::split 函数分离L&#xff0c;A&#xff0c;B三个通道的时候发生内存异常&#xff0c;报错。 cv::split(LabImg, std::vector<cv::Mat>{L, A, B});报错信息&#xff1a; 0x00007FFAA1…

多平台支持,制作的电子画册随时随地都可以查看

​在数字化的时代背景下&#xff0c;电子画册以其便捷的传播方式、丰富的视觉表现形式&#xff0c;赢得了大众的喜爱。它不仅能够在个人电脑上展现&#xff0c;还能通过智能手机、平板电脑等多种移动设备随时随地被访问和浏览。这种跨平台的支持&#xff0c;使得无论你身处何地…

高精度定位与AI技术的深度融合——未来智慧世界的钥匙

引言在当今迅速发展的科技时代&#xff0c;精确定位和人工智能&#xff08;AI&#xff09;技术正在快速推动各领域的创新与变革。高精度定位结合AI技术所产生的融合效应&#xff0c;正在加速智慧城市、智能驾驶、智能物流以及许多其他领域的实现。这篇文章将详细探讨高精度定位…

基于Java技术的校园台球厅人员与设备管理系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架 工具&#xff1a;Eclipse、Navicat、Maven 系统展示 首页 用户注册界面 球桌信息…

物流EDI:如何与马士基Maersk建立EDI连接?

马士基Maersk是在全球范围内经营航运和物流的公司&#xff0c;提供包括仓储、配送、供应链管理等一系列的物流解决方案。 与马士基Maersk建立EDI连接&#xff0c;首先需要创建一个 Developer Portal帐户。接下来需要在马士基Maersk提供的列表中选择适合自己的EDI解决方案。 马…

C++基础编程100题-023 OpenJudge-1.4-03 奇偶数判断

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0104/03/ 描述 给定一个整数&#xff0c;判断该数是奇数还是偶数。 输入 输入仅一行&#xff0c;一个大于零的正整数n。 输出 输出仅一行&#xff0c;如果n是奇数&#xff0c;输出odd&#xff1b;如果n是偶…

Twelve Labs:专注视频理解,像人类一样理解视频内容

在当今数字化世界中&#xff0c;视频已成为人们获取信息和娱乐的主要方式之一。 AI视频生成领域的竞争也很激烈&#xff0c;Pika、Sora、Luma AI以及国内的可灵等&#xff0c;多模态、视频生成甚至也被视为大模型发展的某种必经之路。然而&#xff0c;与文本生成相比&#xff…

ajax使用formdata上传通过原始input[type=‘file‘]选择的文件

HTML代码 <input id"daoruInput" type"file"/> JS代码 var formdata new FormData(); formdata.append("file", $("#daoruInput")[0].files[0])$.ajax({url: "xx.xx/upload",type: "POST",dataType: &q…

[ptrade交易实战] 第十二篇 其他信息获取函数 (2)

前言 今天主要讲的是除了板块信息和股票信息之外的其他信息如何获取的函数&#xff01;还是分几个部分来讲 具体的开通渠道可以看文章末尾&#xff01; 一、get_deliver —— 获取历史交割单信息 get_deliver(start_date, end_date) 这个函数用来获取账户历史交割单信息。…

深入解析发生 OOM 的三大场景

深入解析 OOM 的三大场景 什么是 OOM&#xff1f;一、堆内存溢出 ( Heap OOM )原因分析解决方案 二、栈内存溢出&#xff08;Stack OOM&#xff09;原因分析解决方案 三、方法区内存溢出&#xff08;Metaspace OOM&#xff09;原因分析解决方案 在Java应用程序开发中&#xff0…

python实现http get pos download

python实现http get post download 使用requests, 加上重试机制,超时机制. #!/usr/bin/python3 # -*- coding: UTF-8 -*-import requests import sys import json import os import logging import timedef httpGet(urlStr, headers None, params None, data None, isRaise…

记录一次Nginx的使用过程

一、Docker安装配置nginx 1.拉取镜像 docker pull nginx2.创建挂载目录 启动前需要先创建Nginx外部挂载目录文件夹 主要有三个目录 conf&#xff1a;配置文件目录log&#xff1a;日志文件目录html&#xff1a;项目文件目录&#xff08;这里可以存放web文件&#xff09; 创建挂…

oslo_i18n学习小结

背景 代码均为开源代码 基于yoga版本&#xff0c;需要对openstack某服务做翻译&#xff0c;了解到oslo_i18n有翻译功能&#xff0c;配置oslo_i18n来给组件进行翻译 用法 用法 每个服务自己会带一个i18n.py的文件&#xff0c;如果要对日志进行翻译&#xff0c;从i18n导入_&…

逆变-TI视频课笔记

目录 1、全桥逆变 1.1、全桥逆变SPWM仿真 2、半桥逆变 2.1、本课小结 3、多重逆变&#xff08;间接的“交-直-交-直”变流&#xff09; 3.1、多电平逆变的目的 3.2、单逆变桥 3 电平控制时序 3.3、大功率设备的功率因数 3.4、本课小结 视频链接&#xff1a;文字…

算法训练(leetcode)第二十八天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

刷题记录 509. 斐波那契数递归循环动态规划 70. 爬楼梯746. 使用最小花费爬楼梯 509. 斐波那契数 leetcode题目地址 递归 时间复杂度&#xff1a; O ( n ) O(n) O(n) 空间复杂度&#xff1a; O ( n ) O(n) O(n) // c class Solution { public:int fib(int n) {if(n<2)…

Kafka配置SSL信道加密

kafka配置SASL认证 Kafka单机配置SSL认证 使用脚本生成SSL证书 执行ssl.sh # 配置SSL配置文件 cp server.properties ssl.properties# 修改配置文件SSL内容 listenersSSL://kafka-test:9092 advertised.listenersSSL://kafka-test:9092 ssl.keystore.location/root/config/cer…

linux中vim切换输入中文

linux中vim切换输入中文 遇到问题 在虚拟机linux下vim 编辑器中注释的时候无法使用中文 解决方案 Linux系统中的vim编辑器中安装中文输入法软件包 1.在终端中输入以下命令 sudo apt-get install fcitx fcitx-bin fcitx-table-wubi fcitx-table-wbpy2. 安装完成后&#xf…