源码浅析--dotenv的工作原理

94 阅读1分钟

dotenv

dotenv 是一个零依赖模块,可以将环境变量从文件加载到 process.env 中

简单实现

const fs = require("fs");
const path = require("path");

function parse(file) {
  return Object.fromEntries(
    file
      .toString()
      // win 的回车是 \r\n mac 的回车是\r unix回车是 \n
      .split("\r\n")
      .map(str => str.split("="))
  );
}
const hasOwnProp = Object.prototype.hasOwnProperty;

/**
 * 1、查找执行命令路径下的 .env 文件
 * 2、按照特定格式解析 .env 文件,转换成对象
 * 3、将解析得到的对象赋值到 process.env 下
 * @returns
 */
function config() {
  const filePath = path.resolve(process.cwd(), ".env");
  const result = {};
  // 如果当前目录下没有这个文件,则直接退出
  if (!fs.existsSync(filePath)) return result;
  try {
    // 从文件中解析出对象
    const parsed = parse(fs.readFileSync(filePath));
    Object.entries(parsed).forEach(([k, v]) => {
      // 如果不在 process.env 的时候再赋值
      if (!hasOwnProp.call(process.env, k)) {
        process.env[k] = result[k] = v;
      }
    });
  } catch (error) {}
  return result;
}

module.exports.config = config;