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. 【Leetcode】 # 20 有效的括号 Rust Solution About Rust Stack implement

    给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效.有效字符串需满足:    左括号必须用相同类型的右括号闭合.    左括号必须以正确的顺序闭合.注意空字符 ...

  2. 2023-06-14:我们从二叉树的根节点 root 开始进行深度优先搜索。 在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度) 然后输出该节点的值。(如果节点的深度为 D,则其

    2023-06-14:我们从二叉树的根节点 root 开始进行深度优先搜索. 在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度) 然后输出该节点的值.(如果节点的深度为 D,则其 ...

  3. .NET 5 的烦恼

    由于微软工程师的辛勤脑洞和劳作,.NET 生态如何演变完全看他们的决策,其中包含社区吸纳内容.团队讨论结果等等,不乏一些工程师.架构师偏好,很难摸得准.   就比如这一次未来规划,他们希望将 .NET ...

  4. 关于SQL SERVER 字段类型char(n) , nchar(n) , varchar(n) , nvarchar(n)

    对于很多新手来说,经常被字段类型搞得晕头转向,今天我用通俗易懂的解释帮大家理解这些类型. 在数据库字段类型定义中,可以分为两大类,一类为Unicode类型,另一种就是非Unicode. Unicode ...

  5. 学习jQuery核心内容这一篇就够了

    jQuery 1. 介绍 jQuery是JavaScript的工具库,对原生JavaScript中的DOM操作.事件处理.数据处理等进行封装,提供更便捷的方法. 让我们用更少的代码完成我们的js操作 ...

  6. JAVA小白找工作必备建议

    如果您是一名刚入门的JAVA小白,正在寻求工作机会,那么恭喜您来对地方!本文将为您提供一些建议,帮助您在求职过程中更好地展现自己的优势和准备迎接新的挑战. 1.基础知识打牢 在找工作前,务必确保您对J ...

  7. Java与PHP的区别

    1.PHP暂时不支持像Java那样的JIT运行时编译的热点代码,但PHP具有opcache机制,能够将脚本对应的opcode缓存在内存中. 补充:JIT与JVM的三种执行模式:解释模式.编译模式.混合 ...

  8. [爬虫]1.2.1 HTML标签和属性

    HTML(HyperText Markup Language)是一种用于创建网页的标记语言.HTML文档由一系列的HTML标签构成,每个标签都有自己的意义和用途.HTML标签通常成对出现,由一个开始标 ...

  9. zabbix system.run

    Zabbix的system.run是一个主动模式的监控项,它允许用户在Zabbix服务器上执行自定义的命令或脚本,并获取执行结果作为监控数据. system.run监控项的配置包括以下几个关键参数: ...

  10. Linux 命令:find/grep/sed/awk/du/df

    目录 find grep sed awk du/df find # find 属于全部匹配,如输入abc,不能查到abcd # find 默认采用递归搜索 # 按时间 find . -atime -1 ...