为什么我会执着于使用 NextJs 开发项目

360影视 日韩动漫 2025-05-12 23:29 1

摘要:用 Next.js 已经有一年半了,自从开始使用之后,就再也没有单独用 React 写过项目。对于 react 开发者来说,不是在用 Next.js 开发,就是在学习 Next.js 的路上。

用 Next.js 已经有一年半了,自从开始使用之后,就再也没有单独用 React 写过项目。对于 react 开发者来说,不是在用 Next.js 开发,就是在学习 Next.js 的路上。

接下来我将用多个维度来分析一下为什么我会一直在用 NextJs,首先我先明确一点,对于 ToB 的项目,可能纯 React 更适合,至于具体什么类型的项目还是得自行考量了。

项目架构方面

对于项目构建方面,纯 React 可以使用 webpack,vite,rspack 这些构建工具,而他们也都有相对应的脚手架来快速创建,如果你想自己搭建一个脚手架也很方便,我们的开源项目 create-neat 就是跟 create-react-app 差不多的一个前端脚手架。

NextJs 的就是官方提供的 create-next-app,目前不仅支持 webpack,还支持 Turborepo,目前 rspack 也支持 NextJs 了,但是就是不知道效果怎么样:

SEO

最近在写一个面试的八股文网站,对 SEO 进行了一下优化,效果还是挺不错的:

在 SEO 方面,NextJs 明显是优于纯 React 的,纯 React 项目一般采用客户端渲染(CSR),简单来说,服务器返回的 HTML 是个“空壳”,等浏览器加载完 JavaScript 后,才动态生成页面内容。这种方式对用户体验来说没什么问题,但对搜索引擎来说却不太友好。因为搜索引擎爬虫抓取网页时,往往更擅长直接读取 HTML,而不是执行一堆 JavaScript 去拼出页面。如果 JS 出错、网络延迟,搜索引擎甚至可能直接抓个空页面。对于 Google 来说,它们的爬虫已经能很好地处理 JS,但像百度、必应等搜索引擎就没那么给力了。

Next.js 则完全不同。它支持服务端渲染(SSR)、静态生成(SSG)等模式,服务器返回的 HTML 就已经包含了完整的页面内容,浏览器和搜索引擎都能直接看到。这不仅让用户更快看到首屏内容,还让搜索引擎的爬取过程变得顺畅,网站的 SEO 自然表现更好。

更妙的是,Next.js 还内置了很多优化工具,比如 组件可以轻松设置页面的 和 ,自动路由让 URL 更语义化(比如 /blog/hello-world),还有图片优化、预加载、404 处理等,统统是为提升页面表现和搜索引擎友好度设计的。

总结起来就是:

React 是“内容靠 JS 渲染出来”,对 SEO 不够稳定。Next.js 是“内容直接写进 HTML”,让搜索引擎爱不释手。

所以,当你需要一个更适合做博客、官网、电商、CMS 的方案,Next.js 往往是更胜一筹的选择。

路由和页面组织

在谈到 React 和 Next.js 的区别时,路由和页面组织是一个非常值得关注的亮点。对于用惯了 React 的开发者来说,这部分的差异不仅影响代码结构,还直接影响开发效率和项目维护的舒适度。

在纯 React 里,路由系统并不是内置的,你通常需要引入第三方库,比如 React Router。配置路由时要手动写一张路由表,比如定义 path 和对应的组件,甚至还要手动处理嵌套路由、404 页面、重定向等。这给开发者带来了很大的自由度,但同时也意味着需要花时间去设计路由架构、维护路由配置。

Next.js 则采用了一套被很多人称为“约定优于配置”的路由系统。它基于文件系统自动生成路由,只要你在 pages 或 app 目录下放一个文件,它就自动变成一个可访问的路由。比如,pages/index.js 会映射到 /,pages/about.js 会映射到 /about,完全不需要写一行路由配置代码。对于动态路由,Next.js 提供了非常直观的命名方式:pages/blog/[id].js 就可以匹配 /blog/1、/blog/2 这样的动态路径。

