.env 文件是一种简单的文本文件,用于存储环境变量,通常用于在开发和生产环境中配置应用程序。文件中的内容以键值对的形式存储,每一行代表一个环境变量的设置,格式为 KEY=VALUE。
.env 文件的用途
.env 文件的主要作用是将应用程序的配置与代码分离,尤其是那些敏感信息或可能因环境不同而变化的配置项(如数据库凭证、API 密钥等)。通过 .env 文件,开发人员可以避免将敏感数据直接硬编码在代码中,并且可以轻松切换不同的环境配置。
dotenv介绍
dotenv
是一个流行的 Node.js 库,用于将环境变量加载到 Node.js 应用程序中,特别是从一个名为 .env
的文件中。它提供了一种方便的方式来管理应用程序的配置,尤其是在开发和生产环境中。
主要功能
加载环境变量:
dotenv
可以读取.env
文件,并将其内容加载到process.env
中,使得应用程序可以方便地访问这些变量。支持默认值:你可以为环境变量设置默认值,以确保在某些变量未定义时应用程序仍然可以正常工作。
简化配置管理:通过集中管理环境变量,
dotenv
有助于将敏感信息(如 API 密钥、数据库凭据等)与应用程序代码分离,从而提高安全性和可维护性。
1. 安装 dotenv
使用 npm 或 yarn 安装 dotenv
:
npm install dotenv
# 或者
yarn add dotenv
2. 创建 .env
文件
在项目根目录下创建一个 .env
文件,内容为键值对格式,通常为:
PORT=3000
DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3
API_KEY=your_api_key_here
3. 在应用程序中引入 dotenv
在项目的入口文件(通常是 index.js
或 app.js
)中引入并配置 dotenv
:
require('dotenv').config();
console.log(`Server running on port: ${process.env.PORT}`);
console.log(`Connecting to database at ${process.env.DB_HOST}`);
4. 使用环境变量
一旦加载了 .env
文件中的变量,你就可以在应用程序的任何地方通过 process.env
访问它们:
const dbUser = process.env.DB_USER;
const dbPass = process.env.DB_PASS;
console.log(`Connecting to the database with user: ${dbUser}`);
注意事项
-
安全性:确保将
.env
文件添加到.gitignore
文件中,以防止它被意外提交到版本控制系统中,从而泄露敏感信息。在
.gitignore
文件中添加以下内容:.env
环境变量的类型:所有从
.env
文件中读取的值都是字符串。如果你需要其他类型(如布尔值、数字),你需要在代码中进行转换。-
加载多个
.env
文件:如果需要在不同环境中使用不同的配置,可以创建多个.env
文件(例如.env.development
,.env.production
),并在代码中根据环境手动加载适当的文件:const path = require('path'); const envFile = process.env.NODE_ENV === 'production' ? '.env.production' : '.env.development'; require('dotenv').config({ path: path.resolve(__dirname, envFile) });
示例
这是一个使用 dotenv
的完整示例:
// index.js
require('dotenv').config();
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;
app.get('/', (req, res) => {
res.send(`Hello, world! Running on port: ${port}`);
});
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});
node原生支持
在 Node.js 版本 20.6.0 及更高版本中,Node.js 自带了对 .env
文件的原生支持,不需要额外安装 dotenv
库。这使得你可以直接在应用中加载 .env
文件,而无需依赖第三方库。
使用 Node.js 原生 .env
支持的方法:
-
在根目录创建
.env
文件
跟之前的方式相同,创建.env
文件并定义你的环境变量。例如:PORT=3000 DB_HOST=localhost DB_USER=admin DB_PASS=secretpassword
-
通过
--env-file
参数加载.env
文件
启动 Node.js 程序时,通过--env-file
参数指定.env
文件的位置。node --env-file=.env index.js
这样,Node.js 会自动解析并将
.env
文件中的变量加载到process.env
对象中,无需dotenv
库。
示例
假设你的项目目录中有一个 index.js
文件,内容如下:
console.log(`Server will run on port: ${process.env.PORT}`);
console.log(`Database host is: ${process.env.DB_HOST}`);
启动这个项目:
node --env-file=.env index.js
输出结果将是:
Server will run on port: 3000
Database host is: localhost
优势
-
无需安装
dotenv
:直接使用 Node.js 内置功能来加载.env
文件,减少了依赖。 -
简化的命令行参数:通过
--env-file
直接加载文件,便于配置。
版本要求
为了使用这项功能,你需要 Node.js 20.6.0 或更高版本。如果你正在使用旧版本的 Node.js(如 20.6.0 之前的版本),仍然需要使用 dotenv
等第三方库。
你可以通过以下命令检查你的 Node.js 版本:
node -v
如果版本低于 20.6.0,你可以通过升级 Node.js 来获得这个原生支持。
process.loadEnvFile()介绍
process.loadEnvFile()
是从 Node.js 21.7.0 版本开始引入的一个新方法,它用于进一步简化 .env
文件中环境变量的加载过程。这个方法允许你在运行时通过代码动态加载 .env
文件,而不需要依赖外部库如 dotenv
,并且不再需要在启动命令中指定 --env-file
标志。
主要功能
动态加载
.env
文件:process.loadEnvFile()
可以在应用运行时通过代码加载.env
文件,这意味着你可以在程序逻辑中按需加载环境变量。无需外部库:不需要使用
dotenv
或其他类似的库。它提供了 Node.js 原生的环境变量加载支持。文件路径灵活:你可以指定加载的
.env
文件的路径,方便在不同环境或配置下使用不同的文件。
使用示例
-
假设有一个
.env
文件,内容如下:USER_NAME='Paweł Grzybek' API_KEY='your_api_key'
-
在 Node.js 代码中使用
process.loadEnvFile()
方法加载这个.env
文件:// index.js (async () => { await process.loadEnvFile('.env'); console.log(`Hi ${process.env.USER_NAME} 👋`); console.log(`Your API Key: ${process.env.API_KEY}`); })();
-
执行脚本:
node index.js
输出结果:
Hi Paweł Grzybek 👋 Your API Key: your_api_key
方法说明
异步方法:
process.loadEnvFile()
是异步方法,因此你需要使用await
或then()
来确保.env
文件正确加载后再使用环境变量。-
错误处理:如果文件不存在或读取失败,你可以使用
try...catch
来捕获错误并处理异常情况。try { await process.loadEnvFile('.env'); } catch (err) { console.error('Failed to load .env file', err); }
参数
filePath
:你可以指定.env
文件的路径(相对于当前工作目录),例如'.env'
、'config/.env.production'
等。options
(可选):未来可能会扩展支持额外的选项,类似dotenv
的配置参数,比如编码或变量替换等(截至 21.7.0 版本,还没有提供这些选项)。
使用场景
按需加载:有时你可能需要在不同阶段或模块中加载不同的环境变量,这种情况下
process.loadEnvFile()
可以灵活地满足需求,而不像dotenv
那样必须在应用启动时加载所有变量。简化配置:对于简单的项目,使用
process.loadEnvFile()
可以避免额外安装第三方库,简化配置过程。
总结
node读取环境变量的配置随着node版本的变化,使用方式也不同,可以根据个人使用的node版本进行选择。
-
process.loadEnvFile()
是 Node.js 21.7.0 版本新增的一个方法,用于动态加载.env
文件。 - Node.js 内置功能来加载 .env 文件,需要 Node.js 20.6.0 或更高版本。
- dotenv 是一个流行的 Node.js 库,它提供了一种方便的方式来管理应用程序的配置,无版本兼容问题