topfans/frontend/utils/preloadApi/config.js

65 lines
1.4 KiB
JavaScript

// frontend/utils/preloadApi/config.js
// 配置加载器:合并用户配置与内置默认值,提取 fetcher 映射表
/**
* 内置默认值(与设计文档 §3 defaults 一致)
*/
const BUILTIN_DEFAULTS = {
ttl: 5 * 60 * 1000,
persistence: 'memory',
concurrency: 4,
timeout: 10000,
silent: true,
limits: {
maxEntrySizeKB: 1024,
maxMemoryEntries: 100,
maxFileCacheMB: 50
}
}
/**
* 加载并合并配置
* @param {object} userConfig - 用户提供的 preload.config.js export
* @returns {{ config: object, fetchers: object }}
*/
export function loadConfig(userConfig) {
if (!userConfig) {
throw new Error('[preload] config is required')
}
// 合并 defaults
const mergedDefaults = {
...BUILTIN_DEFAULTS,
...(userConfig.defaults || {}),
limits: {
...BUILTIN_DEFAULTS.limits,
...((userConfig.defaults && userConfig.defaults.limits) || {})
}
}
const config = {
defaults: mergedDefaults,
startup: userConfig.startup || [],
idle: userConfig.idle || [],
pages: userConfig.pages || {}
}
// 提取 fetcher 映射表
const fetchers = {}
const allEntries = [
...(config.startup || []),
...(config.idle || [])
]
for (const entries of Object.values(config.pages || {})) {
if (Array.isArray(entries)) allEntries.push(...entries)
}
for (const entry of allEntries) {
if (entry.key && typeof entry.fetcher === 'function') {
fetchers[entry.key] = entry.fetcher
}
}
return { config, fetchers }
}