前段时间写公司官网用到了Nextjs,尝到了Nextjs在SSR方面的甜头,最近花时间研究了下其在B端(企业级)应用中的实现,话不多说,直接一把梭! Next.js 为使用者提供了多种实现模式,能够满足复杂业务需求和高性能要求。以下是常见的实现模式:
1. 静态生成 (Static Generation, SSG)
- 适用场景: 适用于内容不频繁变化的页面,如产品展示、帮助文档等。
- 实现方式: 在构建时生成静态HTML,页面加载速度快,适合SEO。
- 代码示例:
export async function getStaticProps() {
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.map(item => (
<div key={item.id}>{item.name}</div>
))}
</div>
);
}
2. 服务器端渲染 (Server-Side Rendering, SSR)
- 适用场景: 适用于需要频繁更新或依赖用户请求的页面,如仪表盘、实时数据展示等。
- 实现方式: 每次请求时在服务器端生成HTML,适合动态内容。
- 代码示例:
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.map(item => (
<div key={item.id}>{item.name}</div>
))}
</div>
);
}
3. 客户端渲染 (Client-Side Rendering, CSR)
- 适用场景: 适用于交互性强、数据频繁变化的页面,如用户仪表盘、实时通知等。
- 实现方式: 页面初始加载后,通过JavaScript在客户端获取数据并渲染。
- 代码示例:
import { useEffect, useState } from 'react';
export default function Page() {
const [data, setData] = useState([]);
useEffect(() => {
fetch('https://api.example.com/data')
.then(res => res.json())
.then(data => setData(data));
}, []);
return (
<div>
{data.map(item => (
<div key={item.id}>{item.name}</div>
))}
</div>
);
}
4. 混合渲染 (Hybrid Rendering)
- 适用场景: 适用于既有静态内容又有动态内容的页面,如电商产品详情页。
- 实现方式: 结合SSG和SSR,部分内容在构建时生成,部分内容在请求时生成。
- 代码示例:
export async function getStaticProps() {
const res = await fetch('https://api.example.com/static-data');
const staticData = await res.json();
return {
props: {
staticData,
},
};
}
export async function getServerSideProps(context) {
const res = await fetch('https://api.example.com/dynamic-data');
const dynamicData = await res.json();
return {
props: {
dynamicData,
},
};
}
export default function Page({ staticData, dynamicData }) {
return (
<div>
<div>
{staticData.map(item => (
<div key={item.id}>{item.name}</div>
))}
</div>
<div>
{dynamicData.map(item => (
<div key={item.id}>{item.name}</div>
))}
</div>
</div>
);
}
5. 增量静态再生 (Incremental Static Regeneration, ISR)
- 适用场景: 适用于需要定期更新内容的页面,如新闻网站、博客等。
- 实现方式: 在页面请求时重新生成静态页面,适合内容频繁更新的场景。
- 代码示例:
export async function getStaticProps() {
const res = await fetch('https://api.example.com/data');
const data = await res.json();
return {
props: {
data,
},
revalidate: 10, // 每10秒重新生成页面
};
}
export default function Page({ data }) {
return (
<div>
{data.map(item => (
<div key={item.id}>{item.name}</div>
))}
</div>
);
}
6. API路由 (API Routes)
- 适用场景: 适用于需要自定义后端逻辑的场景,如用户认证、数据处理等。
- 实现方式: 在
pages/api目录下创建API路由,处理前端请求。 - 代码示例:
// pages/api/data.js
export default function handler(req, res) {
res.status(200).json({ name: 'John Doe' });
}
7. 中间件 (Middleware)
- 适用场景: 适用于需要在请求到达页面之前进行处理的场景,如身份验证、重定向等。
- 实现方式: 在
middleware.js中定义中间件逻辑。 - 代码示例:
// middleware.js
import { NextResponse } from 'next/server';
export function middleware(request) {
if (request.nextUrl.pathname.startsWith('/dashboard')) {
return NextResponse.redirect(new URL('/login', request.url));
}
return NextResponse.next();
}
8. 自定义文档 (Custom Document)
- 适用场景: 适用于需要自定义HTML文档结构的场景,如添加全局样式、脚本等。
- 实现方式: 在
pages/_document.js中自定义文档结构。 - 代码示例:
// pages/_document.js
import { Html, Head, Main, NextScript } from 'next/document';
export default function Document() {
return (
<Html>
<Head>
<link rel="stylesheet" href="/styles.css" />
</Head>
<body>
<Main />
<NextScript />
</body>
</Html>
);
}
9. 自定义App (Custom App)
- 适用场景: 适用于需要全局状态管理、布局共享的场景。
- 实现方式: 在
pages/_app.js中自定义App组件。 - 代码示例:
// pages/_app.js
import Layout from '../components/Layout';
import '../styles/globals.css';
export default function MyApp({ Component, pageProps }) {
return (
<Layout>
<Component {...pageProps} />
</Layout>
);
}
10. 国际化 (Internationalization, i18n)
- 适用场景: 适用于多语言支持的B端应用。
- 实现方式: 使用Next.js内置的i18n支持或第三方库。
- 代码示例:
// next.config.js
module.exports = {
i18n: {
locales: ['en', 'fr'],
defaultLocale: 'en',
},
};
总结
Next.js 为使用者提供了多种实现模式,大家可以根据具体需求选择合适的模式。静态生成适合内容不变的页面,服务器端渲染适合动态内容,客户端渲染适合交互性强的页面,混合渲染和增量静态再生则适合内容频繁更新的场景。API路由、中间件、自定义文档和App等特性进一步增强了Next.js的灵活性,使其成为B端应用的理想选择。