fix: load dynamic config

This commit is contained in:
shinya
2025-06-30 10:08:54 +08:00
parent 5c8360d9dd
commit 99d15544a4
7 changed files with 19 additions and 22 deletions

View File

@@ -22,6 +22,10 @@ COPY --from=deps /app/node_modules ./node_modules
# 复制全部源代码 # 复制全部源代码
COPY . . COPY . .
# 在构建阶段也显式设置 DOCKER_ENV
# 确保 Next.js 在编译时即选择 Node Runtime 而不是 Edge Runtime
ENV DOCKER_ENV=true
# 生成生产构建 # 生成生产构建
RUN pnpm run build RUN pnpm run build

View File

@@ -185,7 +185,7 @@ async function getVideoDetail(
return getDetailFromApi(apiSite, id); return getDetailFromApi(apiSite, id);
} }
export const runtime = 'edge'; export const runtime = process.env.DOCKER_ENV === 'true' ? 'node' : 'edge';
export async function GET(request: Request) { export async function GET(request: Request) {
const { searchParams } = new URL(request.url); const { searchParams } = new URL(request.url);

View File

@@ -43,7 +43,7 @@ async function fetchDoubanData(url: string): Promise<DoubanApiResponse> {
} }
} }
export const runtime = 'edge'; export const runtime = process.env.DOCKER_ENV === 'true' ? 'node' : 'edge';
export async function GET(request: Request) { export async function GET(request: Request) {
const { searchParams } = new URL(request.url); const { searchParams } = new URL(request.url);

View File

@@ -1,6 +1,6 @@
import { NextRequest, NextResponse } from 'next/server'; import { NextRequest, NextResponse } from 'next/server';
export const runtime = 'edge'; export const runtime = process.env.DOCKER_ENV === 'true' ? 'node' : 'edge';
export async function POST(req: NextRequest) { export async function POST(req: NextRequest) {
try { try {

View File

@@ -5,7 +5,7 @@ import { NextRequest, NextResponse } from 'next/server';
import { db } from '@/lib/db'; import { db } from '@/lib/db';
import { PlayRecord } from '@/lib/db'; import { PlayRecord } from '@/lib/db';
export const runtime = 'edge'; export const runtime = process.env.DOCKER_ENV === 'true' ? 'node' : 'edge';
export async function GET() { export async function GET() {
try { try {

View File

@@ -4,7 +4,7 @@ import { API_CONFIG, ApiSite, getApiSites, getCacheTime } from '@/lib/config';
import { SearchResult } from '@/lib/types'; import { SearchResult } from '@/lib/types';
import { cleanHtmlTags } from '@/lib/utils'; import { cleanHtmlTags } from '@/lib/utils';
export const runtime = 'edge'; export const runtime = process.env.DOCKER_ENV === 'true' ? 'node' : 'edge';
// 根据环境变量决定最大搜索页数,默认 5 // 根据环境变量决定最大搜索页数,默认 5
const MAX_SEARCH_PAGES: number = const MAX_SEARCH_PAGES: number =

View File

@@ -52,24 +52,17 @@ export const API_CONFIG = {
let cachedConfig: Config; let cachedConfig: Config;
if (process.env.DOCKER_ENV === 'true') { if (process.env.DOCKER_ENV === 'true') {
// 为了兼容 Edge Runtime这里通过 eval("require") 的方式按需加载 fs 和 path // 使用 Node.js 原生 require避免使用 eval 触发 V8 "Code generation from strings disallowed" 限制
// 避免在打包阶段将 Node 内置模块打进 Edge bundle。 // 这里在编译阶段即被 webpack 标记为 externalEdge Runtime 会被 tree-shaking 去掉
try { // eslint-disable-next-line @typescript-eslint/no-var-requires
// eslint-disable-next-line @typescript-eslint/no-implied-eval const fs = require('fs') as typeof import('fs');
const req = eval('require') as any; // eslint-disable-next-line @typescript-eslint/no-var-requires
const fs = req('fs') as typeof import('fs'); const path = require('path') as typeof import('path');
const path = req('path') as typeof import('path');
const configPath = path.join(process.cwd(), 'config.json'); const configPath = path.join(process.cwd(), 'config.json');
const raw = fs.readFileSync(configPath, 'utf-8'); const raw = fs.readFileSync(configPath, 'utf-8');
cachedConfig = JSON.parse(raw) as Config; cachedConfig = JSON.parse(raw) as Config;
} catch (error) { console.log('load dynamic config success');
console.error(
'[config] 读取 config.json 失败,回退至编译时配置 →',
(error as Error).message
);
cachedConfig = runtimeConfig as unknown as Config;
}
} else { } else {
// 默认使用编译时生成的配置 // 默认使用编译时生成的配置
cachedConfig = runtimeConfig as unknown as Config; cachedConfig = runtimeConfig as unknown as Config;