126 lines
3.3 KiB
JavaScript
126 lines
3.3 KiB
JavaScript
import path from "path";
|
||
import { fileURLToPath } from "url";
|
||
import { withContentlayer } from "next-contentlayer";
|
||
|
||
const __filename = fileURLToPath(import.meta.url);
|
||
const __dirname = path.dirname(__filename);
|
||
|
||
const nextConfig = {
|
||
// ===============================
|
||
// 🚀 生产优化 —— 最关键的三行
|
||
// ===============================
|
||
output: "standalone", // 让 Next.js 生成可独立运行的最小产物(大幅减小 Docker 镜像)
|
||
compress: true, // Gzip 压缩输出(确保小体积网络传输)
|
||
basePath: "/insight", // 👈 所有的路由都会带有 /insight 前缀
|
||
|
||
// 配置允许的外部图片域名
|
||
images: {
|
||
remotePatterns: [
|
||
{
|
||
protocol: 'https',
|
||
hostname: 'dl.svc.plus',
|
||
},
|
||
{
|
||
protocol: 'https',
|
||
hostname: 'www.svc.plus',
|
||
},
|
||
{
|
||
protocol: 'https',
|
||
hostname: 'images.unsplash.com',
|
||
},
|
||
],
|
||
},
|
||
|
||
webpack: (config) => {
|
||
// 添加 YAML 文件支持
|
||
config.module.rules.push({
|
||
test: /\.ya?ml$/i,
|
||
type: 'asset/source',
|
||
});
|
||
|
||
// 显式 alias,保证 Turbopack 也能解析
|
||
config.resolve.alias = {
|
||
...(config.resolve.alias ?? {}),
|
||
"@components": path.join(__dirname, "src", "components"),
|
||
"@i18n": path.join(__dirname, "src", "i18n"),
|
||
"@lib": path.join(__dirname, "src", "lib"),
|
||
"@types": path.join(__dirname, "types"),
|
||
"@server": path.join(__dirname, "src", "server"),
|
||
"@modules": path.join(__dirname, "src", "modules"),
|
||
"@extensions": path.join(__dirname, "src", "modules", "extensions"),
|
||
"@theme": path.join(__dirname, "src", "components", "theme"),
|
||
"@templates": path.join(__dirname, "src", "modules", "templates"),
|
||
"@src": path.join(__dirname, "src"),
|
||
"@": path.join(__dirname, "src"),
|
||
};
|
||
|
||
// 添加模块搜索路径
|
||
config.resolve.modules = [
|
||
...(config.resolve.modules || []),
|
||
__dirname,
|
||
path.join(__dirname, "src"),
|
||
];
|
||
|
||
return config;
|
||
},
|
||
async headers() {
|
||
return [
|
||
{
|
||
source: "/api/:path*",
|
||
headers: [
|
||
{ key: "Access-Control-Allow-Credentials", value: "true" },
|
||
{ key: "Access-Control-Allow-Origin", value: process.env.CORS_ALLOWED_ORIGINS || "https://console.svc.plus,http://localhost:3000" },
|
||
{ key: "Access-Control-Allow-Methods", value: "GET,POST,PUT,PATCH,DELETE,OPTIONS" },
|
||
{ key: "Access-Control-Allow-Headers", value: "Content-Type, Authorization, X-Requested-With, X-Account-Session" },
|
||
],
|
||
},
|
||
];
|
||
},
|
||
|
||
reactStrictMode: true,
|
||
typedRoutes: false,
|
||
turbopack: {
|
||
root: path.resolve(__dirname),
|
||
},
|
||
};
|
||
|
||
export async function redirects() {
|
||
return [
|
||
{
|
||
source: '/XStream',
|
||
destination: '/xstream',
|
||
permanent: true,
|
||
},
|
||
{
|
||
source: '/Xstream',
|
||
destination: '/xstream',
|
||
permanent: true,
|
||
},
|
||
{
|
||
source: '/XScopeHub',
|
||
destination: '/xscopehub',
|
||
permanent: true,
|
||
},
|
||
{
|
||
source: '/XCloudFlow',
|
||
destination: '/xcloudflow',
|
||
permanent: true,
|
||
},
|
||
];
|
||
}
|
||
|
||
export async function rewrites() {
|
||
return [
|
||
{
|
||
source: '/editor',
|
||
destination: 'http://localhost:4000',
|
||
},
|
||
{
|
||
source: '/editor/:path*',
|
||
destination: 'http://localhost:4000/:path*',
|
||
},
|
||
];
|
||
}
|
||
|
||
export default withContentlayer(nextConfig);
|