面试题答案
一键面试构建角度
- 页面路由:Next.js 的页面路由基于文件系统,构建时会将页面文件(
.js
、.jsx
、.ts
、.tsx
)转换为静态 HTML 或服务器端渲染(SSR)的组件。静态优化时,页面会生成 HTML 文件,对于动态路由参数,可使用getStaticProps
和getStaticPaths
进行预渲染。 - API 路由:API 路由(位于
pages/api
目录下)构建后会成为可独立调用的后端接口。构建过程会将这些文件编译为 Node.js 可执行代码,用于处理 HTTP 请求并返回数据。在 Serverless 架构下,它们会被打包成适合云函数执行的形式。 - 配合关系:页面路由在构建时若依赖 API 路由的数据,可通过在
getStaticProps
等函数中调用 API 路由获取数据,这样在构建阶段就能完成数据预取,提高页面渲染性能。
打包角度
- 页面路由:打包时,页面路由相关的代码会根据其使用情况进行优化。对于静态页面,会将所需的 JavaScript、CSS 等资源合并打包,减少加载次数。对于动态导入的部分,会进行代码拆分,按需加载。
- API 路由:API 路由打包相对独立,仅包含处理请求所需的逻辑代码和依赖。在 Serverless 架构下,会将 API 路由打包为轻量级的云函数包,以便快速部署和执行。
- 配合关系:页面路由在打包时,若有对 API 路由的请求,打包工具可优化请求逻辑,如合并重复请求或优化请求顺序。同时,确保 API 路由打包后的代码大小和性能不会影响页面路由的加载速度。
缓存策略角度
- 页面路由:
- 静态页面:可使用 HTTP 缓存策略(如
Cache - Control
头)进行长期缓存,减少重复请求。对于动态页面,若使用getStaticProps
且设置了revalidate
时间,Next.js 会在该时间间隔后重新验证数据,实现增量静态再生。 - 客户端缓存:在客户端可利用浏览器缓存机制,如 Service Workers,缓存页面资源,提高后续访问速度。
- 静态页面:可使用 HTTP 缓存策略(如
- API 路由:
- 服务器端缓存:可在 API 路由处理逻辑中实现缓存,如使用内存缓存(如
node-cache
)或分布式缓存(如 Redis),减少重复数据库查询或复杂计算。 - CDN 缓存:在 Serverless 架构下,CDN 可缓存 API 响应,根据请求头和响应头的设置决定缓存时长和范围,提高全球用户访问速度。
- 服务器端缓存:可在 API 路由处理逻辑中实现缓存,如使用内存缓存(如
- 配合关系:页面路由缓存依赖 API 路由数据时,需协调缓存策略。若 API 数据更新,需相应更新页面缓存。例如,API 路由更新缓存数据后,可通过某种机制通知页面路由重新获取数据(如 WebSockets 或自定义 HTTP 头)。同时,合理设置页面和 API 路由的缓存过期时间,避免数据不一致。
Serverless 架构下的资源利用和用户体验
- 资源利用:
- 页面路由:Serverless 架构下,页面路由生成的静态文件可存储在对象存储服务(如 AWS S3),通过 CDN 加速全球分发,降低存储和带宽成本。对于 SSR 页面,可利用 Serverless 函数按需执行渲染,根据流量动态分配资源。
- API 路由:API 路由作为 Serverless 云函数部署,根据请求量自动伸缩,仅在有请求时消耗资源。同时,与页面路由共用底层的云基础设施,如存储和网络资源,提高整体资源利用率。
- 用户体验:
- 页面加载速度:通过上述的构建、打包和缓存策略优化,页面加载速度得到提升。静态页面可直接从 CDN 快速获取,动态页面通过预渲染和增量静态再生,减少用户等待时间。
- API 响应速度:API 路由在 Serverless 架构下快速响应,且通过缓存策略减少处理时间,为页面路由提供及时的数据支持,进一步提升用户体验。