Next.js:让你的React应用从“裸奔”到“穿衣服”
我们用CRA(create-react-app)写的React应用,是纯客户端渲染(CSR)。服务器只返回一个空 Next.js是React的服务端渲染框架。它能在服务器端提前生成HTML,用户直接看到内容,然后再“激活”交互。而且它还能静态生成、服务端渲染、甚至当后端用。今天我们就来上手Next.js,解决“白屏+SEO”两大痛点。 Next.js同时支持SSR、SSG、CSR,你能根据页面特性选择不同渲染方式。 打开 在 页面链接用 适用于博客文章、产品页、帮助文档等不常变的内容。速度最快,可放CDN。 构建时 适用于用户个性化页面、实时数据页面。 每次访问都会调用 适用于仪表盘、后台管理等不需要SEO的部分。 在 访问 图片优化:用 假设一个博客站: 用户打开页面立刻看到文章,体验提升了7倍,SEO也来了。 如果你还在用CRA写非纯后台的系统,强烈建议试试Next.js。你的用户会感谢你,老板也会夸你。前言
<div id="root"></div>和一堆JS,浏览器先白屏,下载JS、执行完才显示内容。问题:一、Next.js解决了什么?一张图看懂
二、5分钟上手Next.js
npx create-next-app@latest my-app
cd my-app
npm run devhttp://localhost:3000。目录结构:pages/:路由系统,pages/index.js就是首页,pages/about.js就是/about。public/:静态资源。styles/:CSS。三、路由:不用react-router,文件即路由
pages下创建文件就是路由。pages/index.js → /pages/about.js → /aboutpages/blog/[slug].js → /blog/hello-world(动态路由)Link组件:import Link from 'next/link';
export default function Home() {
return (
<Link href="/about">关于我们</Link>
);
}四、预渲染的三种模式
1. 静态生成(SSG):在构建时生成HTML
// pages/blog/[id].js
export async function getStaticPaths() {
// 告诉Next.js有哪些动态路径需要生成
const paths = await fetchPosts().then(posts => posts.map(p => ({ params: { id: p.id } })));
return { paths, fallback: false };
}
export async function getStaticProps({ params }) {
const post = await fetchPost(params.id);
return { props: { post } };
}
export default function Post({ post }) {
return <div>{post.title}</div>;
}next build会生成每个文章的HTML。2. 服务端渲染(SSR):每次请求时在服务器生成HTML
// pages/profile.js
export async function getServerSideProps(context) {
const user = await fetchUser(context.req.cookies.token);
return { props: { user } };
}
export default function Profile({ user }) {
return <div>欢迎 {user.name}</div>;
}getServerSideProps,所以可以获取请求上下文(cookies、headers等)。3. 客户端渲染(CSR):就跟普通React一样
import { useEffect, useState } from 'react';
export default function Dashboard() {
const [data, setData] = useState(null);
useEffect(() => {
fetch('/api/dashboard').then(r => r.json()).then(setData);
}, []);
if (!data) return <div>加载中...</div>;
return <div>{data.chart}</div>;
}五、API Routes:把你的Next.js当后端用
pages/api下创建文件,就能写服务端代码,相当于一个小型Node后端。// pages/api/hello.js
export default function handler(req, res) {
res.status(200).json({ message: 'Hello Next.js!' });
}/api/hello得到JSON。你可以在这里连接数据库、验证请求、调用第三方API。这样就不需要单独起一个后端服务了。六、内置优化:你啥都没干,它帮你做了
next/image自动压缩、懒加载、生成webp。import Image from 'next/image';
<Image src="/logo.png" width={200} height={100} alt="Logo" />next/script控制加载时机(beforeInteractive、afterInteractive、lazyOnload)。七、实战:从CRA迁移到Next.js的收益
八、总结:别犹豫,新项目就用Next.js