Nextjs 原理

发布于 2025-12-09 · 5 分钟阅读

nextjs 是基于 React 的 SSR 框架 在 React 的基础上提供了许多开箱即用的功能和最佳实践,旨在简化 React 应用的开发,尤其是在服务器端渲染(SSR)、静态网站生成(SSG)以及其他 Web 应用的常见需求方面 与 react 的不同之处 1. 服务端渲

nextjs 是基于 React 的 SSR 框架

在 React 的基础上提供了许多开箱即用的功能和最佳实践,旨在简化 React 应用的开发,尤其是在服务器端渲染(SSR)、静态网站生成(SSG)以及其他 Web 应用的常见需求方面

与 react 的不同之处

1. 服务端渲染(SSR)



// Next.js 页面组件
export async function getServerSideProps(context) {
  const res = await fetch('https://api.example.com/data')
  const data = await res.json()
  return { props: { data } }
}

export default function Page({ data }) {
  return <div>{data}</div>
}

2. 静态站点生成(SSG)


export async function getStaticProps() {
  return {
    props: { data: '静态数据' },
    revalidate: 60 // ISR:每60秒重新生成
  }
}

3. 文件系统路由

pages/
  ├── index.js        → /
  ├── about.js        → /about
  ├── blog/
  │   ├── index.js    → /blog
  │   └── [slug].js   → /blog/:slug
  └── api/
      └── hello.js    → /api/hello

可以直接在 api 文件夹下写后端代码。请求接口,获取数据等

// pages/api/users.js
export default function handler(req, res) {
  res.status(200).json({ users: [] })
}

内置优化

  • 自动代码分割
  • 图片优化(next/image)
  • 字体优化
  • 脚本优化(next/script)

写法上的主要差异

路由系统


// React(通常使用 React Router)
import { BrowserRouter, Routes, Route } from 'react-router-dom'

// Next.js(基于文件系统)
// 自动生成路由,无需配置

数据获取

// React:通常在 useEffect 中获取
useEffect(() => {
  fetchData()
}, [])

// Next.js:使用特殊的数据获取方法
export async function getServerSideProps() {
  // 服务端获取数据
}

构建过程


// Next.js 构建时:
1. 识别页面类型(静态/动态)
2. 预渲染静态页面
3. 生成客户端 bundle
4. 设置服务端渲染处理器

架构对比

React 应用架构

客户端 ├── React 库 ├── 路由库(React Router) ├── 状态管理(Redux/MobX) ├── 构建工具(Webpack配置) └── 服务端渲染(需手动配置)

Next.js 应用架构

Next.js 框架 ├── React(内置) ├── 路由系统(文件系统) ├── 服务端渲染(开箱即用) ├── API 路由(Node.js) ├── 构建优化(自动配置) └── 部署优化(Vercel)

左右场景区别

使用 React 的情况:

  • 单页面应用(SPA)
  • 需要高度自定义构建配置
  • 应用主要在客户端运行
  • 不需要 SEO

使用 Next.js 的情况:

  • 内容型网站(博客、电商、文档)
  • 需要 SEO 优化
  • 需要服务端渲染
  • 全栈应用(前后端一体化)
  • 希望快速启动项目

总结

Next.js 在 React 的基础上,提供了完整的全栈解决方案,简化了配置,优化了性能,特别适合需要 SEO、服务端渲染或全栈开发的项目。而纯 React 更适合需要最大灵活性的 SPA 应用。

留言
还没有评论,来写下你的想法吧。