You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 21:17:38