mirror of
https://github.com/MoonTechLab/LunaTV.git
synced 2026-05-22 14:37:30 +08:00
fix: load dynamic config
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 =
|
||||||
|
|||||||
@@ -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 标记为 external,Edge 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;
|
||||||
|
|||||||
Reference in New Issue
Block a user