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;故知识人网小编用双语对照的形式进行节选转发。 Whether youre writing a professor to ask for an extension or to loo…

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

​在数字化的时代背景下&#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 系统展示 首页 用户注册界面 球桌信息…

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…

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

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

记录一次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;文字…

Zed 编辑器发布了原生 Linux 版本

由 Rust 编写、GPU 加速的 Zed 文本编辑器终于提供了正式的 Linux 原生版本&#xff01;在过去的几个月里&#xff0c;Zed 的 Linux 支持取得了长足的进步&#xff0c;现在已经进入了更正式的阶段。 今天&#xff0c;这款由前 Atom 开发人员创建的现代开源代码编辑器现在在 Li…

vue vite+three在线编辑模型导入导出

文章目录 序一、1.0.0版本1.新增2.编辑3.导出4.导入 二、2.0.0版本1. 修复模型垂直方向放置时 模型会重合4. 修复了导出导入功能 现在是1:1导出导入5. 新增一个地面 视角看不到地下 设置了禁止编辑地面 地面设置为圆形6. 新增功能 可选择基本圆形 方形 圆柱形等模型以及可放置自…

网络 闲聊

闲谈 闲话 网络安全——>网络空间安全 网络空间&#xff1a;一个由信息基础设备组成互相依赖的网络 继&#xff1a;海、陆、空、天、的第五大空间 信息安全的一个发展&#xff1a; 通信保密阶段---计算机安全---信息系统安全---网络空间安全 棱镜门事件 棱镜计划&…

Java中的Set系列集合超详解

Set List是有序集合的根接口&#xff0c;Set是无序集合的根接口&#xff0c;无序也就意味着元素不重复。更严格地说&#xff0c;Set集合不包含一对元素e1和e2 &#xff0c;使得e1.equals(e2) &#xff0c;并且最多一个空元素。   使用Set存储的特点与List相反&#xff1a;元素…

腾讯云如何设置二级域名?

什么是二级域名&#xff1f; 例如我已申请的域名为&#xff1a; test.com //顶级域名 现在我开发的应用要部署到二级域名&#xff1a; blog.test.com 1、打开腾讯云控制台的我的域名&#xff0c;然后点击解析 2、在我的解析页面点击添加记录&#xff0c;然后需注意红色方框处…

生物素标记的柚皮苷探针;Biotin-Naringin

生物素标记的柚皮苷探针&#xff08;Biotin-Naringin&#xff09;是一种结合了生物素&#xff08;Biotin&#xff09;和柚皮苷&#xff08;Naringin&#xff09;特性的化合物&#xff0c;它在有机合成及药物化学技术领域具有重要意义。以下是对该探针的详细解析&#xff1a; 一…

秋招Java后端开发冲刺——Mybatis

一、基本知识 1. 介绍 MyBatis 是 Apache 的一个开源项目&#xff0c;它封装了 JDBC&#xff0c;使开发者只需要关注 SQL 语句本身&#xff0c;而不需要再进行繁琐的 JDBC 编码。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java POJO&#xff08;Plain …

Everything搜索无法搜索到桌面的文件(无法检索C盘 或 特定路径的文件)

现象描述 在Everything搜索框中输入桌面已存在的文件或随便已知位置的文件&#xff0c;无法找到。 搜索时检索结果中明显缺少部分磁盘位置的&#xff0c;例如无法检索C盘&#xff0c;任意关键字搜索时结果中没有位于C盘的&#xff0c;无论怎样都搜不到C盘文件。 解决方法 在…

图像识别和目标检测在超市电子秤上的应用

目录 前言深度学习的目标检测图像识别技术视觉秤的优势其他应用场景中的技术应用未来展望 前言 随着科技的不断发展&#xff0c;电子秤在生鲜超市中的应用也在不断升级。传统的电子秤需要打秤人员手动输入秤码&#xff0c;这不仅耗时费力&#xff0c;还需要大量的培训以记住各…

工业大数据是什么?应用工业大数据时面临哪些挑战?

在当今快速发展的工业领域&#xff0c;大数据已成为推动企业转型升级的核心动力。工业大数据&#xff0c;以其独特的价值和潜力&#xff0c;正逐渐改变着传统的生产、管理和决策模式。然而&#xff0c;伴随着大数据的快速发展&#xff0c;一系列挑战也随之浮现。本文将深入探讨…