如何自动配置Node.js+Express开发与生产环境变量?
这问题我之前做Express服务端渲染项目时也踩过坑,手动改IP不仅麻烦还容易漏改,给你几个亲测好用的自动处理方案,覆盖不同场景需求:
1. 用环境变量(最推荐,Node生态标准做法)
这是最简单也最符合最佳实践的方式,完全不用修改代码,靠系统环境变量来传递配置:
服务端(config.js)处理
直接在配置文件里读取环境变量,同时给个本地开发的默认值:
// config.js module.exports = { ipAddress: process.env.IP_ADDRESS || '127.0.0.1' // 本地默认用localhost,部署时覆盖环境变量 };
前端(scripts.js)处理
如果scripts.js是前端代码,需要借助构建工具(Webpack/Vite等)把环境变量注入到代码中:
Webpack:用
DefinePlugin在配置里注入变量// webpack.config.js const webpack = require('webpack'); module.exports = { plugins: [ new webpack.DefinePlugin({ 'SERVER_IP': JSON.stringify(process.env.IP_ADDRESS || '127.0.0.1') }) ] };然后在scripts.js里直接用
SERVER_IP这个变量就行。Vite:更简单,直接用
import.meta.env,只要变量名以VITE_开头就行。先在启动命令里设置:VITE_IP_ADDRESS=xxx.xxx.xxx.xxx vite build,然后在scripts.js里用:// scripts.js const serverIp = import.meta.env.VITE_IP_ADDRESS || '127.0.0.1';
部署时设置环境变量的方式
- Linux服务器直接在启动命令前加:
IP_ADDRESS=xxx.xxx.xxx.xxx node app.js - 用PM2管理进程的话,在ecosystem.config.js里配置env:
启动时用module.exports = { apps: [{ name: 'my-app', script: 'app.js', env_production: { IP_ADDRESS: 'xxx.xxx.xxx.xxx', NODE_ENV: 'production' } }] };pm2 start ecosystem.config.js --env production就行。
2. 多环境配置文件 + dotenv(适合需要保存多个配置的场景)
如果需要把不同环境的配置都存在文件里,用dotenv包来加载:
安装依赖:
npm install dotenv --save创建不同环境的配置文件:
.env.development:IP_ADDRESS=127.0.0.1 NODE_ENV=development.env.production:IP_ADDRESS=xxx.xxx.xxx.xxx NODE_ENV=production
在项目入口加载对应环境的配置:
// app.js 或者 config.js require('dotenv').config({ path: `.env.${process.env.NODE_ENV || 'development'}` });这样启动时只要设置
NODE_ENV=production node app.js,就会自动加载生产环境的配置。前端同样可以结合构建工具,把dotenv里的变量注入到代码中,和第一种方法类似。
3. 构建时模板替换(适合无构建工具的静态脚本)
如果你的scripts.js是纯静态文件,不想用构建工具,可以写个简单的替换脚本:
把scripts.js改成模板文件
scripts.js.tpl,里面用占位符:// scripts.js.tpl const serverIp = '{{IP_ADDRESS}}'; // 其他代码...写一个Node脚本
replace-config.js:const fs = require('fs'); const path = require('path'); const templatePath = path.join(__dirname, 'scripts.js.tpl'); const targetPath = path.join(__dirname, 'scripts.js'); const ipAddress = process.env.IP_ADDRESS || '127.0.0.1'; fs.readFile(templatePath, 'utf8', (err, data) => { if (err) throw err; const result = data.replace('{{IP_ADDRESS}}', ipAddress); fs.writeFile(targetPath, result, 'utf8', (err) => { if (err) throw err; console.log('IP地址已替换完成'); }); });部署时先跑这个脚本再启动服务:
IP_ADDRESS=xxx.xxx.xxx.xxx node replace-config.js && node app.js
4. 配置中心(适合大型多服务器项目)
如果你的项目是分布式部署,有多台服务器,用配置中心更方便,比如Consul、Etcd,或者自己写个简单的配置接口:
- 应用启动时向配置中心请求最新的IP地址,然后存入内存供全局使用
- 这种方式适合复杂场景,小项目没必要折腾
总结
优先推荐环境变量+dotenv的组合,既符合Node生态的最佳实践,又能轻松适配本地开发和生产部署,完全避免手动修改代码的麻烦。
内容的提问来源于stack exchange,提问作者Sir Rubberduck

