ReadFileSync 不是文件相关的

假设我在项目的根目录中有一个名为 file.xml的文件。

假设我在 test/中有一个名为“ test.js”的测试文件

const file = fs.readFileSync("../file.xml");

如果我现在从我的项目的根运行 node ./tests/test.js,它说 ../file.xml不存在。如果我从 test 目录中运行相同的命令,那么它就可以工作。

看起来 fs.readFileSync是相对于脚本调用所在的目录而言的,而不是脚本实际所在的目录。如果我在 test.js中编写 fs.readFileSync("./file.xml"),它将看起来更加混乱,并且与 require语句中的相对路径不一致,因为 require语句是文件相对路径。

为什么会这样? 我怎样才能避免重写我的 fs.readFileSync的路径?

97537 次浏览

你可以使用 path.resolve解析相对于源文件位置的路径(而不是工作目录) :

const path = require("path");
const file = fs.readFileSync(path.resolve(__dirname, "../file.xml"));

如果你在 打字机中使用 Fs.readFileSync(当然还有 CommonJS) ,那么我们就扩展一下上面的内容,语法如下:

import fs from 'fs';
import path from 'path';


const logo = fs.readFileSync(path.resolve(__dirname, './assets/img/logo.svg'));

这是因为 fs.readFileSync()是相对于当前工作目录解析的,更多信息请参阅 Js 文件系统文档。

资料来源: 使用 Node.js 的相对 fs.readFileSync 路径

当然,CommonJS 格式:

const fs = require('fs');
const path = require('path');


const logo = fs.readFileSync(path.resolve(__dirname, './assets/img/logo.svg'));

如果使用 type module,另一种选择是使用 process.cwd()

包裹 Json

{
"type": "module",
}

console.log(process.cwd() + relative_path) // /User/your_user/path_to_folder