温馨提示:如果你还是个 Next.js 新手,建议先阅读这篇 Next.js 最佳实践,照着这篇文章先把代码敲一遍
Next.js 是一个强大的框架,用于构建服务端渲染的 React 应用程序。 它提供了许多开箱即用的功能,例如:自动代码分割、静态站点生成和服务端渲染。 但是,主流教程中并未提及一些高级 Next.js 技巧。 在本文中,我们将介绍其中一些技巧,这些技巧将使你的应用程序更上一层楼。
Next.js 会自动对你的应用程序进行代码分割,这意味着它仅加载当前页面所需的代码。 然而,这对于没有考虑到代码分割的第三方库来说并不总是有效的
为了可以将第三方库进行代码分割,你可以使用动态导入。动态导入允许你按需加载模块,这有助于减少应用程序的初始包大小。
例如,不要 像这样导入第三方库
import moment from 'moment';
你可以像这样使用动态导入
const moment = dynamic(() => import('moment'));
这将按需加载 moment 库,这有助于减少应用程序的初始包大小
Next.js 会自动优化图片和其他静态资源,但把这些静态资源发布到快速可靠的内容分发网络 (CDN) 仍然很重要。
你可以使用阿里云,腾讯云,Amazon,Cloudflare 等厂商提供的 CDN 服务。这有助于提高性能并减少服务器的负载。
要为静态资源配置 CDN,可以在 next.config.js 文件中使用 assetPrefix 选项:
module.exports = {
...
assetPrefix: 'https://yourcdn.com/',
...
};
这样配置之后,会在你的静态资源 URL 前面加上 CDN 的 URL
如果你的应用程序有十分损耗性能的数据操作,例如复杂的数据库查询或 API 请求,那么在服务器端缓存结果来提高性能就非常重要。
Next.js 提供了内置的缓存 API,可用于在服务器端缓存数据。 缓存 API 是一个简单的键值存储,可用于存储和检索数据。
例如,你可以像这样缓存数据库查询的结果:
import { cache } from 'next/cache';
async function getPosts() {
const cachedPosts = await cache.get('posts');
if (cachedPosts) { return cachedPosts; }
const posts = await fetch('/api/posts');
await cache.set('posts', posts);
return posts;
}
以上检查数据库查询的结果是否已缓存,如果已经缓存了,则从缓存中返回数据。 否则,它从数据库中获取结果,然后缓存它们,最后返回它们。
通过在服务器端缓存耗性能的数据操作,你可以减少数据库和 API 服务器的负载,并提高应用程序的性能。
注意:缓存敏感数据时要小心。 一个好的经验法则是仅缓存公共数据(不要缓存需要身份鉴权的数据)
Next.js 提供了一项名为增量静态再生成 (ISR) 的强大功能,允许生成具有动态内容的静态页面。 这意味着可以创建快速且动态的页面,而无需牺牲性能。
使用 ISR,你可以生成页面的静态版本,稍后使用新的数据更新该页面。 举个例子,你可以使用 ISR 生成包含初始内容的静态博客文章页面,后续如果有新的新评论或其他动态内容进入时动态更新该页面。
要使用 ISR,需要在 getStaticProps 函数中定义 revalidate 选项。 此选项指定 Next.js 使用新数据重新生成页面的频率。
export async function getStaticProps() {
const data = await fetch('https://example.com/api/data');
const posts = await data.json();
return {
props: { posts },
revalidate: 60 // 每 60 秒重新生成页面
}
}
在此示例中,页面将每 60 秒使用来自 API 的新数据重新生成一次。 这意味着即使页面是静态的,你的用户也将始终看到最新的内容。
通过使用 ISR,可以创建性能绝佳的快速动态页面。 此功能对于经常添加新内容的「内容密集型」网站(例如博客或新闻网站)特别有用。
Next.js 提供了适合大多数需求场景的内置服务器。 但是,如果有 WebSocket 或自定义身份验证等更加高阶的需求,则可能需要使用自定义服务。
可以通过在项目根目录创建 server.js 文件来将自定义服务与 Next.js 结合使用。 该文件导出一个创建 HTTP 服务并处理请求的函数。
例如,以下是创建处理 WebSocket 的自定义服务的方法:
const http = require('http');
const WebSocket = require('ws');
const next = require('next');
const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev });
const handle = app.getRequestHandler();
const server = http.createServer((req, res) => {
// // 处理 HTTP 请求
handle(req, res);
});
const wss = new WebSocket.Server({ server });
wss.on('connection', (ws) => {
// 处理 websocket 建连
});
server.listen(3000, () => { console.log('Ready on http://localhost:3000');
});
这将创建一个 HTTP 服务器和一个监听端口 3000 的 WebSocket 服务器
注意:使用自定义服务器会使站点放弃自动静态优化,并从阻止你部署到 Vercel
通过使用 ISR 等高级 Next.js 功能,可以创建快速、可扩展且针对性能进行优化的 Web 应用程序。 这些技巧可以帮助你将 Next.js 应用程序提升到一个新的水平,并为你的站点用户提供最佳用户体验。
以上就是目前的全部内容,后续还会 持续更新更多技巧和案例 。 与往常一样,如果你有任何疑问,请随时与我联系或发表评论。 祝你愉快!
翻译 — Nov 14, 2023
Made with ❤ and at Guangzhou.