外观
SSG 应用
SSG 应用适合作为产品落地页。框架支持配置 output: "export" 的 Next.js、Nuxt 4 和 VitePress 2。
SSG 应用统一存放在 apps-home/ 目录下。程序会自动发现该目录下的独立应用,再由 STANDALONE_SSG_APPS_NAMES 排除 SSR 应用后执行静态生成。
自动发现 SSG 应用的代码实现
文件:src/utils/ConstantUtils.mts
注意:会过滤含有 _ 前缀和 _backup 后缀的目录。
typescript
/** 需要由 Nitro 实时渲染的独立应用(带监听端口,从 apps-home/ 目录自动发现) */
export const STANDALONE_SSR_APPS: Array<{ appName: string; appPort: number }> = [];
/** 静态生成的独立应用(从 apps-home/ 目录自动发现) */
export const STANDALONE_SSG_APPS: string[] = [];
if (existsSync(PATH_APPS_HOME)) {
const dirs = readdirSync(PATH_APPS_HOME)
.filter((name) => {
const fullPath = joinPath(PATH_APPS_HOME, name);
return statSync(fullPath).isDirectory() && !name.startsWith("_") && !name.endsWith("_backup");
})
.sort((a, b) => a.localeCompare(b));
for (const appName of dirs) {
if (isStandaloneSsrApp(appName)) {
STANDALONE_SSR_APPS.push({
appName,
appPort: STANDALONE_SSR_APP_START_PORT + STANDALONE_SSR_APPS.length,
});
} else {
STANDALONE_SSG_APPS.push(appName);
}
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Nuxt 4
开发配置
使用 build/nuxt.config.mts 中的 generateNuxtConfig 函数生成 Nuxt 配置:
typescript
import { generateNuxtConfig } from "#scripts/utils/nuxt.config";
export default generateNuxtConfig({
// 项目特定配置
});1
2
3
4
2
3
4
路径别名:@/* → ./app/*、@base/* → ../_base/app/*
自动发现机制
前端应用采用目录自动发现机制,开发脚本无需手动配置应用列表,新建应用后重启开发服务器即可自动识别。
apps-home/ 目录同样采用自动发现机制,扫描规则与 SPA 子应用一致 (过滤 _ 前缀和 _backup 目录)。STANDALONE_SSG_APPS 存储自动发现并判定的静态生成独立应用列表,需要实时渲染的应用归入 STANDALONE_SSR_APPS。
构建脚本会利用自动发现结果批量构建静态 Next.js、Nuxt 和 VitePress 应用; 需要实时渲染的 Nuxt 应用使用独立的 ssr:* 任务,详见 SSR 应用。
使用方式
在 apps/ 下创建新的 SPA 子应用,或 apps-home/ 下创建新的 Nuxt 应用时,只需确保:
- 目录名不以
_开头(_前缀用于_base等基础目录) - 目录名不包含
_backup(用于备份目录)
重启开发服务器后,新应用自动被识别并纳入启动/构建流程,无需修改任何配置文件。
Next.js
Next.js SSG 应用必须启用 output: "export",构建产物输出到 out/。 根级构建脚本对其显式执行 next build --webpack,避开当前 Next 16 Turbopack 在静态 Metadata 路由上的内部构建错误;不要直接使用默认的 next build 替代该命令。