最近在面试,就写一些关于问到的面试题,同时也过一下知识点。
Next.js 是一个基于 React 的全栈开发框架,由 Vercel 开发和维护。它在 React 的基础上提供了额外的功能和优化,如服务器组件(Server Components)、流式渲染(Streaming)、服务器操作(Server Actions)等。
我认为 Next.js 最大的价值在于它简化了 React 应用的开发流程,特别是在处理服务器端渲染和路由方面,使我们能够构建高性能、SEO 友好的应用,而无需从零开始配置复杂的工具链。
我认为 Next.js 14 的主要特性包括:
这些特性共同提升了开发体验,使我们能够更快地构建高性能、可维护的应用。
App Router 是 Next.js 13+引入的基于文件夹的路由系统,它使用约定式路由,通过文件夹结构自动创建路由:
核心概念: 使用app
目录组织路由结构,每个路由段对应一个文件夹
特殊文件约定:
page.js
: 定义路由 UI 和公开访问点
layout.js
: 定义共享布局,可嵌套
loading.js
: 创建加载 UI ,自动集成 Suspense
error.js
: 处理错误,自动集成 Error Boundary
not-found.js
: 处理 404 错误
高级功能:
(groupName)
语法组织路由而不影响 URL 结构@folder
语法在同一页面显示多个路由(.)
、(..)
、(...)
语法拦截路由,如模态框示例结构:
app/
├── layout.js # 根布局
├── page.js # 首页
├── about/
│ └── page.js # /about 路由
├── blog/
│ ├── layout.js # 博客布局
│ ├── page.js # /blog 路由
│ └── [slug]/
│ └── page.js # /blog/[slug] 动态路由
与 Pages Router 相比,App Router 的主要区别:
在实际项目中,App Router 提供了更灵活、更强大的路由系统,特别适合构建复杂的应用。
这实际很容易搞混和不好理解。
组件渲染模式关注的是单个组件如何被处理和执行,通常的表述是:服务端组件(Server Components)、客户端组件(Client Components)。
页面渲染策略关注的是整个页面的生成时机和缓存行为,通常的表述是:静态站点生成(SSG)、服务器端渲染(SSR)、增量静态再生成(ISR)、客户端渲染(CSR)。
App Router 不标识就默认是 Server 组件,客户端组件使用use client
,服务端组件use server
。
在不强制申明路由段的情况下,由 Next 的分析工具在打包的时候自己分析的情况下:
如果强制申明路由段的情况下,在Page
页码下通过约定的字段声明,会高于打包工具分析。但force-static
会导致上面提到的第一种情况的服务端 Api 结果返空,通常我们只会去设置 ISR 的重新验证时间。
// 强制使用静态渲染
export const dynamic = 'force-static'
// 强制使用动态渲染
export const dynamic = 'force-dynamic'
// 按需使用动态渲染
export const dynamic = 'auto'
// 设置 ISR 重新验证时间
export const revalidate = 60 // 60 秒
设为 false.
过去 SSR 需要等待服务端渲染完毕、组件代码打包到 bundle 、完成水合后才能操作。Streaming SSR 可以一边渲染一边传输。
核心是采用 Suspense 在渲染的时候用一个占位符替代,等在服务端请求完毕,再流式传输给 html ,替代之前占位符,用`loading.js`、`page`内的 suspense 都可以触发这种流式渲染。 流式渲染特别适合包含多个独立数据区域的页面。
流式渲染不会触发(或者说没有意义),因为 MetaData 需要完整的 TDK 在第一时间就展示,就必须先等待 generateMetadata 的请求先完成。实验版本中有 streamingMetadata 的设置,可以流式传输 TDK 。
当一个标记为'use server'的服务器组件下嵌套了多个标记为'use client'的客户端组件时,这些客户端组件的内容会在服务器返回的初始 HTML 文档中展示。 这是因为:
服务端组件在服务器上渲染,不发送 JavaScript 到客户端。适用于不需要客户端交互的 UI 部分,可以显著减少 JavaScript 包大小,可以直接连接数据库、文件系统或其他后端服务,无需中间 API 层,内容在服务器端渲染, 搜索引擎可以更好地索引页面内容。 服务端组件不能使用 React Hooks 、浏览器 API 、事件处理器。不能响应客户端组件的状态变化,从服务端组件传递给客户端组件的 props 必须是可序列化的(不能是函数或类实例)。
当我们在浏览器开发工具的网络面板中看到带有"rsc"的请求时,这些是 React Server Components (RSC)的数据流请求。"rsc"代表"React Server Components",这是 Next.js 和 React 的服务器组件架构的核心部分。 这些请求的工作原理如下:
实际上,还有很多有关于 Nextjs 的面试题是可以问的,关于缓存、Edge Runtime 、MetaData 、ServerActions...
1
cccn 17 天前 ![]() nextjs 不想深入探究了,越来越难用。
|
![]() |
2
fgwmlhdkkkw 17 天前 via Android
对普通的正常用户来说,也要 ssr 吗?服务器吃得消吗?
|