5 分钟理解 Next.js SSG (Static Site Generation / Static Export)

在本篇文章中,我们将介绍 Next.js 中的 SSG(静态网站生成)功能,以及它是如何工作的。我们将介绍 SSG 的基本概念,以及在 Next.js 中如何使用 Server Components 和 Client Components 来实现不同的数据获取策略。

什么是 SSG

SSG 是一种 Web 开发模式,它允许我们在构建网站时将页面提前生成为静态 HTML 文件,而不是在每次请求时动态生成。这意味着页面内容在构建时就已经准备好,而不是等待用户请求时才生成。这样做的好处是:

  • 和 SSR(服务器端渲染) 相比,可以提高网站的性能和降低网站托管成本。因为页面内容可以直接从静态文件中提供,而无需进行服务器端渲染;
  • 和 SPA(单页应用)相比,有利于SEO且有更好的首屏加载性能。因为作为网页骨架的 Server Components 是在构建时渲染的,且 SSG 的 bundle 更小。

什么是静态网站

静态网站是一种最原始的 Web 形式,它由静态文件组成。和 JSP/Blade/Pug 等后端模板引擎不同, 它不需要服务器端代码来生成页面内容(拼接 HTML)。一个简单的静态网站可以通过将HTML、CSS和JavaScript等文件放入静态服务器中或者本地文件系统中,通过浏览器进行访问。

Server Components

在 Next.js 中,组件默认被视为 Server Components。Server Components 是在构建时生成静态页面的一种方式。让我们看一个示例:

function Home() {
return (
<main>
<ComponentA />
</main>
);
}
async function ComponentA() {
const data = await fetchData(
'/some_data_that_rarely_changes_so_we_fetch_when_building'
); return <div className='component-a'>{data}</div>;
}

在构建时,上述代码会生成如下的HTML:

<main>
<div className='component-a'>
some data that rarely changes
</div>
</main>

这意味着数据在构建时就被获取,并且在每个用户请求页面时都是相同的,因为数据几乎不会发生变化。

Client Components

但如果我们希望在每次用户访问页面或与页面交互时获取新数据,就需要使用 Client Components。以下是一个示例:

'use client';
// ...
export function ComponentB() {
const [count, setCount] = useState(0);
const [data, setData] = useState();
useEffect(() => {
fetchData(
`/some_frequently_changing_data_so_we_fetch_every_time_user_open_the_page_or_click_the_button?param=${count}`
).then(setData);
}, [count]); return (
<div className='component-b'>
<div className='count'>{count}</div>
<button onClick={() => setCount((val) => val + 1)}>add</button>
<div className='data'>{data}</div>
</div>
);
}
function Home() {
return (
<main>
<ComponentA />
<ComponentB />
</main>
);
}

在构建时,上述代码会生成如下的HTML:

<main>
<div className='component-a'>
some data that rarely changes
</div>
<div className='component-b'>
<div className='count'>0</div>
<button>add</button>
<div className='data'></div>
</div>;
</main>

这里的关键区别在于 some_frequently_changing_data 只有在用户打开页面且水合(Hydration)完成之后才会获取,或点击 "add" 按钮后才会获取,而不是在构建时就提前获取。

而传统的 SPA(Single Page Application),在构建后,通常你只会得一个空空如也的HTML:

<div id='root'></div>
<script src="app.js" />

在 app.js 下载和执行完成之前,用户只能面对一个空白的网页。

总结

在 Next.js 中,SSG 是一种强大的工具,它允许我们在构建时生成静态页面,从而提高性能和加载速度。通过 Server Components 和 Client Components,我们可以选择何时获取数据,以满足不同的需求。使用这些工具,你可以更灵活地构建出适应不同场景的网站。

