dotenv库(环境变量和模式)

316 阅读7分钟

dotenv库(环境变量和模式)

目录

[TOC]

前言

我们在 vite 构建的项目或者其他项目中常看到项目 根目录.env 文件,或许还看到 .env.development.env.production.env.test 等文件,这些是什么文件?又有什么作用?又是如何根据项目需要创建自定义的文件?

说明

首先,这些文件都是一种常用的环境 配置文件 ,用于存储应用程序的配置信息。这些文件通常包含键值对,每一行都是一个配置项,键和值之间使用等号(=)或冒号(:)进行分隔。

.env 是默认的环境配置文件,其中包含通用的配置项。在开发和生产环境下都可以使用这个文件,但通常不应包含敏感信息。

例如,一个示例的 .env 文件可能如下所示:

DB_HOST=localhost
DB_PORT=3000
DB_USER=username
DB_PASS=password

env.development 是用于开发环境的配置文件。你可以在其中包含开发环境特定的配置项,如调试标志、日志级别等。

.env.test 是用于测试环境的配置文件。你可以在其中指定在 单元测试 或集成测试期间所需的配置项,如测试数据库连接信息等。这个文件主要用于运行应用程序的 测试套件

.env.production 是用于生产环境的配置文件。你可以在其中包含生产环境特定的配置项,如 数据库连接信息 、API密钥等。这个文件通常只包含生产环境中需要的配置项,而不包含开发环境特有的配置。

node.js 原生支持 .env

从 Node.js v20.6.0 开始,Node.js 支持使用 .env 文件来配置环境变量。配置文件应遵循 INI 文件格式,每一行都包含一个环境变量的键值对。通过这个新的特性,就无需再使用第三方模块来加载 .env 中的环境变量了。

要使用预定义的配置初始化 Node.js 应用,请使用以下 CLI 命令:

node --env-file=config.env index.js。

例如,当应用初始化时,可以使用 process.env.PASSWORD 访问以下环境变量:

PASSWORD=nodejs

除了环境变量,这个更改还允许在 .env 文件中直接定义 NODE_OPTIONS 环境变量,无需将其包含在 package.json 中。

.env

.env 文件 用于配置环境变量 。环境变量是在运行应用程序时向操作系统或应用传递的值,用于控制应用的行为和设置。 .env 文件通常包含敏感信息(如数据库连接字符串、API 密钥等),因此它们被排除在代码版本控制系统之外,以保护这些敏感数据。

.env 文件使用键值对的格式,每一行都是一个环境变量的定义。例如:

  1. DB_HOST=localhost

  2. DB_USER=root

  3. DB_PASSWORD=123456

  4. API_KEY=abcdef123456

在 Node.js 中有一个 process 全局变量,其中的 env 属性可以访问系统中的环境变量。

在应用中,Node.js 无法自行维护本地环境变量,需要借助第三方库(如 dotenv ,它是一个零依赖的模块)来加载 .env 文件,并将其中的环境变量注入到 process.env 对象中。通过这种方式,可以轻松地从程序中访问这些环境变量,而不需要显式地硬编码它们。

dotenv库

在应用程序中,可以使 dotenv 库来读取 .env 文件中的配置信息,并将其作为环境变量使用。这样,在应用程序中就可以方便地访问和使用这些配置项。

许多流程的Node.js框架和工具链都支持使用它来加载环境配置文件,如:

  • Vite
  • Uniapp
  • Express.js
  • Koa.js
  • Hapi.js
  • Sails.js
  • Nest.js
  • Next.js
  • Create React App
  • Gatsby
  • Vue CLI
  • AdonisJS

当使用 dotenv 库时,你可以按照以下步骤从零开始配置和使用它。

1. 安装dotenv库

首先,在你的 Node.js 项目中安装 dotenv 库。使用 npm 或者 yarn 可以很方便地进行安装。在终端中运行以下命令:

npm install dotenv

或:

yarn add dotenv
2. 创建.env文件

在你的项目根目录下创建一个名为 .env 的文件,这将是你存放环境变量配置的地方。

