我用五层架构重建了整个 Next.js 项目,从污染地狱爬上了性能天堂

6 阅读3分钟

“我们不只是开发功能,更在搭建一座长期可演化的工程大厦。”

在 React Server Components(RSC) 和 Next.js App Router 成为主流架构范式的今天,许多开发者仍在“性能”和“结构混乱”之间痛苦拉扯。本文将分享我在真实项目中不断试验、打磨,最终沉淀下来的架构设计方法——RSC 优先的五层架构模型(5-Layer Architecture)

它不仅提升了性能,更彻底解决了可维护性和可控性问题。


❌ 默认目录结构的问题

很多基于 Next.js 构建的项目会逐步陷入以下困境:

  • Client 组件向上传染,污染了原本能 SSR 的组件
  • 过度依赖 index.ts 导致依赖边界不清晰
  • 首屏加载变慢,LCP 高、TBT 爆炸、JS 包臃肿
  • 小改动带来系统性结构崩溃,维护代价极高

经过多轮战斗之后,我终于明白:

架构应该服务于团队的长期演进,而不是阻碍它。

于是我彻底推翻原有结构,从零构建了一套新模型。


🧱 五层架构模型简介

RootLayout → Page Layout → Page → View → Component

每一层都有严格的职责边界,并明确规定了哪些层可以使用 Client Component(CSC)。

层级职责说明是否允许 CSC是否允许改动
RootLayout顶层布局:定义 <html>、全局 Provider、样式等❌ 禁止❌ 冻结不可改
Page Layout路由级布局:如主框架导航栏、布局结构❌ 禁止❌ 冻结不可改
Page页面入口:生成 Metadata,调用唯一 View❌ 禁止❌ 冻结不可改
View视图层:组合多个组件构成完整页面❌ 禁止直接 CSC✅ 可随时调整
Component原子组件:具备 UI 行为逻辑,可含 useState/useEffect✅ 允许✅ 可随时修改

✅ 架构执行规则(必须遵守)

1️⃣ 只有 Component 层可以使用 use client

绝不允许 View/Page/Layout 层直接使用 use client,只允许在组件中声明。

// ✅ 合法写法,仅在组件内使用
'use client';
export function Chart() {
  ...
}
// ❌ 非法写法,污染上层结构
'use client';
export function DashboardView() {
  ...
}

2️⃣ 所有 CSC 都必须 Lazy 加载

所有 CSC 组件都必须通过 next/dynamic + ssr: false 实现懒加载,并强制执行统一命名规范:

// ✅ 推荐方式
import { ChartLazy } from '@/components/csc/chart-lazy';

// ❌ 禁止方式
import { Chart } from '@/components/csc/chart';

📂 所有 CSC 组件统一放在 components/csc/ 目录下,并以 xxx-lazy.tsx 命名。


3️⃣ 每个 Page 只返回一个 View

页面只负责生成 SEO Metadata 和调用 View。内容结构全部交给 View 层负责拼装:

export default async function Page() {
  return <ImageResizeView />;
}

4️⃣ View 层必须保持纯 RSC,不可被污染

View 层可以使用 Lazy 的 CSC 组件,但绝不允许直接引入 CSC。

// ✅ 允许:View 使用 Lazy 组件
import { CompressChartLazy } from '@/components/csc/compress-chart-lazy';

// ❌ 禁止:直接引入 CSC 会污染 View
import { CompressChart } from '@/components/csc/compress-chart';

这是保障 RSC 流、缓存可用、HTML 可预生成的关键。


📁 目录结构示例

采用DDD范式驱动的目录分层结构

/src
  ├── app
  │   ├── layout.tsx                  # RootLayout
  │   └── [locale]
  │       ├── layout.tsx              # Page Layout
  │       └── tools
  │           └── image-compress
  │               └── page.tsx       # Page

  ├── features
  │   └── image-compress
  │       └── image-compress-view.tsx  # View

  └── components
      ├── ui/
      └── csc/
          └── compress-chart-lazy.tsx   # Client Component(CSC)

🚀 实际收益提升

这套架构在我主导的 Toolbox 项目中已经应用于数十个工具页面,收获如下:

指标优化前 → 优化后
Lighthouse 分数提升 15–30 分
TBT降至 100ms 以下
首屏 JS(FLJ)缩减 300KB+
LCP控制在 2.5s 内
团队协作职责边界清晰,写代码不迷路

next build 全部页面 FLJ大幅降低,页面需要处理的JS少了,自然也就快了!

perf_build_result.png


🧠 写在最后

这套五层架构模型,适用于一切追求:

  • ✅ 高性能
  • ✅ 可维护性
  • ✅ RSC-first
  • ✅ SEO优化

的中大型 Next.js 项目。
它并不是一套通用的“套路”,而是一种严肃、稳定、可验证的架构哲学

你需要做的,就是把复杂度往下沉,把污染挡在边界之外。


👨‍💻 作者:AiMuo / Toolbox 项目
📎 项目地址:aimuo.com
📌 更多工程实践持续分享中,欢迎关注!