5 分钟理解 Next.js SSG (Static Site Generation / Static Export)的更多相关文章

  1. 带你一分钟理解闭包--js面向对象编程

    上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...

  2. 带你一分钟理解闭包--js面向对象编程(转载他人)

    什么是闭包? 先看一段代码: function a(){ var n = 0; function inc() { n++; console.log(n); } inc(); inc(); } a(); ...

  3. 10分钟理解JS引擎的执行机制

    首先,请牢记2点: (1) JS是单线程语言 (2) JS的Event Loop是JS的执行机制.深入了解JS的执行,就等于深入了解JS里的event loop 1.灵魂三问 (1) JS为什么是单线 ...

  4. 十分钟理解Java中的动态代理

    十分钟理解 Java 中的动态代理   一.概述 1. 什么是代理 我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道 ...

  5. [转帖]SQL Server 10分钟理解游标

    SQL Server 10分钟理解游标 https://www.cnblogs.com/VicLiu/p/11671776.html 概述 游标是邪恶的! 在关系数据库中,我们对于查询的思考是面向集合 ...

  6. 十分钟理解JavaScript引擎的执行机制

    关注专栏写文章 十分钟理解JavaScript引擎的执行机制 方伟景 千锋前端开发推动市场提升的学习研究者. 4 人赞同了该文章 首先,请牢记2点: JS是单线程语言 JS的Event Loop是JS ...

  7. 理解Node.js的事件轮询

    前言 总括 : 原文地址:理解Node.js的事件轮询 Node小应用:Node-sample 智者阅读群书,亦阅历人生 正文 Node.js的两个基本概念 Node.js的第一个基本概念就是I/O操 ...

  8. 一分钟理解 HTTPS 到底解决了什么问题

    本文原作者“虞大胆的叽叽喳喳”,原文链接:jianshu.com/p/8861da5734ba,感谢原作者. 1.引言 很多人一提到 HTTPS,第一反应就是安全,对于普通用户来说这就足够了: 但对于 ...

  9. (转)每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)

    背景:在redis集群中,有关于一致性哈希的使用. 一致性哈希:桶大小0~(2^32)-1 哈希指标:平衡性.单调性.分散性.负载性 为了提高平衡性,引入“虚拟节点” 每天进步一点点——五分钟理解一致 ...

  10. 初步理解require.js模块化编程

    初步理解require.js模块化编程 一.Javascript模块化编程 目前,通行的Javascript模块规范共有两种:CommonJS和AMD. 1.commonjs 2009年,美国程序员R ...

随机推荐

  1. 沉思篇-剖析JetPack的Lifecycle

    这几年,对于Android开发者来说,最时髦的技术当属Jetpack了.谷歌官方从19年开始,就在极力推动Jetpack的使用,经过这几年的发展,Jetpack也基本完成了当时的设计目标--简单,一致 ...

  2. 天下苦 Spring 久矣,Solon v2.3.3 发布

    Solon 是什么框架? 一个,Java 新的生态型应用开发框架.它从零开始构建,有自己的标准规范与开放生态(全球第二级别的生态).与其他框架相比,它解决了两个重要的痛点:启动慢,费资源. 解决痛点? ...

  3. 【WebServer】项目总体流程

    1. 项目总体流程: 事件处理模式:采用Epoll边沿触发的IO多路复用技术,模拟Proactor模式: 主线程使用epoll监听与客户端连接的socket,并在主线程中对这些socket执行数据读写 ...

  4. 新建maven项目的时候idea的一些设置

    1.统一字符编码 2.开启注解生效激活 3.选择编译编码格式 4.设置忽略文件

  5. Java求数组元素的最大值和最小值

    代码如下: public static void main(String[] args) { int [] a = {1,2,3,88,2,90}; int max = a[0]; int min = ...

  6. 用postman模拟“授权代码授予”模式下获取Azure的用户信息(UserInfo)

    用postman模拟"授权代码授予"模式下获取Azure的用户信息(UserInfo) 1. 准备参数: 图1: 图2: 2. 调用: 点击按钮"Get New Acce ...

  7. Code Generate 代码生成器 V1.0

    Code Generate V1.0 代码生成器 根据配置的模板,根据建表语句,生成Code. 例如java代码.vue代码.jsp代码以及html代码等等,均可根据自己的代码写作习惯进行配置. 缺点 ...

  8. CSDN这么公然爬取(piao qie)cnblogs的文章,给钱了吗?

    在CSDN网站经常看到有博客转载cnblogs的文章,开始还以为是网友自行转载,后来才发现,这些所谓的转载应该都是机器爬取(piao qie)过去的.不知道cnblogs对此怎么看. 下面看看几个示例 ...

  9. 解决: better-scroll.esm.js?f40f:180 [BScroll warn]: EventEmitter has used unknown event type: "pullingUp"

    改为这样,把所有值设为true mounted() { // 滚动条 this.scroll = new BScroll(this.$refs.wrapper, { click: true, obse ...

  10. vim 配色调整

    ~/.vimrc " Configuration file for vim set modelines=0 " CVE-2007-2438 set number " se ...