You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 提供的路径来获取插件目录:

  1. 获取插件本地目录
    在插件的 onload 方法中,通过插件实例的 this.manifest.dir 属性可以直接拿到插件安装后的本地绝对路径,格式正是你预期的 something/.obsidian/plugins/your-plugin-id/。

  2. 示例代码(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);
    });
  }
}
  1. 开发阶段注意事项
    确保你在 Obsidian 中加载的是本地开发的插件(可通过将插件目录复制到 .obsidian/plugins/ 下,或使用插件开发工具自动同步),此时 this.manifest.dir 会指向你本地的开发仓库目录,方便调试。
额外提示
  • 所有涉及插件本地文件的操作,都应该通过 Obsidian API 提供的路径构建,避免使用 __dirname、__filename 这类 Node.js 原生变量,保证开发和生产环境路径一致。
  • 如果需要读取插件打包时包含的静态资源(如图片、配置文件),将资源放在插件目录下,用上述方式拼接路径即可正常访问。

内容的提问来源于stack exchange,提问作者Kevin Tommy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 04:33:17