Next.js笔记:缓存、缓存和缓存
随着vercel挖走react核心团队,服务端渲染已成为react的事实标准。nextjs@15引进的"use cache",很有可能成为下一代React的规范设计模式。React带来了自由度极高的前端构建模式,接踵而至的便是一系列rerender等性能灾难问题。
import { cache } from "react"
或fetch
可以避免generateMetadata
和default
重复发送请求。在nextjs15中,可以使用"use cache"
。revalidatePath("/", "layout")
可以立即重新构建所有页面缓存,但revalidateTag(·)
只会让缓存失效,并不会(也不能)立即构建所有相关函数。# 上传目录,全是静态文件
location /uploads/ {
alias /app/public/uploads/;
try_files $uri @nextjs;
expires 1y;
add_header Cache-Control "public, immutable";
}
# 对css、图片和字体等进行强缓存
location ~ ^/_next/static/(.*\.(css|jpg|jpeg|avif|png|webp|gif|svg|ico|woff2))$ {
alias /app/runtime/.next/standalone/.next/static/$1;
try_files $uri $uri/ @nextjs;
expires 1y;
add_header Cache-Control "public, immutable";
}
.markdown-body,.markdown-body * { all: revert;}
可以撤销所有tailwindcss的样式。@import "@/assets/(...).module.css";
可以实现将Module CSS当全局CSS用。try {return getDataFromDB()} catch{return []}
类似的写法。COPY --from=builder /app/.next/standalone ./.next/standalone
COPY --from=builder /app/.next/static ./.next/standalone/.next/static
process.env.xxx
会被编译器替换成环境变量。若xxx以NEXT_PUBLIC
开头,则会在客户端组件和服务端组件均生效,否则会在客户端组件中仅使用运行时的环境变量。process.env.xxx
的变量,会在编译阶段替换成常量,因此动态配置可以通过数据库+缓存来实现。export default async function Init() {
// 数据库初始化
console.log("Database connected. Start initializing...")
// 导入有可能被引用的模型
await import("@/models/user")
await import("@/models/post")
await import("@/models/tag")
await import("@/models/session")
await import("@/models/comment")
}
External
,即:/* next.config.js */
{
...
serverExternalPackages: ["mongoose", "@node-rs/jieba", "ip2region"]
...
}
location /_next/static/ {
alias /app/runtime/.next/standalone/.next/static/;
try_files $uri $uri/ @nextjs;
}
location / {
alias /app/public/;
try_files $uri @nextjs;
}
location @nextjs {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}
定义generateRSS()
函数,从数据库获取内容,返回rss/xml并写入到./public/rss.xml
。
在编译构建阶段和内容发生变化时,调用generateRSS()
重新生成rss.xml
文件。
通过@/app/rss/route.ts
作为rss.xml
生成失败的fallback。
在nextjs的配置文件中,将动态请求/rss.xml
时重写至/rss
处理。
async rewrites() {
return {
beforeFiles: [
{ source: "/rss.xml", destination: "/rss" },
]
}
}
/rss
和/rss.xml
的请求指向/app/public/rss.xml
文件,如果文件不存在再使用nextjs动态生成。location = /rss {
alias /home/uilq-next-app/public;
try_files /rss.xml @nextjs;
}
location = /rss.xml {
alias /home/uilq-next-app/public;
try_files /rss.xml @nextjs;
}