给我去看https://github.com/floatboatai/Nexus-Editor这个仓库,并判断obsidian功能哪些功能可以移植,并给出不同的方案给我参考
看完了。先说结论:这个仓库本身就已经内建了一份 Obsidian 迁移矩阵(docs/plugins/obsidian-migration.zh.md),而且它的定位不是「Obsidian 的开源替代品」,是一个 headless 的 Markdown 编辑器引擎。所以「哪些 Obsidian 功能可以移植」要分两层问:哪些是引擎层能力(能直接做),哪些是宿主层能力(必须你自己写),哪些是它明确拒绝的。 一、先对齐这个仓库的现状 技术底座是 CodeMirror 6 + unified/mdast,Markdown 文本就是 source of truth,AST 每敲一个键实时解析。React / Vue / Vanilla 三种绑定,11 个包,MIT。headless 意味着它只出逻辑不出样式,UI 和主题得自己写。 已落地的:live preview(光标聚焦时露出原始语法)、多光标、搜索(整词、正则)、slash 命令菜单、undo/redo、KaTeX 数学、Vim 键位、GFM 预设、字数统计、工具栏、受控文档(v-model)。 还没做的关键前置:widget API 标准化(P1 #9,状态 planned)、AST 扩展 / Markdown 扩展(P2 #7)、插件事件总线(P2 #10)、插件热重载(P3 #11)、CRDT 协作(P3 #18)。 顺带一个观察:现在 12 star、286 fork、182 个 open PR。这个比例说明它更像一个带贡献活动的开源项目,不是成熟产品,读代码时把这点算进去。 二、Obsidian 功能按「可移植性」分三档 第一档:编辑层,引擎内就能做,成本最低 这类是纯编辑器体验,Nexus 的架构天然支持: live preview / 源码模式切换 —— 已经有,这是它对 Tiptap、Lexical、MDXEditor 的核心差异点,因为那些都是 JSON tree 当文档,md 只是导入导出,round-trip 会漂(软换行丢失、属性顺序变化、表格被规范化)。 命令 + 快捷键 + slash 命令 —— 已有 CommandService、HotkeyService、ScopeService,四种互斥 callback 模式,Mod 跨平台。Obsidian 的 addCommand 基本能一对一迁。 搜索替换 —— 整词和正则已经 done,fuzzy search 还在 planned。 表格编辑、代码块渲染、数学公式 —— 数学有 plugin-math(KaTeX)。表格工具在 P2 #12(emoji picker / table tools / color picker)里,标着需要 OpenSpec,说明会拆三个子提案。 内链 [[wiki-link]]、块引用 ^id、标签高亮 —— 这三个没有,而且不能靠 widget 硬塞。它们要求 mdast 上多出新的节点类型,直接牵到 #7「AST enhancement / Markdown extensions」,文档原话是「Affects serialization and every AST-dependent plugin」。也就是说这一步动的是序列化层,风险最高但收益最大。 第二档:笔记应用层,引擎不提供,必须自己写宿主 这块最容易踩坑。Obsidian 里你习以为常的东西,在 Nexus 里是宿主的责任: Vault / TFile / TFolder —— 对应 VaultService,只接受规范化 Vault 相对路径,文件身份独立于 path。仓库里没有现成实现。 FileManager(重命名、移动、更新链接、frontmatter、可恢复删除)—— 对应 FileManagerService,返回结构化结果。 MetadataCache(backlinks、标签、heading/block 索引)—— 对应 MetadataService,cache 带内容版本,可以等索引到指定版本。这个是双向链接体验的命脉,也是最重的工程。 Workspace / Leaf / View(多标签、分栏、多窗口、占位恢复)—— 对应 WorkspaceService、WorkspaceLeaf、NexusView,导航必须显式指定 reuse / new-tab / split / window / default。 存储 —— PluginStorageService 按 plugin ID 分区,原子串行保存,支持 schema migration。 所以如果目标是「做个 Obsidian 替代品」,工作量的大头不在编辑器,在这四个 service。仓库里只有 electron-demo 提供了 file IO 的参考实现,其余得自己搭。 第三档:明确不支持,是设计选择不是缺功能 文档里列得很直白:不发布名为 obsidian 的 shim(import { Plugin } from "obsidian" 不会解析到 Nexus)、不注入 window.app、不执行未经移植的社区插件 bundle、不暴露 Node fs / Electron IPC / 绝对路径 / 宿主 DOM 内部结构。 符号层面明确 unsupported 的还有:DataAdapter/FileSystemAdapter、debounce/throttle/memoize 这类通用工具(直接用标准 Web API)、moment/loadMathJax/loadPdfJs 这类全局 loader、Publish/Sync/Cli、createEl/createDiv 这类 DOM prototype 增强、loadPrism。 deferred 的有一批:EditorSuggest、HoverPopover、requestUrl(网络能力)、Canvas、Bases。这些不是永远不做,是当前没有稳定的公共合同,别把它们当兼容目标。 三、几种可选方案 方案 A:只补编辑器层,做插件生态 在 Nexus 里实现 Obsidian 的编辑体验:内链、块引用、表格工具、代码块 widget 渲染、标签高亮。 前置依赖很明确:先做 #9 widget API 标准化和 #7 AST 扩展,否则每个 widget 都要踩一遍坑(文档提到现有 widget 踩了很多坑,CLAUDE.md 里有记录)。 举例:想让 ```mermaid 代码块渲染成图,现在的写法是在 plugin 里注册 widgets 数组,指定 nodeType: "code"、match 判 lang、render 返回 DOM、destroy 负责清理。但 widget 的挂载时机、光标进出时的替换、多编辑器场景下的 owner 归属,这些边界还没标准化,所以 #9 必须先落。 成本:中。产出是若干 plugin 包 + remark 插件,能直接提 PR。 方案 B:Nexus 当引擎,自建 Obsidian 兼容宿主 这是最接近「移植 Obsidian 功能」的路线。用 Nexus core 做编辑器,自己实现 VaultService / MetadataService / WorkspaceService / FileManagerService,然后按迁移矩阵把常用社区插件重写成 NexusPluginBase + capability。 具体形状,Obsidian 写法是 extends Plugin、this.addCommand、this.app.vault.on;Nexus 写法是 extends NexusPluginBase,用 this.app.capabilities.require(COMMANDS_CAPABILITY "^1.0.0") 注册命令,vault 事件走 registerEvent(vault.events.on("modify",...)),而且必须带 workspaceId 上下文,插件不许从 manifest 或全局变量猜当前 Workspace。 迁移顺序文档给了建议:先迁生命周期与命令,再迁 editor / Markdown contribution,最后迁 Workspace、Vault 和 UI;每一步都验证 enable/disable 循环、多编辑器和 headless 降级。 成本:高。最难的两块是 metadata 索引(backlinks 要带版本、要能等索引)和 workspace 多实例恢复。 方案 C:写 Obsidian → Nexus 的迁移工具 注意它明确说不发 shim、不跑未移植的 bundle,所以只能是「源码级 codemod + 人工审阅」:自动改 import、extends、addCommand、app.vault 这些固定形状,产出 diff 给人改。 能自动化的只有 native 那一档;adapter 和 deferred 那批(EditorSuggest、HoverPopover、requestUrl、Canvas、Bases)没有等价 API,只能人工或直接放弃。 适合做社区工具,不适合当产品主线。 方案 D:如果目标本来就是完整 PKM,考虑换底座 Nexus 的 headless + markdown-native 是优点也是负担:你要自己写主题、文件树、搜索面板、双链视图。如果这些才是你的核心,ProseMirror 系(Milkdown)或者直接套 Obsidian 生态可能更省事。代价是放弃 round-trip 无损。选哪个取决于你的产品是不是「Markdown 文件本身就是产品」。 四、我的排序建议 如果你的目的是给这个仓库提 PR 或者做插件:走方案 A,优先接 #9 widget API 和 #7 AST 扩展。这两个是内链、表格、代码块渲染的共同前置,做完之后一大批功能才能安全落地。 如果你是想做产品:走方案 B,但要先认清 Vault / Metadata / Workspace 是宿主责任,不是引擎欠你的。预算要按「自己写一个笔记应用后端」来算,不是「移植插件」。 如果你是想做社区工具:方案 C,但只做 native 档的自动化,adapter 档老老实实标成需要人工。 最后提醒一句:CRDT 协作、共享评论、插件热重载都是 P3,别把它们算进近期方案里。