Prefer local manifests for dashboard builds (#768)

This commit is contained in:
cloudneutral 2025-12-06 20:16:38 +08:00 committed by GitHub
parent 25e1c13398
commit 1e66b6a3fe
3 changed files with 37 additions and 13 deletions

View File

@ -9,7 +9,6 @@ const nextConfig = {
// 🚀 生产优化 —— 最关键的三行
// ===============================
output: "standalone", // 让 Next.js 生成可独立运行的最小产物(大幅减小 Docker 镜像)
swcMinify: true, // 使用 Rust 压缩器(比 Terser 快 ~20x
compress: true, // Gzip 压缩输出(确保小体积网络传输)
// 配置允许的外部图片域名

View File

@ -7,6 +7,8 @@ import { buildAbsoluteDocUrl } from './utils'
import type { DocCollection, DocResource, DocVersionOption } from './types'
const DOCS_MANIFEST_URL = 'https://dl.svc.plus/dl-index/docs-manifest.json'
const REMOTE_DOCS_ENABLED = process.env.ALLOW_REMOTE_DOCS_FETCH === 'true'
const FALLBACK_DOCS_INDEX = Array.isArray(fallbackDocsIndex) ? (fallbackDocsIndex as RawDocResource[]) : []
interface RawDocResource {
slug?: unknown
@ -43,35 +45,44 @@ async function fetchDocs(options?: { useCache?: boolean }): Promise<RawDocResour
const data = await response.json()
return Array.isArray(data) ? (data as RawDocResource[]) : []
} catch (error) {
console.error('Error fetching docs manifest:', error)
if (REMOTE_DOCS_ENABLED) {
console.warn('Error fetching docs manifest:', error)
}
return []
}
}
async function loadDocs(options?: { useCache?: boolean }): Promise<RawDocResource[]> {
if (!REMOTE_DOCS_ENABLED) {
return FALLBACK_DOCS_INDEX
}
const manifestDocs = await fetchDocs(options)
if (manifestDocs.length > 0) {
return manifestDocs
}
const fallbackDocs = Array.isArray(fallbackDocsIndex) ? (fallbackDocsIndex as RawDocResource[]) : []
return fallbackDocs
return FALLBACK_DOCS_INDEX
}
// 构建时数据获取:优先使用本地 fallback保证构建成功
async function loadDocsForBuildTime(): Promise<RawDocResource[]> {
// 构建时优先使用本地数据避免外部API调用导致构建失败
const fallbackDocs = Array.isArray(fallbackDocsIndex) ? (fallbackDocsIndex as RawDocResource[]) : []
const fallbackDocs = FALLBACK_DOCS_INDEX
if (fallbackDocs.length > 0) {
return fallbackDocs
}
// fallback为空时再尝试获取远程数据
console.warn('Fallback docs not found, attempting to fetch remote docs manifest...')
const manifestDocs = await fetchDocs({ useCache: true })
return manifestDocs
if (REMOTE_DOCS_ENABLED) {
console.warn('Fallback docs not found, attempting to fetch remote docs manifest...')
const manifestDocs = await fetchDocs({ useCache: true })
return manifestDocs
}
return []
}
async function getRawDocs(): Promise<RawDocResource[]> {

View File

@ -5,6 +5,10 @@ import fallbackArtifacts from '../../../public/_build/artifacts-manifest.json'
const ARTIFACTS_MANIFEST_URL = 'https://dl.svc.plus/dl-index/artifacts-manifest.json'
const FALLBACK_LISTINGS_URL = 'https://dl.svc.plus/dl-index/offline-package-manifest.json'
const REMOTE_ARTIFACTS_ENABLED = process.env.ALLOW_REMOTE_DL_FETCH === 'true'
const LOCAL_FALLBACK_ARTIFACTS = Array.isArray(fallbackArtifacts)
? (fallbackArtifacts as DirListing[])
: []
async function fetchListings(url: string, useCache?: boolean): Promise<DirListing[]> {
try {
@ -20,31 +24,41 @@ async function fetchListings(url: string, useCache?: boolean): Promise<DirListin
const data = await response.json()
return Array.isArray(data) ? (data as DirListing[]) : []
} catch (error) {
console.error(`Error fetching from ${url}:`, error)
if (REMOTE_ARTIFACTS_ENABLED) {
console.warn(`Error fetching from ${url}:`, error)
}
return []
}
}
async function loadDownloadListings(options?: { useCache?: boolean }): Promise<DirListing[]> {
const manifestListings = await fetchListings(ARTIFACTS_MANIFEST_URL, options?.useCache)
if (!REMOTE_ARTIFACTS_ENABLED && LOCAL_FALLBACK_ARTIFACTS.length > 0) {
return LOCAL_FALLBACK_ARTIFACTS
}
const manifestListings = REMOTE_ARTIFACTS_ENABLED
? await fetchListings(ARTIFACTS_MANIFEST_URL, options?.useCache)
: []
if (manifestListings.length > 0) {
return manifestListings
}
const fallbackListings = await fetchListings(FALLBACK_LISTINGS_URL, options?.useCache)
const fallbackListings = REMOTE_ARTIFACTS_ENABLED
? await fetchListings(FALLBACK_LISTINGS_URL, options?.useCache)
: []
if (fallbackListings.length > 0) {
return fallbackListings
}
// Last resort: use local fallback data
return fallbackArtifacts as DirListing[]
return LOCAL_FALLBACK_ARTIFACTS
}
// 构建时数据获取:优先使用本地 fallback 数据
async function loadDownloadListingsForBuildTime(): Promise<DirListing[]> {
// 构建时优先使用本地数据避免外部API调用导致构建失败
const localFallback = fallbackArtifacts as DirListing[]
const localFallback = LOCAL_FALLBACK_ARTIFACTS
if (localFallback.length > 0) {
return localFallback