78 lines
3.1 KiB
TypeScript
78 lines
3.1 KiB
TypeScript
/**
|
||
* 客户端环境变量统一入口(Expo 推荐使用 EXPO_PUBLIC_ 前缀)
|
||
*
|
||
* 注意:
|
||
* - 这里读取的是构建时/运行时注入的环境变量(EXPO_PUBLIC_*)
|
||
* - 真机联调时不要用 localhost,改为电脑局域网 IP,例如:http://192.168.1.10:8000
|
||
*/
|
||
|
||
export type AppEnv = 'dev' | 'prod';
|
||
|
||
function getRequiredEnv(name: string): string {
|
||
const value = process.env[name];
|
||
if (!value) {
|
||
throw new Error(`缺少环境变量:${name}(请检查 .env 配置)`);
|
||
}
|
||
return value;
|
||
}
|
||
|
||
function getOptionalEnv(name: string, fallback: string): string {
|
||
return process.env[name] ?? fallback;
|
||
}
|
||
|
||
export type AppRuntimeEnv = 'local' | 'dev' | 'prod';
|
||
|
||
/**
|
||
* Release/TestFlight 场景下如果未注入 EXPO_PUBLIC_ENV,
|
||
* 默认回退到 prod(避免误打到 localhost 导致真机“无法发起网络请求”)。
|
||
*/
|
||
const DEFAULT_RUNTIME_ENV: AppRuntimeEnv =
|
||
typeof __DEV__ !== 'undefined' && __DEV__ ? 'local' : 'dev';
|
||
|
||
export const APP_ENV = (getOptionalEnv('EXPO_PUBLIC_ENV', DEFAULT_RUNTIME_ENV) as AppRuntimeEnv) ?? DEFAULT_RUNTIME_ENV;
|
||
|
||
function getApiBaseUrl(env: AppRuntimeEnv): string {
|
||
// 向后兼容:若直接提供了 EXPO_PUBLIC_API_BASE_URL,则优先使用(不再强制要求 *_DEV/_PROD)
|
||
const direct = process.env.EXPO_PUBLIC_API_BASE_URL;
|
||
if (direct && String(direct).trim()) return String(direct).trim();
|
||
|
||
// 约定:local/dev/prod 三套域名分别配置, 便于后续直接切环境而不改代码
|
||
if (env === 'local') {
|
||
return getOptionalEnv('EXPO_PUBLIC_API_BASE_URL_LOCAL', 'http://localhost:8000');
|
||
}
|
||
if (env === 'dev') {
|
||
return getOptionalEnv('EXPO_PUBLIC_API_BASE_URL_DEV', getOptionalEnv('EXPO_PUBLIC_API_BASE_URL_LOCAL', 'https://api.damer.fun'));
|
||
}
|
||
return getOptionalEnv('EXPO_PUBLIC_API_BASE_URL_PROD', getOptionalEnv('EXPO_PUBLIC_API_BASE_URL_LOCAL', 'https://api.damer.fun'));
|
||
}
|
||
|
||
export const API_BASE_URL = getApiBaseUrl(APP_ENV);
|
||
|
||
/**
|
||
* 调试:打印环境变量注入结果(仅开发环境)
|
||
*
|
||
* 用途:排查「为什么 API_BASE_URL 不是预期值」的问题(例如 .env.local/命令行注入/缓存导致)。
|
||
*
|
||
* 注意:在某些测试环境(如 vitest)里 `__DEV__` 可能不存在,需做兼容判断。
|
||
*/
|
||
if (typeof __DEV__ !== 'undefined' && __DEV__) {
|
||
const injected = {
|
||
EXPO_PUBLIC_ENV: process.env.EXPO_PUBLIC_ENV,
|
||
EXPO_PUBLIC_API_BASE_URL: process.env.EXPO_PUBLIC_API_BASE_URL,
|
||
EXPO_PUBLIC_API_BASE_URL_LOCAL: process.env.EXPO_PUBLIC_API_BASE_URL_LOCAL,
|
||
EXPO_PUBLIC_API_BASE_URL_DEV: process.env.EXPO_PUBLIC_API_BASE_URL_DEV,
|
||
EXPO_PUBLIC_API_BASE_URL_PROD: process.env.EXPO_PUBLIC_API_BASE_URL_PROD,
|
||
};
|
||
console.log('[Env] 注入的 EXPO_PUBLIC_*(用于 API_BASE_URL 计算):', injected);
|
||
console.log('[Env] 解析得到 APP_ENV:', APP_ENV);
|
||
console.log('[Env] 解析得到 API_BASE_URL:', API_BASE_URL);
|
||
}
|
||
|
||
/**
|
||
* 默认语言策略:
|
||
* - auto:优先设备语言(支持列表内时),否则回退 en
|
||
* - en/zh-TW:固定默认语言(仍允许用户在设置中手动切换并持久化)
|
||
*/
|
||
export const DEFAULT_LANGUAGE = getOptionalEnv('EXPO_PUBLIC_DEFAULT_LANGUAGE', 'auto');
|
||
|