dotenv自定义路径配置异常:无法加载指定.env文件求助
兄弟,我太懂这种死活读不到.env变量的憋屈感了——之前在CRA项目里踩过一模一样的坑!你控制台只输出{NODE_ENV: "development", PUBLIC_URL: ""},大概率是踩了CRA环境变量的几个隐形规则,咱们一步步排查:
1. 先确认.env的「位置和命名」绝对合规
CRA对.env文件的位置要求非常严格:
- 必须放在项目根目录(和
package.json、public文件夹同层级),不能塞到src或者其他子文件夹里 - 文件名必须是
.env(或者对应环境的.env.development、.env.production),不能改成.env.local.txt或者config.env这种花里胡哨的名字
2. 环境变量必须加REACT_APP_前缀!
这是CRA最容易被忽略的规则:只有以REACT_APP_开头的变量才会被注入到应用中,其他自定义变量会被自动忽略(NODE_ENV、PUBLIC_URL是CRA自带的系统变量,所以你能看到它们)。
举个正确的写法:
# .env文件里的内容 REACT_APP_API_KEY=abc123 REACT_APP_BASE_URL=https://your-api.com
3. 别手动调用dotenv!
很多人会习惯写require('dotenv').config()或者import dotenv from 'dotenv'; dotenv.config(),但CRA已经内置了dotenv的加载逻辑,手动调用反而可能因为路径问题加载不到根目录的.env文件,直接删掉这段代码就行。
4. 必须重启开发服务器!
修改.env文件后,一定要重启npm start,CRA不会热加载.env的修改,不重启的话永远读不到新变量。
5. 测试变量的正确姿势
别直接打印console.log(process.env),因为CRA会把环境变量注入到构建产物中,直接打印process.env可能看不到自定义变量。正确的做法是单独打印你的变量:
// 在src/App.js里测试 console.log(process.env.REACT_APP_API_KEY);
6. 排查多.env文件的优先级冲突
如果你同时有.env、.env.development、.env.local这些文件,CRA的加载优先级是:.env.local > .env.development > .env
如果某个变量在优先级高的文件里被定义了,会覆盖低优先级的,检查一下是不是高优先级文件里没写这个变量。
如果以上都试过还是不行,试试删除node_modules/.cache文件夹(CRA的缓存目录),然后重新npm install再启动,大概率能解决缓存导致的问题。
内容的提问来源于stack exchange,提问作者Skyd

