CommonJS可通过process.env结合require运行时特性实现动态模块加载,如const config = process.env.NODE_ENV === 'production' ? require('./config.prod.js') : require('./config.dev.js');需校验环境变量防路径遍历,并配合package.json scripts注入变量。

CommonJS 本身不直接支持“通过环境变量动态切换 require 模块”的语法,但你可以利用它的运行时特性(require 是函数、可出现在任意位置、支持字符串拼接)结合 process.env 实现动态加载。
核心原理:require 是运行时函数,不是编译时指令
和 ES6 的 import 不同,require 可以写在 if 里、函数里、甚至用变量拼路径——这正是实现环境驱动加载的基础。
- Node.js 中 process.env 是全局可用的,比如 NODE_ENV、CUSTOM_ENV 等
- require() 接收一个字符串参数,只要该字符串最终指向一个合法模块路径即可
- 路径可以是相对路径(./dev.js)、绝对路径,或带条件拼接的字符串
常见写法:用 if/else 或三元表达式选择模块
例如根据 NODE_ENV 加载不同配置:
const config = process.env.NODE_ENV === 'production'
? require('./config.prod.js')
: require('./config.dev.js');
或者更紧凑地:
立即学习“Java免费学习笔记(深入)”;
const apiClient = require(`./api/${process.env.API_MODE || 'default'}.js`);
⚠️ 注意:路径必须真实存在,否则运行时报错 Cannot find module。
安全建议:避免未经校验的路径拼接
如果环境变量来自外部(如用户输入或配置文件),直接拼接可能引发路径遍历风险。推荐白名单校验:
const mode = process.env.API_MODE;
const validModes = ['v1', 'v2', 'mock'];
const modulePath = validModes.includes(mode)
? `./api/${mode}.js`
: './api/default.js';
const api = require(modulePath);
配合 package.json scripts 灵活切换
在启动命令中注入环境变量,是最常用也最清晰的方式:
"scripts": {
"dev": "NODE_ENV=development node app.js",
"prod": "NODE_ENV=production node app.js",
"test": "API_MODE=mock node app.js"
}
这样代码里只需读取 process.env.NODE_ENV 或 process.env.API_MODE,无需硬编码判断逻辑。


















