node.js - NodeJS模块中数据文件的相对路径
问题描述
我创建了一个 NodeJS 模块,用 typescript 编写(尽管它不应该改变任何东西)。
以下是它的组织方式:
.
├── data/
│ └── MY_DATA_FILES.json
│
├── src/
│ ├── data/
│ │ └── data.ts
│ │
│ └── OTHER_TYPESCRIPT_FILES.ts
│
├── dist/
│ ├── data/
│ │ └── data.js
│ │
│ └── OTHER_JAVASCRIPT_FILES.ts
│
├── package.json
└── tsconfig.json
我的目标是从文件中读取数据data.ts
文件。当我当前的工作目录位于模块的根目录时,这不是问题(然后会是./data/...
),但是当我将其用作模块并将其放置在nodes_modules/
目录中时,我不确定如何处理这种情况。
我目前正在阅读以下文件:
import fs from 'fs';
const basePath = './data';
const filesPath = 'subdirectory/my_data.json';
export function getData(): any {
const fileFullPath = basePath + '/' + filesPath;
const contents = fs.readFileSync(fileFullPath);
// [...]
}
但是在这里,我basePath
的依赖于我的工作目录。我可以将其设置为./node_modules/my_module/data
,但我知道这不是正确的方法..
任何帮助将不胜感激,谢谢!
解决方案
您通常会为每个位置构建一个相对于您的代码所在目录的路径,并以相对方式访问所需位置。您的代码位置将作为__dirname
. 然后,您可以结合该相对路径__dirname
来构建到目标位置的完整路径,而无需对模块的安装位置或方式进行任何假设。
因此,假设您的代码在src
目录中,那将是__dirname
指向的位置。要访问该data
目录下的src
目录,您可以使用:
let srcDataDir = path.join(__dirname, "data");
要访问该dist/data
目录,您可以使用:
let distDataDir = path.join(__dirname, '../dist/data');
要访问更高级别的数据目录MY_DATA_FILES.json
,您可以使用:
let topDataDir = path.join(__dirname, '../data');
如您所见,关键是从您知道的位置构建所有相关内容,并将其__dirname
作为代码自己目录的位置传递给代码。
在 Javascript 的模块中,您永远不想对当前工作目录做出任何假设,因为这实际上可以是任何东西。这由顶级程序本身以及程序的启动方式控制,而不是模块本身可以依赖或做出假设的任何东西。但__dirname
始终是运行模块代码的目录的完整路径。