Oh MyUtils

.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));

相关工具