首页

Trilium 首页数据同步控件 2.0:全标签查询 + 多模块聚

Trilium 首页数据同步控件 2.0:全标签查询 + 多模块聚合

在 Trilium 知识库中,我们常常需要将不同文件夹下的笔记聚合到首页,以统一的格式展示——推荐阅读、最新说说、最近发布、公告等。

之前我们实现了基于递归扫描的同步控件: Trilium 推荐阅读同步控件:一键聚合多源文章摘要,但存在配置复杂、性能瓶颈、依赖父节点等局限。现在,2.0 版本彻底重构,采用纯标签 + SQL 直查的方式,让一切变得简单、高效、灵活。

2.0 核心特性

  • 🔖 纯标签驱动:所有模块的笔记筛选都基于标签(如 articlerecommendshuoshuoanno),无需设定父节点或扫描路径。
  • ⚡ 性能飞跃:直接通过 SQL 从数据库中批量查询,支持多标签 AND 条件,毫秒级返回结果。
  • 🧩 模块化设计:内置四个首页模块,每个模块的标签列表、数量限制、摘要长度均可独立配置。
  • 🔄 自动同步:支持设置定时同步间隔(小时级),也可一键手动同步。
  • 📝 智能摘要:自动去除 HTML 标签并解码常见实体( < 等),生成干净、可读的纯文本摘要。
  • 🛠️ 零配置标签:模块所需的标签名直接固化在代码中(["article","recommend"]["shuoshuo"] 等),需要增减时仅修改数组即可,无需额外配置标签。

📦 安装与配置

1. 创建前端脚本笔记

在 Trilium 中新建一个笔记,类型选择 JS Frontend,标题可命名为 首页数据同步控件 2.0。将完整代码(见文末)复制到该笔记内容中。

2. 添加配置标签(在脚本笔记的属性面板中)

标签名说明示例值
saveNoteId推荐阅读的目标笔记ID(存储JSON)your_note_id
shuoShuoSaveId最新说说目标笔记IDyour_note_id
lastCreateSaveId最近发布目标笔记IDyour_note_id
announcementSaveId公告目标笔记IDyour_note_id
autoRecommend是否启用推荐阅读(默认 true)true / false
autoShuoShuo是否启用最新说说true / false
autoLastCreate是否启用最近发布true / false
autoAnnouncement是否启用公告true / false
recommendLimit推荐阅读返回条数(默认10)10
ssLimit说说返回条数(默认5)5
lastCreateLimit最近发布条数(默认1)1
announcementLimit公告条数(默认1)1
contentLens摘要长度(默认250,说说100)150
syncInterval自动同步间隔(小时),不设置则不自动同步24

注意:每个模块的目标笔记(保存JSON)必须已经创建,可以是任何可写的笔记(如 text 类型)。控件会覆盖其内容。

3. 给需要展示的笔记打上对应标签(值均为 true

模块所需标签
推荐阅读article + recommend(同时存在)
最新说说shuoshuo
最近发布article
公告anno

例如,一篇推荐文章需要同时拥有 article=truerecommend=true 两个标签。

4. 使用控件

  • 刷新 Trilium 界面,左侧面板底部会出现一个同步按钮(带旋转图标)。
  • 点击按钮,控件会在后端执行查询,并将每个模块的 JSON 数据写入对应的目标笔记。
  • 若设置了 syncInterval,则每隔指定小时自动执行一次。

🧠 工作原理

  1. 前端按钮触发,读取脚本笔记的配置标签。
  2. 对每个模块,调用后端 API api.runAsyncOnBackendWithManualTransactionHandling,在后端执行以下操作:
    • 动态构建 SQL:根据模块的标签列表,生成多表 INNER JOIN 语句(AND 逻辑)。
    • 执行 api.sql.getRows 批量查询,一次获取所有符合条件的笔记(noteId, title, dateCreated, blobs.content)。
    • 遍历结果:去除 HTML 标签 → 替换实体(  等) → 截取摘要 → 格式化日期。
    • 将最终数据写入目标笔记:targetNote.setContent(JSON.stringify(notesData, null, 2))
  3. 前端收到返回的条数,显示成功消息。

为什么比传统递归快?

  • 递归 getChildNotes 需要多次异步调用(每个节点一次),而 SQL 查询一次返回所有需要的字段。
  • 数据库层直接完成排序和过滤,无需将大量笔记对象传输到 JS 内存再处理。
  • 生成的 JSON 索引文件只有几十到几百 KB,前端静态页面直接 fetch 并渲染,飞一般的加载速度。

🔧 自定义与扩展

  • 增减模块:在 modules 数组里添加新对象,指定 labels(标签数组)、saveIdlimitlens 即可。
  • 修改标签列表:直接编辑对应模块的 labels 数组,例如将推荐阅读改为需同时满足 articlestarfeatured
  • 更换排序字段:SQL 中的 ORDER BY n.dateCreated DESC 可改为 dateModified 以按修改时间排序。
  • 增加实体替换:在 plainText.replace(...) 链后添加新的 .replace(/&新实体;/g, '替换字符')

🌐 与首页静态页面的集成

每个模块的 JSON 输出笔记(如 home-recommend)需要使用 #shareRaw 标签,以便前端通过 fetch('./noteId') 直接获得 JSON 数据。前端 JavaScript 示例:

async function fetchRandomRecommend() {
    const res = await fetch(`./${CONFIG.RECOMMEND_NOTE_ID}`);
    const articles = await res.json();
    const random = articles[Math.floor(Math.random() * articles.length)];
    // 渲染...
}

这样,你的静态博客首页就能动态展示来自 Trilium 的最新内容,且完全不需要依赖后端 API。

📝 完整代码

请将以下代码复制到 Trilium 的 JS Frontend 笔记中,保存后刷新即可。

[Code] Trilium 首页数据同步控件 2.0:全标签查询 + 多模块聚

🎉 总结

Trilium 首页数据同步控件 2.0 是一次彻底的进化——抛弃了递归扫描与父节点依赖,全面拥抱标签与结构化查询。它不仅让知识库的首页聚合变得极简、高效,也为静态博客提供了强大而稳定的后端数据源。现在,你可以轻松地维护一个自动更新的“最新发布”、“随机推荐”等模块,而无需手动复制内容。

如果你在使用过程中有任何问题或改进建议,欢迎在 Trilium 社区或本文评论区交流。祝你知识管理愉快!