5 分钟理解 Next.js Static Export

分钟,理解,next,js,static,export · 浏览次数 : 15

小编点评

**Next.js Static Export** Next.js 中的 Static Export 功能允许我们在构建网站时将页面提前生成为静态 HTML 文件,而不是在每次请求时动态生成。这可以提高网站的性能和降低网站托管成本。 **Static Export 的基本概念** * Static Export 是一个 Web 开发模式,它允许我们在构建网站时将页面提前生成为静态 HTML 文件。 * 静态网站由静态文件组成,这些文件包含所有页面内容,包括 HTML、CSS 和 JavaScript。 * 与 SSR (Server Side Rendering) 相比,静态页面不需要在每次请求时动态生成,这意味着页面内容在构建时就已经准备好。 * 与 SPA (Single Page Application) 相比,静态页面有利于 SEO且有更好的首屏加载性能。 **Server Components** Server Components 是 Next.js 中用于创建静态页面的组件。它们在构建时会根据页面类型渲染页面。 **Client Components** Client Components 是用于在用户每次请求页面时获取新数据组件。它们会根据页面状态进行渲染。 **Static Export 构建过程** 在 Static Export 构建时,页面会被分为多个静态文件,这些文件包含页面的 HTML、CSS 和 JavaScript。这些文件会被从静态服务器中加载,并用于构建最终的页面。 **示例** ```javascript function Home() { return (
); } ``` **Static Export 的优点** * 提高网站性能 *降低网站托管成本 *有利于 SEO *提供更好的首屏加载性能

正文

5 分钟理解 Next.js Static Export

在本篇文章中,我们将介绍:

  • Next.js 中的 Static Export 功能,以及它是如何工作的;
  • 在 Next.js 中如何使用 Server Components 和 Client Components 来实现不同的数据获取策略;
  • 一些相关的基本概念。

什么是 Static Export

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

  • 和 SSR(Server Side Rendering) 相比,可以提高网站的性能和降低网站托管成本:因为页面主要内容可以直接从静态文件中提供,而无需进行服务器端渲染;
  • 和 SPA(Single Page Application)相比,有利于SEO且有更好的首屏加载性能:因为作为网页骨架的 Server Components 是在构建时渲染的,只有少量的 Client Components 点缀其中。这也会进一步降低 Static Export 构建出的 JS bundle 大小。

什么是静态网站

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

Server Components

在 Next.js 中,组件默认被视为 Server Components。Server Components 在 Static Export 时可以生成静态页面。让我们看一个示例:

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>;
}

在 Static Export 构建时,上述代码会生成如下的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>
  );
}

在 Static Export 构建时,上述代码会生成如下的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_data_that_rarely_changes 在构建时就被获取;
  • some_frequently_changing_data 只有在用户打开页面且水合(Hydration)完成之后才会获取,或点击 "add" 按钮后才会获取,而不是在构建时就提前获取。

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

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

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

总结

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

与5 分钟理解 Next.js Static Export相似的内容:

5 分钟理解 Next.js Static Export

5 分钟理解 Next.js Static Export 在本篇文章中,我们将介绍 Next.js 中的 Static Export 功能,以及它是如何工作的。我们将介绍一些相关的基本概念,以及在 Next.js 中如何使用 Server Components 和 Client Components

5分钟理透LangChain的Chain

LangChain几乎是LLM应用开发的第一选择,它的野心也比较大,它致力于将自己打造成LLM应用开发的最大社区。而LangChain最核心的部分非 Chain 莫属。

Go方法特性详解:简单性和高效性的充分体现

本文深入探讨了Go语言中方法的各个方面,包括基础概念、定义与声明、特性、实战应用以及性能考量。文章充满技术深度,通过实例和代码演示,力图帮助读者全面理解Go方法的设计哲学和最佳实践。 关注【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品

《最新出炉》系列初窥篇-Python+Playwright自动化测试-5-元素定位大法-上篇

1.简介 说到元素定位,小伙伴或者童鞋们肯定会首先想到 selenium 的八大元素定位大法。同理Playwright也有自己的元素定位的方法。今天就给小伙伴或者童鞋们讲解和分享一下Playwright的元素定位方法。 宏哥对UI自动化的理解:定位元素 >操作元素 >断言。 2.定位器 定位器(Lo

带你彻底掌握Bean的生命周期

摘要:我们将深入研究Spring Framework的核心部分——Spring Bean的生命周期。 本文分享自华为云社区《Spring高手之路5——彻底掌握Bean的生命周期》,作者: 砖业洋__ 。 1. 理解Bean的生命周期 1.1 生命周期的各个阶段 在Spring IOC容器中,Bean

图数据挖掘:小世界网络模型和分散式搜索

哈佛大学心理学教授斯坦利·米尔格拉(Stanley Milgram)早在1967年就做过一次连锁实验,他将一些信件交给自愿的参加者,要求他们通过自己的熟人将信传到信封上指明的收信人手里。他发现,296封信件中有64封最终送到了目标人物手中。而在成功传递的信件中,平均只需要5次转发,就能够到达目标。也就是说,在社会网络中,任意两个人之间的“距离”是6。这就是所谓的六度分隔理论,也称小世界现象。尽管他

MySQL 执行计划详解

本文从EXPLAIN分析SQL的执行计划开始,进行示例展示,并对输出结果进行解读,同时总结了EXPLAIN可产生额外的扩展信息以及EXPLAIN的估计查询性能,整篇文章基于MySQL 8.0编写,理论支持MySQL 5.0及更高版本。

5分钟了解LangChain的路由链

路由链(RouterChain)是由LLM根据输入的Prompt去选择具体的某个链。路由链中一般会存在多个Prompt,Prompt结合LLM决定下一步选择哪个链。

5分钟带你了解RabbitMQ的(普通/镜像)集群

通过本文我们深入了解了RabbitMQ的集群模式及其优缺点。无论是普通集群还是镜像集群,都有其适用的场景和局限性。普通集群利用Erlang语言的集群能力,但消息可靠性和高可用性方面存在一定挑战;而镜像集群通过主动消息同步提高了消息的可靠性和高可用性,但可能会占用大量网络带宽。因此,在选择集群方案时,...

5分钟明白LangChain 的输出解析器和链

本文介绍 LangChain 的输出解析器OutputParser的使用,和基于LangChain的LCEL构建链。 1. 输出解析器OutputParser 1.1、为什么需要OutputParser 常规的使用LangChain构建LLM应用的流程是:Prompt 输入、调用LLM 、LLM输出