UNPKG

ph-utils

Version:

js 开发工具集,前后端都可以使用(commonjs和es module)

100 lines (99 loc) 3.1 kB
import { parseEnv as readEnv, parseArgs } from "node:util"; import { readFileSync } from "node:fs"; import { join } from "node:path"; /** 配置信息 */ export let config = {}; /** * 解析环境变量; * 同时读取多个环境变量文件: .env, .env.local, .env.[development|test|production]; * 根据运行环境变量 `NODE_ENV` 读取不同的环境变量文件; * 同时支持手动通过运行命令指定 `NODE_ENV` 值, 不指定默认为: production * * ```bash * node test.js --NODE_ENV development * // or * node test.js -n development * ``` * * ```js * // test.js * parseEnvs(); * ``` * * @returns */ export function parseEnv(envFiles = [".env", ".env.local"]) { // development, test, production const files = [...envFiles]; let nodeEnv = process.env.NODE_ENV; const { values } = parseArgs({ options: { NODE_ENV: { type: "string", short: "n", }, }, strict: false, }); if (values.NODE_ENV != null && typeof values.NODE_ENV === "string") { nodeEnv = values.NODE_ENV; } if (nodeEnv == null) { nodeEnv = "production"; } process.env.NODE_ENV = nodeEnv; const envFile = `.env.${nodeEnv}`; if (!files.includes(envFile)) { files.push(envFile); } let envParsed = {}; for (let i = 0, len = files.length; i < len; i++) { const file = join(process.cwd(), files[i]); try { const envContent = readFileSync(file, { encoding: "utf-8", }); const envValue = readEnv(envContent); for (const key in envValue) { process.env[key] = envValue[key]; envParsed[key] = envValue[key]; } // eslint-disable-next-line } catch (err) { } } return envParsed; } /** * 解析配置文件并合并内容。 * * @param files - 要解析的配置文件列表,默认为 ["config.json", "config.local.json"]。 * @param runParseEnv - 是否运行环境变量解析,默认为 true。 * @returns 合并后的配置对象。 * * 该函数会根据当前环境加载相应的配置文件,并将其内容合并到最终的配置对象中。 * 如果指定的文件列表中不包含环境特定的配置文件,则会自动添加。 */ export function parseConfig(files, runParseEnv = true) { let d = [...(files || ["config.json", "config.local.json"])]; if (runParseEnv) { parseEnv(); } const envConfigPath = `config.${process.env.NODE_ENV}.json`; if (!d.includes(envConfigPath)) { d.push(envConfigPath); } for (let i = 0, len = d.length; i < len; i++) { const filePath = join(process.cwd(), d[i]); try { const content = readFileSync(filePath, { encoding: "utf-8", }); let contentJson = JSON.parse(content); config = { ...config, ...contentJson }; // eslint-disable-next-line } catch (err) { } } return config; }