Node.js中-r/--require命令行选项的作用、原理及示例求助
Node.js
-r/--require 选项详解与问题解决 一、-r/--require 的用途与工作原理
- 用途:Node.js启动时预先加载指定模块,在主代码执行前完成模块的加载与执行。常用于全局注入工具函数、初始化运行环境、预加载配置文件等场景。
- 工作原理:启动流程中,Node.js会优先按路径加载
-r指定的模块并执行其代码,逻辑与require()一致,但执行时机早于所有用户业务代码;若未指定主程序,则进入REPL交互环境。
二、官方文档外的可运行示例
示例1:全局注入日志工具
创建logger.js文件:
'use strict'; // 把日志函数挂载到全局,无需手动require global.log = (msg) => { console.log(`[${new Date().toISOString()}] ${msg}`); };
执行命令:
node -r ./logger.js
进入REPL后直接调用log("用户登录"),会输出带时间戳的日志内容:[2024-05-20T10:30:00.000Z] 用户登录。
示例2:预加载环境变量
创建load-env.js文件:
'use strict'; // 模拟加载环境配置(实际项目可结合dotenv库) process.env.APP_PORT = '3000'; process.env.DB_HOST = '127.0.0.1';
创建主程序app.js:
console.log('服务端口:', process.env.APP_PORT); console.log('数据库地址:', process.env.DB_HOST);
执行命令:
node -r ./load-env.js app.js
运行后直接输出配置好的环境变量,主程序无需额外处理加载逻辑。
三、你的circle.js错误解决
问题根源
你使用了ES模块的export语法,但-r默认按CommonJS模块加载,且即使是ES模块,导出的变量也不会自动挂载到全局环境,REPL中直接访问areaOfCircle自然会提示未定义。
两种可行解决方案
方案1:改为CommonJS并挂载全局
修改circle.js:
#!/opt/node-v20.6.0-linux-x64/bin/node 'use strict'; function areaOfCircle(circleRadius) { return Math.PI * (circleRadius * circleRadius); } // 将函数挂载到global对象,REPL可直接访问 global.areaOfCircle = areaOfCircle;
执行命令:
node -r ${XDG_RUNTIME_DIR}/circle.js
进入REPL后输入areaOfCircle(2),即可得到计算结果12.566370614359172。
方案2:保持ES模块规范并手动导入
修改circle.js为标准ES模块:
#!/opt/node-v20.6.0-linux-x64/bin/node 'use strict'; // 标准ES模块导出语法 export function areaOfCircle(circleRadius) { return Math.PI * (circleRadius * circleRadius); }
需确保Node.js识别为ES模块:要么将文件名改为circle.mjs,要么在当前目录创建package.json并添加"type": "module"。
执行命令进入REPL后,手动导入使用:
import { areaOfCircle } from '${XDG_RUNTIME_DIR}/circle.js'; areaOfCircle(3); // 输出28.274333882308138
内容的提问来源于stack exchange,提问作者RAMUMSRK
相关产品推荐
相关产品推荐

