相同代码本地与服务器执行yarn build时NODE_ENV取值不一致怎么办
可能的原因及验证方法
- 服务器shell预设环境变量优先级更高
webpack读取process.env.NODE_ENV时会优先取当前shell环境中已经存在的变量值,大部分服务器会在~/.bashrc、~/.zshrc、/etc/profile这类shell配置文件中全局预设NODE_ENV=development,而本地环境没有该预设,就会出现两边输出差异。
验证方式:在服务器执行echo $NODE_ENV,如果输出development即可确认是该问题。 - 包管理器版本行为差异
不同版本的yarn、npm对script脚本的隐式环境变量注入逻辑不同,部分旧版本包管理器不会在执行build类命令时自动注入NODE_ENV=production,若你本地使用的包管理器版本和服务器不一致,就会出现该问题。
验证方式:两端分别执行yarn -v、npm -v核对版本是否完全一致。 - 依赖安装结果不一致
即便代码完全相同,若服务器没有同步你本地的yarn.lock/package-lock.json锁文件,或是安装依赖时使用了--force、--update等强制升级参数,会导致webpack及相关依赖的安装版本和本地不同。webpack 4+会根据mode配置自动赋值process.env.NODE_ENV,而更低版本的webpack没有该逻辑,会直接读取环境变量默认值development。 - 命令别名篡改执行逻辑
若服务器的shell配置了yarn或webpack的别名,比如别名中默认拼接了--mode development参数,即使你package.json的scripts配置和本地一致,实际执行的命令也会和本地不同。
验证方式:在服务器执行type yarn、type webpack检查是否存在别名配置。
快速解决方案
直接在build命令中显式指定NODE_ENV值,覆盖所有默认逻辑:
"scripts": { "build": "NODE_ENV=production webpack --config webpack.build.js" }
Windows环境需调整为:
"scripts": { "build": "set NODE_ENV=production && webpack --config webpack.build.js" }
内容的提问来源于stack exchange,提问作者Predrag Davidovic
相关产品推荐
相关产品推荐

