TypeScript中__dirname无法返回Obsidian插件正确文件路径
问题原因
Obsidian 基于 Electron 框架运行,你的插件代码会被 Electron 加载到内置的 asar 归档文件中。此时 Node.js 原生的 __dirname 指向的是 asar 包内的 renderer 路径(也就是你看到的 Applications/obsidian.app/Contents/Resources/electron.asar/renderer),而非本地磁盘上的插件安装目录,更不会指向你本地开发仓库的路径。这是 Electron 打包加载机制导致的,并非 Obsidian 专属问题,但在 Obsidian 插件开发中需要适配其 API 来获取正确路径。
解决方案
不要依赖 Node.js 原生路径变量,改用 Obsidian 插件 API 提供的路径来获取插件目录:
获取插件本地目录
在插件的onload方法中,通过插件实例的this.manifest.dir属性可以直接拿到插件安装后的本地绝对路径,格式正是你预期的something/.obsidian/plugins/your-plugin-id/。示例代码(TypeScript)
import { Plugin } from "obsidian"; import fs from "fs"; import path from "path"; export default class YourPlugin extends Plugin { async onload() { // 获取插件的本地文件夹路径 const pluginDir = this.manifest.dir; console.log("插件目录:", pluginDir); // 拼接目标文件路径并读取 const targetFilePath = path.join(pluginDir, "your-file.txt"); fs.readFile(targetFilePath, "utf8", (err, content) => { if (err) { console.error("读取文件出错:", err); return; } console.log("文件内容:", content); }); } }
- 开发阶段注意事项
确保你在 Obsidian 中加载的是本地开发的插件(可通过将插件目录复制到.obsidian/plugins/下,或使用插件开发工具自动同步),此时this.manifest.dir会指向你本地的开发仓库目录,方便调试。
额外提示
- 所有涉及插件本地文件的操作,都应该通过 Obsidian API 提供的路径构建,避免使用
__dirname、__filename这类 Node.js 原生变量,保证开发和生产环境路径一致。 - 如果需要读取插件打包时包含的静态资源(如图片、配置文件),将资源放在插件目录下,用上述方式拼接路径即可正常访问。
内容的提问来源于stack exchange,提问作者Kevin Tommy
相关产品推荐
相关产品推荐

