除了process.cwd()之外,是否有其他方法来获取当前项目根目录的路径名。Node是否实现了ruby的属性Rails.root之类的东西。我要找的是稳定可靠的东西。


当前回答

在npm的现代版本中,你可以在exports中添加一个条目,用作速记。注意,如果你想同时引用根目录本身和根目录下的文件,你需要分别使用./和./*:

package.json:

{
  "imports": {
    "#root": "./",
    "#root/*": "./*",
    ...
  },
  ...
}

/ index.js:

import {namedExport} from '#root/file.js'

/ file.js:

export const namedExport = {
  hi: "world",
};

然后:

$ node --experimental-specifier-resolution=node index.js

你可以用constants.js文件进一步扩展它,在那里你可以使用上面答案中的一个方法,或者输入一个绝对路径,如果你需要路径本身的话

其他回答

我发现这对我来说是一致的,即使应用程序是从子文件夹中调用的,因为它可以与一些测试框架,如Mocha:

process.mainModule.paths[0].split('node_modules')[0].slice(0, -1);

为什么有效:

在运行时,节点创建所有加载文件的完整路径的注册表。模块首先加载,因此位于注册表的顶部。通过选择注册表的第一个元素并返回'node_modules'目录之前的路径,我们可以确定应用程序的根目录。

它只有一行代码,但为了简单起见(我的),我把它黑盒到一个NPM模块:

https://www.npmjs.com/package/node-root.pddivine

享受吧!

编辑:

的过程。mainModule从v14.0.0开始已弃用

使用要求。主要:

require.main.paths [0] .split(“node_modules”)[0]。片(0,1);

在你的主应用文件(例如app.js)开始的地方添加这个:

global.__basedir = __dirname;

这将设置一个全局变量,该变量将始终等同于应用程序的基本目录。像使用其他变量一样使用它:

const yourModule = require(__basedir + '/path/to/module.js');

简单的…

__dirname不是全局变量;它是当前模块的局部值,因此每个文件都有自己的局部值,不同的值。

如果您想要运行进程的根目录,则可能需要使用process.cwd()。

如果希望获得可预测性和可靠性,那么可能需要将设置某个环境变量作为应用程序的要求。你的应用程序寻找MY_APP_HOME(或任何东西),如果它在那里,应用程序存在于该目录,那么一切都很好。如果它是未定义的,或者目录不包含您的应用程序,那么它应该退出,并提示用户创建变量。可以将其设置为安装过程的一部分。

您可以使用process.env.MY_ENV_VARIABLE来读取节点中的环境变量。

这对我很有用

process.env.PWD

1-在项目根目录下创建一个名为settings.js的文件

2-在此文件中添加此代码

module.exports = {
    POST_MAX_SIZE : 40 , //MB
    UPLOAD_MAX_FILE_SIZE: 40, //MB
    PROJECT_DIR : __dirname
};

3-在node_modules中创建一个名为“settings”的新模块,并在index.js模块中编写以下代码:

module.exports = require("../../settings");

4-任何时候你想要你的项目目录只需使用

var settings = require("settings");
settings.PROJECT_DIR; 

通过这种方式,您将拥有与此文件相关的所有项目目录;)