到了 Next.js 13 及以后(包括最新的 Next.js 15),引入的 App Router 更是把页面组织提升到新高度。它提供了:

layout.js → 用于定义某个路径下的通用布局(比如统一的头部、侧边栏)page.js → 具体的页面内容loading.js → 页面加载时的占位 UIerror.js → 页面报错时的回退 UInot-found.js → 专门处理 404 页面

这样的设计让页面组织变得更模块化、更灵活,而且可以实现局部刷新、流式渲染、分片加载等高级特性,不仅优化了用户体验,也让开发体验大大提升。

相比之下,React 虽然也可以通过组件拆分、React Router 的嵌套路由去实现类似的效果,但需要开发者自己设计组件结构、管理状态,手动处理加载和错误状态,工作量大得多。

总结一下:

这就是为什么很多团队在做中大型项目时,会选择 Next.js:它不仅帮你省去了配置路由的麻烦,还带来了更先进的页面架构,让整个应用的可维护性和可扩展性大大提升。

在纯 React 里,我们通常需要手动配置路由。比如:

// App.jsximport { BrowserRouter as Router, Routes, Route } from "react-router-dom";import Home from "./pages/Home";import About from "./pages/About";import BlogDetail from "./pages/BlogDetail";function App { return ( } /> } /> } /> );}export default App;

Next.js 完全省去了显式配置,只靠目录结构就搞定:

/app /page.js → / /about/page.js → /about /blog/[id]/page.js → /blog/:id

代码示例:

// app/page.jsexport default function Home { return

Home Page

;}// app/about/page.jsexport default function About { return

About Page

;}// app/blog/[id]/page.jsexport default function BlogDetail({ params }) { return

Blog ID: {params.id}

;}

动态路由直接用 [id] 命名,Next.js 自动帮你解析成 /blog/123 这样的路径,params 就是路由参数。

对于 404、Loading、Error 的处理,React 要手动写:

} />

Next.js 只要加文件:

/app/not-found.js → 404 页面/app/loading.js → 页面加载时显示/app/error.js → 报错时显示

中间件和安全性

在现代 Web 开发中,中间件和安全性是不可忽视的话题,特别是当项目逐渐复杂、需要处理权限、验证、限流、重定向等需求时。React 作为一个纯前端库,并没有内置这些能力,而 Next.js 作为全栈框架,恰恰在这方面帮开发者省去了大量功夫。

在纯 React 项目中,要实现中间件式的功能(比如登录校验、权限控制),你通常需要在客户端用高阶组件(HOC)或 useEffect 来判断:

import { useEffect } from "react";import { useNavigate } from "react-router-dom";function ProtectedRoute({ children }) { const navigate = useNavigate; useEffect( => { const user = localStorage.getItem("user"); if (!user) { navigate("/login"); } }, ); return children;}

这些检查发生在客户端,意味着:

页面先加载出来 → 再判断 → 再重定向 → 用户体验不好。如果暴露敏感接口,没有后端保护,光靠前端是挡不住的。

Next.js 提供了真正运行在 服务器或边缘节点的中间件。你只要在 middleware.js 里写逻辑,它会在请求进入页面前运行,不需要等页面加载完再处理。

比如,登录校验:

// middleware.jsimport { NextResponse } from "next/server";export function middleware(request) { const token = request.cookies.get("token"); if (!token) { return NextResponse.redirect(new URL("/login", request.url)); } return NextResponse.next;}export const config = { matcher: ["/dashboard/:path*"], // 只保护 /dashboard 路径};

这里做的事:

在请求阶段拦截,没登录直接 302 跳转。不需要客户端参与,安全性更高。可以运行在 Edge Runtime,速度非常快。

除了中间件,Next.js 还有其他内置安全优势:

API 路由 → 服务端接口封装在 /api 下,不暴露客户端源码。默认 HTTP 头优化 → 自动加上一些安全 header,比如 X-Content-Type-Options。图片优化与外链控制 → next/image 可以防止恶意图片攻击。环境变量分离 → .env.local 文件中的敏感信息只在服务端可用,不会打包到浏览器。

