dotenv源码解读从.env文件中读取环境变量

  1. 简介

dotenv是一个读取.env文件的工具库,能够将.env文件中的环境变量读取到process.env中,使得在程序中可以方便地访问环境变量。本篇文章将从源码角度简要介绍dotenv的实现机制。

  1. 源码解读

dotenv库的主要代码存放在dotenv-webpack和dotenv两个仓库中,可从github上进行下载,下面是dotenv的主要源码解读:

首先,我们需要了解一些dotenv的用法。

require('dotenv').config()

这个命令会从当前目录中的.env文件中读取环境变量,并把这些变量存储到process.env中。我们可以在代码中使用process.env来访问这些变量。

dotenv库的实现很简单,它顺序执行以下步骤:

(1) 指定.env文件所在的路径
(2) 读取.env中的所有环境变量
(3) 将环境变量存储到process.env中

下面我们逐步分析这些步骤。

首先,我们可以看到dotenv库中的config操作,它是dotenv库最为核心的方法,文件实现代码如下:

function config(options: DotenvConfigOptions = {}): DotenvParseOutput {
  if (options.path) {
    const envConfig = parse(fs.readFileSync(options.path, { encoding: 'utf8' }))
    for (const k in envConfig) {
      if (!Object.prototype.hasOwnProperty.call(process.env, k)) {
        process.env[k] = envConfig[k]
      }
    }
    return envConfig
  }

  if (options.encoding) {
    console.warn('config() `options.encoding` is deprecated. Use `options.encoding` instead.')
  }
  const path = findUpSync('.env', { cwd: options.cwd ?? process.cwd() })
  if (path === null) {
    return {}
  }
  return config({ ...options, path })
}

从上面的代码片段中,我们可以看到doten库主要的实现逻辑:

  1. options.path指定.env文件的路径。
  2. 通过fs.readFileSync同步读取.env文件内容。
  3. 将.env文件中的所有key-value对进行解析。
  4. 将解析结果写入到process.env中。

实现步骤非常简单,主要是使用了一些node.js固有的库,具体实现请看下面的代码,其中parse方法实现很简单,直接把字符串按照换行符和等于号进行切割,生成一个键值对,如下:

