cross-env 和 dotenv 的区别

cross-envdotenv 是两个在 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),所以命令行设置的优先级更高。


如有具体使用场景,也可以告诉我,我可以给出更针对性的建议!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容