相比之下,React 项目要做这些,就需要配合额外的 Node.js 服务(比如 Express、Koa),并自己写中间件和安全策略。

NextJs 真的比 React 快或者慢吗?

很多人觉得 Next.js 是比 React 更快的框架,但其实事情没那么绝对。React 本身是一套纯前端库,它采用客户端渲染(CSR),用户需要等浏览器加载并运行完 JS 才能看到页面内容,这导致首次加载速度往往比较慢,但一旦进入应用,页面之间的切换会非常流畅。 Next.js 提供了 SSR(服务端渲染)、SSG(静态生成)、ISR(增量静态生成)等多种渲染方式,这些方式可以在服务器或构建时就生成完整的 HTML,让首屏加载更快,同时也让搜索引擎更容易抓取到页面内容。 特别是对于需要 SEO 的项目,比如博客、新闻站、电商,Next.js 的这些特性非常重要。

不过,Next.js 的 SSR 不是免费的午餐。每次请求服务器都要重新计算页面,如果页面复杂、接口多,可能导致服务器响应慢,甚至拖慢整体性能。而纯 React 项目可以完全托管为静态文件,没有服务器负担,在静态托管平台(如 Netlify、Vercel)上的表现也很稳定。

另外,Next.js 在页面切换上需要结合 React 的客户端路由才能做到像纯 React 那样流畅,否则频繁的 SSR 请求也可能带来卡顿。 也就是说,Next.js 本身并不是一台“更快的引擎”,它更像是一个全能的工具箱,提供了性能优化的手段,但能不能跑得快,还要看开发者怎么用。

如果你合理地为静态页面选择 SSG,为动态页面选择 SSR 或 ISR,再搭配客户端路由,Next.js 的性能可以非常出色。 但如果滥用 SSR,或是忽视服务器负载,它的性能甚至可能不如纯 React。最终,这两者的速度差距,并不是框架本身的“魔力”,而是架构选择和实践方式的不同。

为什么这么多远程团队选择 Next.js,尤其是那些靠 SEO 赚钱的项目?核心原因在于 Next.js 天生就为 SEO 友好场景设计,而这种场景往往和盈利直接挂钩。

对于内容网站、电商平台、SaaS 官网、媒体博客来说,SEO 是流量的生命线。纯 React 项目因为是客户端渲染,搜索引擎可能抓不到页面内容,尤其是在百度、必应等搜索引擎上表现不理想。而 Next.js 提供的 SSR、SSG、ISR 渲染方式,能保证搜索引擎直接拿到完整 HTML,大大提高收录率和排名。这对远程团队来说至关重要,因为一旦 SEO 做得不好,可能直接影响到收入。

同时,Next.js 的文件路由、动态路由、布局、错误处理等机制,让复杂项目的页面组织和路由管理变得非常清晰,降低了沟通成本。远程团队可以根据业务模块分工,例如:一组人负责电商的商品页,一组人负责博客内容页,一组人负责后台管理页,各自独立开发而不互相踩坑。

更重要的是,Next.js 支持 React Server Components 和中间件,让数据获取、权限控制、A/B 测试、个性化推荐等关键功能可以在服务端完成,不仅速度快,还能保证数据安全。这对于远程团队来说非常重要,因为他们无法像本地团队一样紧密协作,有一个可靠、统一的框架能减少大量协调工作。

总的来说,远程团队选择 Next.js,不是因为它炫酷或新潮,而是因为它帮他们解决了最核心的需求:用高性能、可扩展、SEO 友好的方式,把产品推到用户和搜索引擎面前,从而实现稳定盈利。

再提一个现实一点的话题吧,无论是我做过的远程还是我面过的,都是在用 NextJs,我还试过一次从纯 React 重构成了 NextJS 项目。

总结

纯 React 学习 NextJS 没有多大的负担,看两眼文档就可以直接写项目了,至于什么时候该用 NextJS 其实没有那么多可以考虑的,后台管理系统同样也可以。

来源:墨码行者

相关推荐