回答(13)
2 years ago
Node.js 10支持ECMAScript modules,其中 __dirname 和 __filename 不可用 .
然后要获得当前ES模块的路径,必须使用:
const __filename = new URL(import.meta.url).pathname;
对于包含当前模块的目录:
import path from 'path';
const __dirname = path.dirname(new URL(import.meta.url).pathname);
2 years ago
Use __dirname!!
__dirname
当前模块的目录名称 . 这与 __filename 的path.dirname()相同 .
示例:从/ Users / mjr运行节点example.js
console.log(__dirname);
// Prints: /Users/mjr
console.log(path.dirname(__filename));
// Prints: /Users/mjr
2 years ago
此命令返回当前目录:
var currentPath = process.cwd();
例如,要使用路径来读取文件:
var fs = require('fs');
fs.readFile(process.cwd() + "\\text.txt", function(err, data)
{
if(err)
console.log(err)
else
console.log(data.toString());
});
2 years ago
我再次查看文档后找到了它 . 我在寻找的是__filename和__dirname模块级变量 .
__filename 是当前模块的文件名 . 这是当前模块文件的已解析绝对路径 . (例如: /home/kyle/some/dir/file.js )
__dirname 是当前模块的目录名称 . (例如: /home/kyle/some/dir )
2 years ago
另一种方法,如果你想找到调用这样的子模块或你正在运行的任何模块的主模块的 filename ,就是使用它
var fnArr = (process.mainModule.filename).split('/');
var filename = fnArr[fnArr.length -1];
2 years ago
var settings =
JSON.parse(
require('fs').readFileSync(
require('path').resolve(
__dirname,
'settings.json'),
'utf8'));
2 years ago
您可以使用process.env.PWD获取当前的应用程序文件夹路径 .
2 years ago
如果你想在shell脚本中更像$ 0,试试这个:
var path = require('path');
var command = getCurrentScriptPath();
console.log(`Usage: ${command} `);
function getCurrentScriptPath () {
// Relative path from current working directory to the location of this script
var pathToScript = path.relative(process.cwd(), __filename);
// Check if current working dir is the same as the script
if (process.cwd() === __dirname) {
// E.g. "./foobar.js"
return '.' + path.sep + pathToScript;
} else {
// E.g. "foo/bar/baz.js"
return pathToScript;
}
}
2 years ago
所以基本上你可以这样做:
fs.readFile(path.resolve(__dirname, 'settings.json'), 'UTF-8', callback);
使用resolve()而不是与'/'或''连接,否则您将遇到跨平台问题 .
注意:__ dirname是模块或包含脚本的本地路径 . 如果您正在编写一个需要知道主脚本路径的插件,那就是:
require.main.filename
或者,只是获取文件夹名称:
require('path').dirname(require.main.filename)
2 years ago
每个Node.js程序在其环境中都有一些全局变量,它代表有关您的进程的一些信息,其中一个是 __dirname .
2 years ago
说到主脚本,它很简单:
process.argv[1]
process.argv包含命令行参数的数组 . 第一个元素是'node',第二个元素是JavaScript文件的路径 . 下一个元素将是任何其他命令行参数 .
如果您需要知道模块文件的路径,请使用__filename .
2 years ago
我知道这是相当陈旧的,我回复的原始问题被标记为重复并指示在这里,但我遇到了一个问题,试图让jasmine-reporter工作,并且没有正确地解析savePath并且实际上是报告jasmine-reporter目录中的文件夹输出,而不是我运行gulp的根目录 . 为了使这项工作正常,我最终使用 process.env.INIT_CWD 来获取最初的当前工作目录,该目录应该是您运行gulp的目录 . 希望这有助于某人 .
var reporters = require('jasmine-reporters');
var junitReporter = new reporters.JUnitXmlReporter({
savePath: process.env.INIT_CWD + '/report/e2e/',
consolidateAll: true,
captureStdout: true
});
2 years ago
如果您使用 pkg 打包您的应用程序,您会发现这个表达式很有用:
appDirectory = require('path').dirname(process.pkg ? process.execPath : (require.main ? require.main.filename : process.argv[0]));
process.pkg 告诉应用程序是否已被 pkg 打包 .
process.execPath 包含可执行文件的完整路径,对于脚本( node test.js )的直接调用或打包的应用程序,它是 /usr/bin/node 或类似的 .
require.main.filename 保存主脚本的完整路径,但是当Node以交互模式运行时它是空的 .
__dirname 保存当前脚本的完整路径,所以我没有使用它(虽然它可能是OP要求的;然后更好地使用 appDirectory = process.pkg ? require('path').dirname(process.execPath) : (__dirname || require('path').dirname(process.argv[0])); 注意在交互模式 __dirname 是空的 .
对于交互模式,使用 process.argv[0] 获取节点可执行文件的路径,或使用 process.cwd() 获取当前目录 .