3. 定义环境变量

.env 文件中,使用键值对的格式定义你的环境变量。例如:

DB_HOST=localhost
DB_PORT=3306
DB_USER=username
DB_PASS=password
4. 在应用程序中使用dotenv

在你的应用中,尽早导入并配置 dotenv 。例如,在你的主文件中,通常是 index.jsapp.js 中,添加以下代码:

require('dotenv').config();

或者在ES模块(例如:package.json的"type"字段设置为"module"):

import 'dotenv/config'
5. 访问环境变量

一旦 dotenv 加载了 .env 文件中的环境变量,你可以通过 process.env 对象来访问它们。例如,如果你在 .env 文件中定义了 DB_HOST 变量,你可以在代码中直接使用它:

const dbHost = process.env.DB_HOST;
console.log(dbHost); // 输出:localhost

process.env 对象默认包含了当前进程的环境变量。在启动Node.js应用程序时,操作系统会将一些默认的环境变量添加到 process.env 中,例如 PATHHOME 等。

这些默认的 环境变量 是与操作系统相关的,并且可能会有所差异。根据不同的操作系统(如Windows、Linux或Mac),其默认的环境变量也会有所不同。

dotenv 通过读取 .env 文件内容,并在解析后将键值对添加到 process.env 对象 。

确保在应用程序中使用唯一的键名来定义环境变量。避免使用已经存在的或与系统环境变量冲突的键名。可以通过添加前缀或 命名空间 来避免冲突。例如,如果你的应用程序是一个 命令行工具 ,可以使用 YOUR_APPNAME_ 作为前缀:

YOUR_APPNAME_DB_HOST=localhost
YOUR_APPNAME_API_KEY=123456

通常环境变量的命名格式为使用下划线连接的大写字母单词,为了保证命名统一,应该遵循这个约定。

自定义解析环境变量文件

除了上面步骤4默认的解析环境变量方式,还可以使用自定义解析。

dotenv 导出了一个 parse 方法用来解析环境变量,并返回一个包含解析后的包含键值对的对象。你可以自行读取 .env 文件内容,并将读取后的字符串传递到 parse 方法,便会得到一个环境变量对象。

例如在 vite 中,就将 dotenv 库当作一个解析器。 vite 会读取以下四个环境变量文件的内容,用导入的 parse 函数将其解析并合并,再过滤不是 VITE_ 前缀的属性,最后将这个对象赋值给 import.meta.env 对象。

const dotenv = require("dotenv");
const path = require("path");
 
// 获取 --mode 参数
const modeIndex = process.argv.indexOf("--mode");
const mode = modeIndex !== -1 ? process.argv[modeIndex + 1] : "development";
 
// 尝试按顺序加载环境文件:.env.mode.local, .env.mode, .env.local, .env
const envFiles = [`.env.${mode}.local`, `.env.${mode}`, ".env.local", ".env"];
 
/**
 * 如果同一个变量在多个文件中定义,会使用优先级最高的文件中的值
 * 每个文件都可以定义独特的变量,它们会被合并到最终的环境变量中
 */
envFiles.forEach((file) => {
  // 获取环境变量文件路径(根据当前工作目录)
  const envPath = path.resolve(process.cwd(), file);
  console.log(envPath);
  dotenv.config({
    path: envPath,
  });
});
 
module.exports = process.env;

上面代码中的 mode 就是 vite 命令的选项,用来指定运行 vite 时的模式,默认情况下,开发服务器 ( dev 命令) 运行在 development (开发) 模式,而 build 命令则运行在 production (生产) 模式。

如果你想定义一个 npm script 用来在测试环境构建项目,并使用 .env.test 文件中定义的变量作为环境变量。 可以复制 build 命令,并将命令名改为 build:test ,同时在 vite build 后面添加 --mode test

另外,在用命令行创建的 uniapp 项目中,可以在各个开发或者构建命令的最后添加 --mode <模式名称>  指定对应的环境变量文件,无论是使用 vue2 还是 vue3