Oasis's Cloud

一个人的首要责任,就是要有雄心。雄心是一种高尚的激情,它可以采取多种合理的形式。
—— 《一个数学家的辩白》

[mini-next.js] 总览:Next.js 核心架构分析

作者:oasis


引言

Next.js 是一个基于 React 的全栈框架,它提供了文件系统路由、服务端渲染、静态生成等强大功能。本文将从宏观角度分析 Next.js 的核心架构,为后续深入实现打下基础。

Next.js 的核心功能模块

1. 路由系统 (Routing)

Next.js 提供了两种路由系统:

  • Pages Router:基于 pages 目录的文件系统路由
  • App Router:基于 app 目录的新路由系统(Next.js 13+)

核心职责

  • 扫描文件系统,构建路由映射表
  • 匹配 URL 路径到对应的页面组件
  • 处理动态路由参数

2. 开发服务器 (Development Server)

核心职责

  • 启动 HTTP 服务器
  • 处理客户端请求
  • 路由匹配和页面渲染
  • 提供热重载功能
  • 服务静态资源

3. 渲染系统 (Rendering)

Next.js 支持多种渲染模式:

  • SSR (Server-Side Rendering):服务端渲染
  • SSG (Static Site Generation):静态生成
  • CSR (Client-Side Rendering):客户端渲染

核心职责

  • 在服务端渲染 React 组件为 HTML
  • 处理布局嵌套(App Router)
  • 生成完整的 HTML 文档

4. 模块加载器 (Module Loader)

核心职责

  • 动态加载页面组件
  • 缓存模块以提高性能
  • 支持热重载时的缓存清除

5. 文件监听器 (File Watcher)

核心职责

  • 监听文件系统变化
  • 触发路由重新扫描
  • 清除相关模块缓存

整体架构图

┌─────────────────────────────────────────┐
│           CLI 命令入口                    │
│    (dev.js, build.js, start.js)          │
└──────────────┬──────────────────────────┘


┌─────────────────────────────────────────┐
│         开发服务器 (DevServer)           │
│  ┌──────────────┐  ┌──────────────┐    │
│  │  HTTP Server │  │ File Watcher │    │
│  └──────┬───────┘  └──────┬───────┘    │
└─────────┼─────────────────┼────────────┘
           │                 │
           ▼                 ▼
┌──────────────────┐  ┌──────────────┐
│   路由系统       │  │ 模块加载器   │
│  ┌────────────┐ │  │              │
│  │Pages Router│ │  │  - 加载组件  │
│  └────────────┘ │  │  - 缓存管理  │
│  ┌────────────┐ │  │  - 热重载    │
│  │App Router │ │  └──────────────┘
│  └────────────┘ │
└────────┬────────┘


┌──────────────────┐
│   渲染系统       │
│  ┌────────────┐ │
│  │SSR Renderer│ │
│  └────────────┘ │
│  ┌────────────┐ │
│  │App Renderer│ │
│  └────────────┘ │
└─────────────────┘

请求处理流程

Pages Router 流程

1. HTTP 请求到达

2. 解析 URL 路径

3. Pages Router 匹配路由

4. 模块加载器加载页面组件

5. SSR 渲染器渲染组件为 HTML

6. 返回 HTML 响应

App Router 流程

1. HTTP 请求到达

2. 解析 URL 路径

3. App Router 匹配路由

4. 加载所有相关布局(从根到当前路由)

5. 加载页面组件

6. App 渲染器嵌套渲染布局和页面

7. 返回 HTML 响应

核心数据结构

路由信息

javascript
// Pages Router
{
  path: '/about',           // URL 路径
  filePath: '/path/to/pages/about.js',  // 文件路径
  isDynamic: false,        // 是否为动态路由
  params: []               // 动态路由参数名列表
}

// App Router
{
  path: '/about',
  pagePath: '/path/to/app/about/page.js',
  layoutPath: '/path/to/app/layout.js',  // 当前路由段的布局
  isDynamic: false,
  params: []
}

模块缓存

javascript
Map<filePath, Component>

技术栈

  • Node.js:运行环境
  • React:UI 框架
  • React DOM Server:服务端渲染
  • chokidar:文件系统监听
  • 原生 HTTP 模块:HTTP 服务器

实现策略

我们将采用自顶向下的实现策略:

  1. 先理解整体架构(本文)
  2. 实现路由系统:从 Pages Router 开始
  3. 实现开发服务器:HTTP 服务器和请求处理
  4. 实现渲染系统:SSR 渲染
  5. 实现 App Router:新路由系统
  6. 优化开发体验:热重载、错误处理等

设计原则

1. 简化优先

这是一个教学项目,我们优先实现核心功能,简化复杂特性:

  • ✅ 实现核心路由和渲染
  • ❌ 暂不实现代码分割、CSS 处理等

2. 代码清晰

  • 使用中文注释
  • 函数职责单一
  • 代码结构清晰

3. 渐进式实现

  • 先实现基础功能
  • 再添加高级特性
  • 每一步都可以运行和测试

下一步

在下一篇文章中,我们将深入实现 Pages Router,这是 Next.js 最基础也是最重要的功能之一。

我们将:

  1. 分析文件系统路由的原理
  2. 实现路由扫描逻辑
  3. 实现路由匹配算法
  4. 处理动态路由

相关文件

  • src/router/file-system-router.js - Pages Router 实现
  • src/router/app-router.js - App Router 实现
  • src/server/dev-server.js - 开发服务器实现