ph-utils
Version:
js 开发工具集,前后端都可以使用(commonjs和es module)
100 lines (99 loc) • 3.1 kB
JavaScript
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;
}