cross-env 和 dotenv 是两个在 Node.js 开发中常用的工具,但它们解决的问题不同,用途也不同。下面是它们的核心区别:
🧪 1. cross-env
用途:
- 跨平台设置环境变量(特别是在 Windows、macOS、Linux 上统一行为)。
- 主要用于 命令行脚本 中设置临时的环境变量。
问题背景:
在 Unix-like 系统(如 macOS/Linux)中,你可以这样运行脚本并设置环境变量:
NODE_ENV=production node app.js
但在 Windows 上,这种语法不被支持,必须写成:
set NODE_ENV=production && node app.js
为了解决这种平台差异,cross-env 提供了统一的写法。
使用方式:
安装:
npm install --save-dev cross-env
使用(在 package.json 脚本中):
{
"scripts": {
"start": "cross-env NODE_ENV=production node app.js"
}
}
✅ 特点:
- 只在当前命令执行期间有效;
- 不读取
.env文件; - 用于命令行/脚本中临时设置环境变量;
- 解决跨平台兼容性问题。
🔑 2. dotenv
用途:
-
从
.env文件加载环境变量到process.env。 - 用于管理项目中的配置(如 API 密钥、数据库 URL 等)。
使用场景:
你有一个 .env 文件:
DB_HOST=localhost
DB_USER=admin
API_KEY=123456
在代码中加载:
require('dotenv').config(); // 必须在使用 process.env 之前调用
console.log(process.env.DB_HOST); // 'localhost'
安装:
npm install dotenv
✅ 特点:
- 从文件读取环境变量;
- 通常用于开发或部署时加载敏感/配置信息;
- 不处理跨平台命令行语法问题;
- 变量在 Node.js 进程启动后就加载进
process.env。
🆚 对比总结
| 特性 | cross-env |
dotenv |
|---|---|---|
| 主要用途 | 跨平台设置命令行环境变量 | 从 .env 文件加载环境变量 |
是否读取 .env 文件 |
❌ 否 | ✅ 是 |
| 是否解决平台兼容性 | ✅ 是(Windows/macOS/Linux) | ❌ 否(只在 Node.js 内部生效) |
| 使用位置 |
package.json 脚本命令中 |
Node.js 代码开头(如 app.js) |
| 生命周期 | 仅当前命令有效 | 整个 Node.js 进程有效 |
| 典型场景 | cross-env NODE_ENV=prod npm start |
require('dotenv').config() |
💡 组合使用示例
很多项目会 同时使用两者:
// package.json
{
"scripts": {
"dev": "cross-env NODE_ENV=development node server.js",
"prod": "cross-env NODE_ENV=production node server.js"
}
}
// server.js
require('dotenv').config(); // 加载 .env 文件
console.log('Environment:', process.env.NODE_ENV);
console.log('DB Host:', process.env.DB_HOST);
注意:
dotenv默认不会覆盖已存在的环境变量(比如由cross-env设置的NODE_ENV),所以命令行设置的优先级更高。
如有具体使用场景,也可以告诉我,我可以给出更针对性的建议!