Next.js 学习笔记 —— 基础概念及使用方法详解

阅读时长 4 分钟读完

前言

随着 React 的流行,前端开发中的静态页面已经逐渐演变成了动态页面,这其中 Next.js 作为一款优秀的框架,既可以提供 Server-Side Rendering (SSR) 的能力,又能够完成简单快捷的静态网站生成,被广泛运用在企业级应用中,具有重要的实用性和研究价值。本篇文章将详细讲解 Next.js 的基础概念和使用方法,帮助读者快速掌握这个框架,并探讨其实用场景。

基础概念

Server-Side Rendering

随着 JavaScript 技术的发展,前端开发不断向着动态的方向进化,为了更好的用户体验,页面内容不再固定,需要动态获取。传统的前端渲染方式只有客户端渲染,但是这种方式会存在页面加载速度慢、SEO 难度大等问题。

Server-Side Rendering (SSR) 则是一种更优秀的渲染方式,它把组件内容在服务端渲染成 HTML 后再返回给客户端,从而提高了页面加载速度和可用性。Next.js 就是一款优秀的 SSR 框架。

预渲染

除了 SSR 之外,Next.js 还支持预渲染 (Pre-rendering)。预渲染类似于静态网站生成,它可以把路由链接预先生成好 HTML 文件,下次请求时直接返回静态文件,从而更快地完成页面加载。这种方式虽然不能动态更新内容,但是适用于内容静态化的场景。

Next.js 的特点

Next.js 的特点主要表现在:

  • 支持 Server-Side Rendering 和预渲染;
  • 自动处理 webpack 等配置,开箱即用;
  • 支持静态导出,可用于静态网站生成;
  • 支持热加载 (Hot Reloading);
  • 支持 TypeScript 等语言;
  • 支持使用多种 数据获取方式 (Data Fetching);
  • ESM Module,可直接使用 ES6+ 语言;
  • 集成了 React 和 React-DOM,无需手动引入;

以及更多特点。

使用方法详解

安装和初始化

首先,我们需要安装并初始化一个 Next.js 项目。可以通过以下方式安装:

其中 my-app 是项目名称。执行完毕之后,cd 进入项目,使用以下命令启动项目:

启动成功之后,可在浏览器中访问 localhost:3000

页面和路由

在 Next.js 中,我们可以定义页面和路由。一个页面对应一个文件,文件名为 pages 目录下的文件名,例如:index.js 对应主页,about.js 对应关于页面。

定义路由需要创建一个 _app.js 文件,将它放在 pages 目录下。例如:

在这个文件中,MyApp 函数为根组件,在渲染页面时都会使用这个组件,所以我们可以在其中定义一些全局的样式和组件。Component 则为实际要渲染的页面组件,pageProps 则为该页面的 props 属性。

数据获取

Next.js 提供两种获取数据的方式:服务端渲染数据以及客户端渲染数据。服务端渲染数据通常使用 getServerSideProps 函数,它可以在服务端获取数据然后将其传递到组件中,在组件中使用。这样用户在请求页面时会在服务端渲染好内容,然后再返回给客户端。这个函数可以在每个页面组件中使用。

例如:

-- -------------------- ---- -------
------ ----- -------- -------------------- -
  ----- --- - ----- --------------------------------------
  ----- ----- - ----- ----------

  ------ -
    ------ -
      ------
    --
  -
-

而使用客户端渲染数据则可以使用 useEffect 方法或者 ComponentDidMount 生命周期。

静态导出

Next.js 还提供了静态导出的功能,可以用于生成静态网站。只需要在页面组件中添加 getStaticProps 函数,再执行以下命令:

定义完毕之后,可以在生成的 out 文件夹中找到完整的静态网站。

实用性场景

Next.js 可以用于多个场景,例如:

  • 电商网站:通过 SSR 优化渲染性能;
  • 博客网站:预渲染优化页面加载速度;
  • 静态网站:生成静态网站。

总结

本文详细讲解了 Next.js 的基础概念和使用方法,同时也对其实用场景进行了介绍。Next.js 简单易用,功能丰富,非常适合用于快速开发中等规模的项目,是一款优秀的 SSR 框架。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64507320980a9b385b97cb9c

纠错
反馈