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
相关产品推荐
相关产品推荐

