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

Node.js中如何获取被导入JS文件的当前路径?

解决方案:稳定获取B.js自身的绝对路径

不管从哪个文件导入B.js,要精准拿到它的所在目录,核心是基于模块自身的元数据来获取,而非依赖执行入口的路径或当前工作目录。下面分两种常见模块系统给出具体实现:

1. 推荐:ES模块(Node.js 14+ 默认支持)

ES模块里没有内置__dirname和__filename,但可以通过import.meta.url获取模块的文件URL,再结合path模块转换为绝对路径:

// B.js
import { fileURLToPath } from 'url';
import { dirname } from 'path';

// 将模块的URL格式转换为本地文件路径
const currentFilePath = fileURLToPath(import.meta.url);
// 提取当前文件所在的目录路径
const currentDir = dirname(currentFilePath);

console.log(currentDir); // 始终输出B.js所在的/packages/B绝对路径

这个方法完全不依赖执行上下文——不管是直接运行node B.js,还是从A.js导入,都能精准定位到B.js的目录。

2. CommonJS模块场景

如果你的项目仍使用CommonJS(用require导入),每个模块内置的__dirname本来就是该模块自身的目录路径,无需额外处理:

// B.js (CommonJS)
console.log(__dirname); // 无论从哪个文件导入,都会输出/packages/B的绝对路径

如果你的场景中__dirname不符合预期,大概率是误用了process.cwd()(它返回的是执行命令时的工作目录,而非模块自身路径),或是把B.js当作ES模块运行却强行使用__dirname(ES模块中没有这个内置变量)。

验证方式

  • 直接运行B.js:执行cd packages/B; node B.js,输出/packages/B的绝对路径
  • 运行A.js:在项目根目录执行node A.js,B.js输出的依然是/packages/B的绝对路径

内容的提问来源于stack exchange,提问作者Lukas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:55:47