首页 > 解决方案 > 获取主模块的__dirname

问题描述

我正在编写一个 NPM 包,我需要知道,在这个包中,__dirname主模块的价值是什么。

“主模块”是指不是依赖项的模块。

例子:

a-project
├─ index.js <--- main module
├─ node_modules
│  ├─ my-package <--- can be a symlink
┊  ┊  └─ index.js <--- I'm here

我尝试了两件事:

尝试1(使用当前__dirname):

const path = require('path');
console.log(`${__dirname}${path.sep}..${path.sep}..`);

const path = require('path');
console.log(path.resolve(__dirname, '..', '..'));

-> 如果包不在node_modules但符号链接在中,则不起作用node_modules(某些包管理器如 pnpm 会这样做)

尝试2(使用process.argv[1]):

const escapeStringRegexp = require('escape-string-regexp');
const path = require('path');
const escapedPathSep = escapeStringRegexp(path.sep);

console.log(process.argv[1].match(new RegExp(`^(.*)${escapedPathSep}.*$`))[1]);

const path = require('path');
console.log(path.dirname(process.argv[1]));

-> 当主模块由 pm2 启动时在生产中不起作用,因为process.argv[1]成为 pm2 的位置

我虽然使用callsite但我认为如果包不是主模块的直接依赖项,它将无法工作。

标签: javascriptnode.js

解决方案


主模块的 __dirname 可以找到如下:

require('path').dirname(require.main.filename);

由于Yury Tarabanko发表了评论而不是答案,因此我在此处发布了他的回复,以便我可以将问题标记为已解决。


推荐阅读