- packages/core: @aidir/core 底座库(src/pages 页面组件体 1:1 镜像路由树 / kit 站点外壳工厂 / content/blog / scripts) - sites/: 5 个独立 Next.js 网站(ai-stack / launchai / the-ai-ledger / devai-tools / findai) - 每站独立 package.json / next.config / tailwind / messages / .env / 构建 - src/app 约 56 个薄路由文件(re-export 底座页面 + 内联路由段配置 revalidate/dynamic) - src/site/brand.tsx 站点配置 + src/site/home.tsx 站点首页(createMarketingLayout / createHomePage 工厂) - generate-site.mjs: 站点生成器(新增网站 = SITES 加条目,零 Core 修改) - start-all-sites.sh: 一键启动 3001-3005 - next-config.mjs: 底座统一 Next 配置工厂(next-intl + MDX + standalone) - 五站共享同一套 PostgreSQL / Better Auth / Admin(设计文档 §42) - 验证: 5 站 build OK / typecheck OK / 55 路由冒烟 200 / 品牌-内容-截图 差异确认 / 登录-投票-重复检测 e2e PASS
55 lines
1.6 KiB
JavaScript
55 lines
1.6 KiB
JavaScript
// AI Directory Platform — 站点 Next.js 配置工厂
|
|
// 说明:站点 next.config.mjs 只需 `export { createSiteConfig as default } from "@aidir/core/next-config"`
|
|
// MDX/intl/turbopack 等构建依赖由底座包解析,站点零构建依赖。
|
|
import fs from "node:fs";
|
|
import path from "node:path";
|
|
|
|
import rehypePrism from "@mapbox/rehype-prism";
|
|
import nextMDX from "@next/mdx";
|
|
import remarkGfm from "remark-gfm";
|
|
import createNextIntlPlugin from "next-intl/plugin";
|
|
|
|
|
|
/**
|
|
* # 函数 createSiteConfig
|
|
* 说明:底座统一的站点 Next 配置(next-intl + MDX + 图片域名 + standalone)。
|
|
* 参数:opts.requestPath 站点 i18n request 文件相对路径
|
|
* 返回值:完整 Next 配置
|
|
*/
|
|
export function createSiteConfig({
|
|
requestPath = "./src/i18n/request.ts",
|
|
} = {}) {
|
|
const withNextIntl = createNextIntlPlugin(requestPath);
|
|
|
|
/** @type {import('next').NextConfig} */
|
|
const nextConfig = {
|
|
output: "standalone",
|
|
transpilePackages: ["@aidir/core"],
|
|
images: {
|
|
// 工具 logo 指向各官网 favicon,域名不可枚举,放开 https 通配
|
|
remotePatterns: [{ protocol: "https", hostname: "**" }],
|
|
},
|
|
pageExtensions: ["ts", "tsx", "mdx"],
|
|
turbopack: {
|
|
rules: {
|
|
"*.mdx": {
|
|
loaders: ["@mdx-js/loader"],
|
|
as: "*.js",
|
|
},
|
|
},
|
|
},
|
|
};
|
|
|
|
const withMDX = nextMDX({
|
|
extension: /\.mdx?$/,
|
|
options: {
|
|
remarkPlugins: [remarkGfm],
|
|
rehypePlugins: [rehypePrism],
|
|
},
|
|
});
|
|
|
|
return withNextIntl(withMDX(nextConfig));
|
|
}
|
|
|
|
export default createSiteConfig;
|