home / kengdb / noteTb

noteTb: 288

This data as json

id user_id content tags created_at updated_at enable pinned folder_id comment position visibility
288 1 1 # keng Q&A — Obsidian 相关疑问解答 日期:2026-05-12 --- ## Q1: Obsidian 的插件是怎么做的?怎么插进来的? ### 架构基础 Obsidian 是基于 Electron(Chromium + Node.js)构建的桌面应用。Electron 给了它两个关键能力: - Chromium 渲染引擎 → 展示 UI - Node.js 运行时 → 访问文件系统、执行代码 插件的本质就是跑在 Node.js 侧的一段 JavaScript/TypeScript 代码,通过 Obsidian 暴露的 Plugin API 来"钩"进主程序。 ### 插件怎么加载 Obsidian 启动时会扫描 vault 目录下的 `.obsidian/plugins/` 文件夹。每个插件是一个子目录,里面有: ``` .obsidian/plugins/my-plugin/ ├── manifest.json ← 插件的身份证 ├── main.js ← 插件的实际代码 └── styles.css ← 可选样式 ``` `manifest.json` 内容示例: ```json { "id": "my-plugin", "name": "My Plugin", "version": "1.0.0", "minAppVersion": "1.0.0", "description": "插件描述", "author": "作者", "isDesktopOnly": false } ``` Obsidian 读取 manifest 后,用 Node.js 的 `require()` 或 ES module `import` 加载 `main.js`。插件必须导出一个默认类,继承 Obsidian 提供的 `Plugin` 基类: ```typescript import { Plugin } from 'obsidian'; export default class MyPlugin extends Plugin { async onload() { // 插件被加载时执行 —— 在这里注册一切 // 比如:注册命令、添加按钮、钩入编辑器... } async onunload() { // 插件被禁用/卸载时执行 —— 清理 } } ``` ### 插件能做什么(Obsidian Plugin API 暴露的能力) 插件拿到的是 `this.app` —— 整个 Obsidian 应用的根对象。通过它可以访问: | API 入口 | 能做什么 | |-----------|---------| | `this.app.workspace` | 操作工作区:打开/关闭文件、切换视图、获取当前编辑器 | | `this.app.vault` | 读写 vault 里的文件:创建/删除/重命名 markdown 文件 | | `this.app.metadataCache` | 读取所有笔记的元数据缓存:标签、链接、frontmatter | | `this.app.fileManager` | 文件操作:生成 frontmatter、处理链接 | **插件可以注册的东西:** - **命令** (`addCommand`):在命令面板 (Ctrl+P) 里加一条命令 - **Ribbon 图标** (`addRibbonIcon`):左侧栏的小图标按钮 - **状态栏** (`addStatusBarItem`):底部状态栏显示信息 - **设置面板** (`addSettingTab`):插件的设置界面 - **自定义视图** (`registerView`):完全自定义的侧栏/面板(比如 Dataview 的查询面板) - **Markdown 后处理器** (`registerMarkdownPostProcessor`):渲染完 Markdown 后注入自定义 HTML - **编辑器扩展** (`registerEditorExtension`):基于 CodeMirror 6 的编辑器增强 - **事件监听** (`registerEvent`):监听文件变化、编辑器切换等各种事件 ### 社区插件的审核和分发 1. 开发者把插件代码放到 GitHub 2. 向 `obsidian-releases` 仓库提 PR,把插件加入社区列表 3. Obsidian 团队人工审核:代码质量、安全、功能不重复 4. 审核通过后,插件出现在内置的"社区插件市场"里 5. 用户在设置里一键安装,Obsidian 自动下载到 `.obsidian/plugins/` ### keng 能不能做类似的事? 可以,但思路不同。keng 是 Web 应用而非 Electron 应用。如果要做插件: **方案 A:前端 JS 钩子(最简单)** - 在前端定义 hook 点(类似 WordPress 的 `do_action`/`add_action`) - 插件就是一个 .js 文件,放到 `www/plugins/` 下 - index.html 启动时扫描并加载 - 缺点是插件只能操控 UI,不能碰后端 **方案 B:前后端插件** - 插件是一个文件夹,包含 `plugin.json` + `frontend.js` + `backend.py` - 后端:FastAPI 加载 Python 插件,注册新路由/中间件 - 前端:加载 JS,注册菜单项/编辑器扩展/面板 **方案 C:纯后端脚本(最符合 keng 哲学)** - 类似 Lucy 的架构——插件是独立进程 - 通过 keng 的 REST API 操作笔记 - 可以写成 cron 任务或触发器 目前 keng 不需要插件系统——功能都在核心里。等社区需要扩展时再做。 --- ## Q2: 怎么把这个 web 做成像 Obsidian 那种可以安装在电脑上的软件? ### 先说 Obsidian 是怎么"装在电脑上"的 Obsidian 本质上就是一个**套了壳的网页**。它的核心技术栈是 Electron: ``` ┌──────────────────────────┐ │ Electron 壳 │ │ ┌─────────────────────┐ │ │ │ Chromium 渲染引擎 │ │ ← 展示 HTML/CSS/JS 界面 │ │ (就是浏览器核心) │ │ │ └─────────────────────┘ │ │ ┌─────────────────────┐ │ │ │ Node.js 运行时 │ │ ← 访问文件系统、启动进程 │ │ (后台能力) │ │ │ └─────────────────────┘ │ └──────────────────────────┘ ``` 所以它就是一个**自带浏览器的网页**,加上能用 Node.js 读写本地文件的权限。安装就是下载 .exe/.dmg 双击。 ### keng 做成桌面软件的四种方案 #### 方案一:Electron 套壳(最像 Obsidian)⭐⭐⭐⭐⭐ 把 keng 的前后端包进一个 Electron App。 **怎么做:** 1. 创建一个 Electron 项目,主进程启动时用 `child_process.spawn()` 自动启动 Python 后端 2. 主窗口加载 `http://127.0.0.1:8910/keng/` 3. 打包:用 electron-builder 打成 Windows(.exe) / Mac(.dmg) / Linux(.AppImage) **优点:** - 和 Obsidian 一模一样的体验——桌面图标、系统托盘、原生菜单 - 可以用 Node.js 做原生功能:全局快捷键、系统通知、自动更新 - 离线可用(后端在本地跑) **缺点:** - Electron 很大(基础包 ~150MB),内存占用高(~150MB+) - 每个平台要单独打包 - 需要学 Electron 开发 **快速实验(5分钟):** ```bash # 安装 electron npm init -y && npm install electron # 创建 main.js cat > main.js << 'EOF' const { app, BrowserWindow } = require('electron'); const { spawn } = require('child_process'); // 启动 Python 后端 const backend = spawn('python3', ['/home/project/keng/server.py']); app.whenReady().then(() => { const win = new BrowserWindow({ width: 1200, height: 800 }); // 等后端就绪后加载 setTimeout(() => win.loadURL('http://127.0.0.1:8910/keng/'), 2000); }); EOF npx electron main.js ``` #### 方案二:Tauri(更轻量)⭐⭐⭐⭐ 用 Rust 替代 Node.js 做壳,比 Electron 小 20 倍(~10MB 基础包)。 **优点**:内存占用低(~50MB),包体积小,性能更好 **缺点**:需要 Rust 环境,生态不如 Electron 成熟 #### 方案三:PWA(最简单)⭐⭐⭐ 添加一个 manifest.json + Service Worker,浏览器就能"安装"到桌面。 **怎么做:** 1. 在 index.html 的 `<head>` 里加: ```html <link rel="manifest" href="/keng/manifest.json"> ``` 2. 创建 `/home/project/keng/www/manifest.json`: ```json { "name": "坑 · 笔记", "short_name": "keng", "start_url": "/keng/", "display": "standalone", "background_color": "#1e1e1e", "theme_color": "#1e1e2e", "icons": [{ "src": "/keng/img/icon-192.png", "sizes": "192x192" }] } ``` 3. 加 Service Worker 做离线缓存 **优点:** - 零额外代码,纯 Web 标准 - 浏览器右上角出现"安装"按钮 - Chrome/Edge/Safari 都支持 **缺点:** - 不能后台运行(浏览器关了服务就停了) - 需要后端一直在服务器上跑 - 没有原生菜单、快捷键 **这个方案最适合 keng 当前阶段** — 因为 keng 已经是部署在服务器上的 Web App,PWA 让用户可以在电脑上"安装"这个网站,体验像原生 App。 #### 方案四:原生 WebView 壳(Python 实现)⭐⭐ 用 Python 写一个窗口,里面嵌一个浏览器控件,指向 keng。 ```python # 用 PyWebView import webview webview.create_window('坑 · 笔记', 'https://leedreamer.cn/keng/') webview.start() ``` 或者直接写个 `.desktop` 文件(Linux): ```ini [Desktop Entry] Name=坑 · 笔记 Exec=xdg-open https://leedreamer.cn/keng/ Type=Application Icon=/home/project/keng/www/img/lucyicon-100.jpg ``` **推荐路线:** 1. 近期:做 PWA(30分钟搞定,立即可用) 2. 中期:如果真需要离线使用,再考虑 Tauri 打包 --- ## Q3: Obsidian 是怎么管理知识的?它不也是写笔记吗? 这个问题的答案就是 Obsidian 和 keng 最核心的区别。 ### 写笔记 vs 管理知识 打个比方: | | 写笔记(keng) | 管理知识(Obsidian) | |------|-----|------| | **比喻** | 在记事本上记东西 | 在大脑里建神经连接 | | **操作** | 打开、写、存 | 写、链接、关联、发现模式 | | **组织方式** | 文件夹 + 标签 | 双向链接 + 关系图谱 | | **查找方式** | 搜索关键词 | 顺着链接走 + 反向看谁链到这里 | | **目标** | 记下来,以后能找 | 发现笔记之间的关系,产生新洞见 | ### Obsidian 的核心机制:双向链接 这是理解 Obsidian 的关键。 **普通笔记(keng):** ``` 笔记 A:关于 Python 的坑 笔记 B:关于 nginx 配置 笔记 C:Python 部署到 nginx ``` 三条笔记互相不知道对方存在。用户自己要在脑子里记住"Python 和 nginx 有关系"。 **Obsidian:** ``` 笔记 A:关于 Python ←──┐ │ [[Python]] 笔记 B:关于 nginx │ │ 笔记 C:Python 部署到 nginx ─┐ [[Python]] ← 显式链接 │ [[nginx]] ← 显式链接 │ │ ┌──── 反向链接面板 ────┐ │ │ Python 被以下笔记引用: │───┘ │ - 笔记 C │ │ - 笔记 A (自己) │ └──────────────────────┘ ``` 在 Obsidian 里,当你在笔记 C 里写 `[[Python]]`: 1. **正向链接**:笔记 C → 笔记 A(点击 `[[Python]]` 跳过去) 2. **反向链接**:打开笔记 A 时,底部面板自动显示"笔记 C 引用了你"——这个反向链接不是你写的,是 Obsidian 自动算出来的 3. **图谱**:所有笔记变成节点,链接变成边,你可以看到一个网状结构 **这就是"知识管理"的核心——不只是在文件夹里堆笔记,而是让笔记之间自然生长出连接**。你写得越多,连接越密,越能发现"原来 A 和 Z 有关联"这种你自己都没想到的关系。 ### Obsidian 的知识管理工具链 | 工具 | 做什么 | keng 有没有 | |------|--------|-------------| | **双向链接** `[[wikilink]]` | 笔记间互相引用 | ❌ 没有 | | **反向链接面板** | 自动显示谁链到了当前笔记 | ❌ 没有 | | **图谱视图** | 所有笔记的网状可视化 | ❌ 没有 | | **出链面板** | 当前笔记链出了哪些笔记 | ❌ 没有 | | **标签系统** `#tag` | 跟 keng 一样的标签功能 | ✅ 有 | | **YAML Frontmatter** | 笔记顶部的结构化元数据 `---` | ❌ 没有(但有 comment 字段) | | **Dataview 插件** | 把笔记当数据库查:列出所有含标签 X 且创建于上月的笔记 | ❌ 没有 | | **Daily Notes** | 每天自动创建日记页面 | ❌ 没有 | | **Canvas** | 无限画布,拖放笔记和卡片 | ❌ 没有 | | **模板** | 新笔记套用模板 | ✅ 有(notetemplate.md) | | **搜索** | 全文搜索 | ✅ 有 | | **书签/收藏** | 快速访问常用笔记 | ✅ 有(置顶 pin) | | **文件夹** | 层级组织 | ✅ 有 | ### 简单说 **keng = 笔记本** 适合:"我刚踩了一个坑,记下来"、"看看以前怎么解决的"、"把 nginx 相关笔记都放这个文件夹" **Obsidian = 大脑外挂** 适合:"我把所有学过的东西都写在里面,它们会自己关联起来"、"想写一篇文章时发现原来半年前记的三个笔记已经把这个主题覆盖了"、"从知识图谱里发现我研究的三个领域其实有共同点" ### keng 需要做双向链接吗? 不一定。这取决于你想让 keng 成为什么: - 如果 keng 继续定位为**快速经验记录**(掏出笔记本就写),不需要双向链接——文件夹 + 标签 + 搜索就够 - 如果 keng 未来要往**知识管理**方向发展,双向链接是关键功能 keng 当前的优势在"快"——打开就写。Obsidian 启动要 3-5 秒(Electron),keng 打开网页就 0.5 秒。这是根本性的定位差异。 [] 2026-05-13 16:18:41 2026-05-13 16:18:43 T F     22 public

Links from other tables

  • 0 rows from note_id in noteShareTb
  • 0 rows from note_id in shareLinkTb
Powered by Datasette · Queries took 20.382ms