// 全局变量 let G: any if (typeof globalThis !== "undefined") { G = globalThis } else if (typeof window !== "undefined") { G = window } else if (typeof global !== "undefined") { G = global } else { G = {} } // Nodejs 环境变量 let Env: any if (typeof process !== "undefined") { Env = process.env } else { Env = {} } /** 获取环境变量 * * 全局变量访问的方式,相比直接从 `window` 对象上访问,有以下优势: * 1. 类型设置更方便(`window` 总得用 `(window)`) * 2. 可以跨平台,可以不用关心使用 `global`(NodeJS) 还是 `window` * 3. 更方便的设置默认值,可以提供 fallback 函数 * * * @param key 环境变量名,会从 `globalThis`、`window`、`global`、`process.env` 中查找 * @param fallback 默认值,可以通过具体值,也可以是一个函数,函数的返回值会作为默认值,当使用默认值时 * * * 优先级 globalThis > window > global > process.env > fallback * @example * let CDN = env("Moonvy_CDN_URL") * let canuseWebP = env("canuseWebP", checkCanuseWebP) */ export function env(key: string, fallback?: any | (() => T)) { let value = G[key] ?? Env[key] if (value === undefined) { if (typeof fallback === "function") { value = fallback() } else { value = fallback } } return value } /** 设置环境变量 * 全局变量优先级 globalThis > window > global */ export function setEnv(key: string, value: any) { G[key] = value return value }