export function parse(src: string, options?: DotenvParseOptions): DotenvParseOutput {
  const debug = createDebug('dotenv:parse')
  const debugKey = createDebug('dotenv:key')
  const vars = {}
  const newline = /\r\n|[\n\r\u2028\u2029]/g
  // 先用\n分割字符串,然后用=分割key-value,去掉空格
  src.split(newline).forEach((line, idx) => {
    // matching "KEY' and 'VAL' in 'KEY=VAL'
    const keyValueArr = line.match(/^\s*([\w.-]+)\s*=\s*(.*)?\s*$/)
    if (keyValueArr != null && keyValueArr.length > 1) {
      const key = keyValueArr[1]
      let val = (keyValueArr[2] || '')
      const end = val.length - 1
      const isDoubleQuoted = val[0] === '"' && val[end] === '"'
      const isSingleQuoted = val[0] === "'" && val[end] === "'"

      if (isSingleQuoted || isDoubleQuoted) {
        // remove quotes
        val = val.substring(1, end)

        if (isDoubleQuoted) {
          // handle escaped characters
          val = val.replace(/\\([\s\S])|(")/g, '$1')
        }
      } else {
        // interpret variables
        val = expandVariables(val, vars)
      }

      debugKey('%s=%s', key, val)
      vars[key] = val
    } else {
      const lineNumber = idx + 1
      if (line.trim() && !options?.ignoreProcessEnv) {
        console.warn(`dotenv: Invalid line ${lineNumber} in file ${options?.path ?? '.env' }: ${line}`)
      }
    }
  })

  return vars
}
  1. 示例说明

(1) 读取.env文件中的环境变量

首先,创建一个.env文件,内容如下:

TEST=hello world
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=123456
DB_PORT=3306

然后,我们在我们的项目中创建一个main.js文件,代码如下:

require('dotenv').config()

console.log(process.env.TEST) // 输出 hello world
console.log(process.env.DB_HOST) // 输出 localhost
console.log(process.env.DB_USER) // 输出 root
console.log(process.env.DB_PASSWORD) // 输出 123456
console.log(process.env.DB_PORT) // 输出 3306

在项目根目录执行 node main.js 命令即可查看结果。

(2) 指定.env文件的路径

有时候项目根目录并不是.env文件的目录,我们可以使用path配置项指定.env文件的目录:

require('dotenv').config({ path: '/custom/path/to/.env' })

这样dotenv在加载.env文件时,就会使用指定的路径。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:dotenv源码解读从.env文件中读取环境变量 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 老毛子百度云文件名批量修改器给百度网盘文件批量重命名的方法介绍(附下载)

    那么我将为大家详细讲解“老毛子百度云文件名批量修改器给百度网盘文件批量重命名的方法介绍(附下载)”的完整攻略。 什么是老毛子百度云文件名批量修改器 老毛子百度云文件名批量修改器是一款专门针对百度网盘的文件批量重命名工具,它可以帮助用户快速地对百度网盘中的文件进行批量重命名,提高工作效率。 下载老毛子百度云文件名批量修改器 首先,我们需要下载老毛子百度云文件名…

    other 2023年6月26日
    00
  • jQuery实现页面滚动时动态加载内容的方法

    当页面随着滚动动作不断上下移动时,我们往往希望页面可以动态地加载内容,实现更加流畅的用户体验。在这种情况下,jQuery是一个非常有用的工具,它可以轻松地实现这一任务。下面是一些详细介绍: 1. 理解jQuery的滚动事件和AJAX 首先,需要对jQuery的滚动事件有一定的了解,以及如何利用AJAX从后端获取数据。一旦我们掌握了这两个方面的知识,就可以开始…

    other 2023年6月25日
    00
  • eclipse项目怎么重命名? eclipse类重命名的技巧

    Eclipse项目重命名 在Eclipse中,重命名项目是一项常见的操作,可以帮助我们管理和维护项目。下面是重命名Eclipse项目的详细步骤: 在Eclipse中,右键单击要重命名的项目,在弹出菜单中选择”Refactor”(重构)和”Rename”(重命名)。 在弹出的对话框中,输入新的项目名称,并点击”OK”。 Eclipse会自动更新项目名称,并将其…

    other 2023年6月28日
    00
  • Swift编程中的初始化与反初始化完全讲解

    Swift编程中的初始化与反初始化完全讲解 在Swift中,初始化和反初始化是非常重要的概念。初始化可以让对象在创建的时候完成一些必要的设置,而反初始化可以在对象被销毁的时候清理一些占用的资源。本文将从以下几个方面完全讲解Swift中的初始化和反初始化。 基本概念 初始化 初始化是对象创建的一个过程,可以在对象创建的时候完成一些必要的设置,例如属性的初始化、…

    other 2023年6月20日
    00
  • Excel无法桌面右键新建工作表怎么办 Excel无法桌面右键新建工作表解决方法

    这里是详细讲解“Excel无法桌面右键新建工作表怎么办 Excel无法桌面右键新建工作表解决方法”的完整攻略。 问题描述 当我在桌面上右键点击Excel图标,选择“新建工作表”时,发现工作表没有被新建出来。这是什么问题?有什么解决方法吗? 可能原因 这个问题有几种可能的原因,包括: Excel没有正确安装或受到病毒的侵扰; 你的系统或Excel设置发生了错误…

    other 2023年6月27日
    00
  • 关于python:webgraphviz输出不会围绕决策树页面

    以下是关于Python中使用WebGraphviz输出不会围绕决策树页面的完整攻略,包含两个示例。 关于Python中使用WebGraphviz输出不会围绕决策树页面的攻略 在Python中,我们可以使用WebGraphviz库来可视化决策树。但是,有时候我们会发现输出的决策树页面没有围绕决策树而是在页面的左上角。以下是两个示例: 1. 使用Graphviz…

    other 2023年5月9日
    00
  • 利用IDEA工具修改Maven多模块项目标识包名全过程记录

    利用IDEA工具修改Maven多模块项目标识包名全过程记录攻略 本攻略将详细介绍如何使用IDEA工具修改Maven多模块项目的标识包名。以下是完整的步骤记录: 步骤一:打开项目 首先,使用IDEA工具打开你的Maven多模块项目。 步骤二:定位要修改的包名 在项目结构中,定位到你想要修改的包名所在的模块。可以通过展开项目结构树,在src/main/java目…

    other 2023年9月7日
    00
  • 详解ios中自定义cell,自定义UITableViewCell

    1. 为什么要自定义UITableViewCell UITableView是iOS开发中常用的控件之一,它可以快速地展示数据。而UITableView的Cell是用来展示具体数据的,系统默认提供了一些样式的Cell供我们选择使用,但是在某些情况下,这些默认样式的Cell不足以满足我们的需求,这时我们就需要自定义UITableViewCell了。 2. 自定义…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部