最近Edge的runtime已經越來越流行了
Edge的目的是在離用戶最近的位置處理請求,優化效能和回應時間
它們特別適合處理需要快速回應的輕量級操作,如內容自訂、請求修改等
我們之前實作的Server Actions 則更專注於處理表單提交和資料變更等操作
它們在伺服器上運行,可以直接存取資料庫和其他伺服器資源
以下是一些沒辦法在Edge Function內執行的api
檔案
const fs = require('fs');
fs.readFileSync('some-file.txt');
子執行緒
const { exec } = require('child_process');
exec('ls -l', (error, stdout, stderr) => {
console.log(stdout);
});
某些加密
const crypto = require('crypto');
const prime = crypto.generatePrimeSync(60);
如果你確定你的服務只需要Web API那你可以進行全域設定
next.config.js
module.exports = {
experimental: {
runtime: 'edge',
},
};
如果你只需要在某一個api上指定的話
你可以在api上使用
export const config = {
runtime: 'edge',
};
export default function handler(req) {
return new Response('Hello from the Edge!');
}
當然 你的Page也可以指定在edge上執行
// pages/edge-page.js
export const config = {
runtime: 'edge',
};
export default function EdgePage({ data }) {
return <div>{data}</div>;
}
export async function getServerSideProps(context) {
const res = await fetch('https://api.example.com/data');
const data = await res.json();
return {
props: { data },
};
}
middleware.ts
而我們的middleware則預設是在edge上執行
import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
import { auth } from "@/auth";
export async function middleware(request: NextRequest) {
const session = await auth();
console.log({ session });
if (!session) {
return NextResponse.redirect(new URL("/api/auth/signin", request.url));
}
const testGroup = Math.random() < 0.5 ? "A" : "B";
const response = NextResponse.next();
response.cookies.set("test_group", testGroup);
// 繼續處理請求
return response;
}
export const config = {
matcher: "/:path*/about",
};
當你上版之後 你也可以在Vercel上確認哪些是Edges上執行 哪些不是