.env编辑器 - 解析、验证、比较和转换环境文件 在线工具
解析、验证、比较和转换.env文件。语法检查、并排对比、.env/JSON/YAML/Docker Compose格式转换 — 100%客户端处理,您的密钥永远不会离开浏览器。
.env内容
常见问题
什么是.env文件编辑器?
.env文件编辑器是一个在线工具,帮助开发者解析、验证、编辑、排序、比较和转换.env(dotenv)文件。它提供语法验证、字母排序、两个.env文件的并排比较,以及.env/JSON/YAML/Docker Compose之间的格式转换——全部在浏览器中100%运行。
如何使用这个.env编辑器?
1. 编辑标签:粘贴您的.env文件内容。工具会立即验证。2. 比较标签:将两个.env文件粘贴到并排面板中。3. 转换标签:粘贴任何支持格式的内容,选择输出格式。
我的数据安全吗?
您的数据100%安全,永远不会离开您的浏览器。所有处理完全在客户端JavaScript中进行。
执行哪些验证检查?
验证器检查:(1) 无效的变量名。(2) 缺少分隔符。(3) 重复键。(4) 空值。(5) 未关闭的引号。每个问题都包含行号。
.env文件比较如何工作?
比较工具分析两个.env文件,将每个变量分为四组:仅在文件A中(红色)、仅在文件B中(绿色)、不同的值(黄色)和相同(灰色)。
可以在哪些格式之间转换?
支持.env、JSON、YAML和Docker Compose environment之间的双向转换。转换器自动检测输入格式。
可以按字母顺序排序.env文件吗?
是的,排序功能按键名将所有变量按字母顺序(A-Z或Z-A)排列。注释会被保留并附加到下一个变量。
代码示例
// .env File Parser, Validator, and Converter
function parseEnv(content) {
const lines = content.split('\n');
const entries = [];
const errors = [];
const warnings = [];
const seen = new Map();
for (let i = 0; i < lines.length; i++) {
const lineNum = i + 1;
const raw = lines[i];
const trimmed = raw.trim();
if (!trimmed || trimmed.startsWith('#')) continue;
const eqIdx = trimmed.indexOf('=');
if (eqIdx === -1) {
errors.push({ line: lineNum, message: "Missing '=' separator" });
continue;
}
const key = trimmed.slice(0, eqIdx).trim();
let value = trimmed.slice(eqIdx + 1);
if (!key) {
errors.push({ line: lineNum, message: 'Empty key name' });
continue;
}
if (!/^[A-Za-z_]\w*$/.test(key)) {
errors.push({ line: lineNum, message: `Invalid name "${key}"` });
continue;
}
// Handle quoted values
if (value.startsWith('"') && value.endsWith('"')) {
value = value.slice(1, -1).replace(/\\n/g, '\n');
} else if (value.startsWith("'") && value.endsWith("'")) {
value = value.slice(1, -1);
} else {
const commentIdx = value.indexOf(' #');
if (commentIdx !== -1) value = value.slice(0, commentIdx);
value = value.trim();
}
if (seen.has(key)) {
warnings.push({ line: lineNum, message: `Duplicate key "${key}"` });
}
seen.set(key, lineNum);
entries.push({ key, value, line: lineNum });
}
return { entries, errors, warnings };
}
function envToJson(entries, indent = 2) {
const obj = {};
for (const { key, value } of entries) obj[key] = value;
return JSON.stringify(obj, null, indent);
}
function diffEnv(entriesA, entriesB) {
const mapA = new Map(entriesA.map(e => [e.key, e.value]));
const mapB = new Map(entriesB.map(e => [e.key, e.value]));
const onlyInA = [], onlyInB = [], different = [], identical = [];
for (const [key, valA] of mapA) {
if (!mapB.has(key)) onlyInA.push(key);
else if (mapB.get(key) !== valA) different.push({ key, valueA: valA, valueB: mapB.get(key) });
else identical.push(key);
}
for (const key of mapB.keys()) {
if (!mapA.has(key)) onlyInB.push(key);
}
return { onlyInA, onlyInB, different, identical };
}
// Usage
const result = parseEnv('DB_HOST=localhost\nDB_PORT=5432\nAPI_KEY=sk_live_abc');
console.log('Entries:', result.entries.length);
console.log('JSON:', envToJson(result.entries));