Trilium 首页数据同步控件 2.0:全标签查询 + 多模块聚
Trilium 首页数据同步控件 2.0:全标签查询 + 多模块聚合
在 Trilium 知识库中,我们常常需要将不同文件夹下的笔记聚合到首页,以统一的格式展示——推荐阅读、最新说说、最近发布、公告等。
之前我们实现了基于递归扫描的同步控件: Trilium 推荐阅读同步控件:一键聚合多源文章摘要,但存在配置复杂、性能瓶颈、依赖父节点等局限。现在,2.0 版本彻底重构,采用纯标签 + SQL 直查的方式,让一切变得简单、高效、灵活。
✨ 2.0 核心特性
- 🔖 纯标签驱动:所有模块的笔记筛选都基于标签(如
article、recommend、shuoshuo、anno),无需设定父节点或扫描路径。 - ⚡ 性能飞跃:直接通过 SQL 从数据库中批量查询,支持多标签 AND 条件,毫秒级返回结果。
- 🧩 模块化设计:内置四个首页模块,每个模块的标签列表、数量限制、摘要长度均可独立配置。
- 🔄 自动同步:支持设置定时同步间隔(小时级),也可一键手动同步。
- 📝 智能摘要:自动去除 HTML 标签并解码常见实体(
、<等),生成干净、可读的纯文本摘要。 - 🛠️ 零配置标签:模块所需的标签名直接固化在代码中(
["article","recommend"]、["shuoshuo"]等),需要增减时仅修改数组即可,无需额外配置标签。
📦 安装与配置
1. 创建前端脚本笔记
在 Trilium 中新建一个笔记,类型选择 JS Frontend,标题可命名为 首页数据同步控件 2.0。将完整代码(见文末)复制到该笔记内容中。
2. 添加配置标签(在脚本笔记的属性面板中)
| 标签名 | 说明 | 示例值 |
|---|---|---|
saveNoteId | 推荐阅读的目标笔记ID(存储JSON) | your_note_id |
shuoShuoSaveId | 最新说说目标笔记ID | your_note_id |
lastCreateSaveId | 最近发布目标笔记ID | your_note_id |
announcementSaveId | 公告目标笔记ID | your_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=true 和 recommend=true 两个标签。
4. 使用控件
- 刷新 Trilium 界面,左侧面板底部会出现一个同步按钮(带旋转图标)。
- 点击按钮,控件会在后端执行查询,并将每个模块的 JSON 数据写入对应的目标笔记。
- 若设置了
syncInterval,则每隔指定小时自动执行一次。
🧠 工作原理
- 前端按钮触发,读取脚本笔记的配置标签。
- 对每个模块,调用后端 API
api.runAsyncOnBackendWithManualTransactionHandling,在后端执行以下操作:- 动态构建 SQL:根据模块的标签列表,生成多表
INNER JOIN语句(AND 逻辑)。 - 执行
api.sql.getRows批量查询,一次获取所有符合条件的笔记(noteId,title,dateCreated,blobs.content)。 - 遍历结果:去除 HTML 标签 → 替换实体(
等) → 截取摘要 → 格式化日期。 - 将最终数据写入目标笔记:
targetNote.setContent(JSON.stringify(notesData, null, 2))。
- 动态构建 SQL:根据模块的标签列表,生成多表
- 前端收到返回的条数,显示成功消息。
为什么比传统递归快?
- 递归
getChildNotes需要多次异步调用(每个节点一次),而 SQL 查询一次返回所有需要的字段。 - 数据库层直接完成排序和过滤,无需将大量笔记对象传输到 JS 内存再处理。
- 生成的 JSON 索引文件只有几十到几百 KB,前端静态页面直接 fetch 并渲染,飞一般的加载速度。
🔧 自定义与扩展
- 增减模块:在
modules数组里添加新对象,指定labels(标签数组)、saveId、limit、lens即可。 - 修改标签列表:直接编辑对应模块的
labels数组,例如将推荐阅读改为需同时满足article、star、featured。 - 更换排序字段: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 社区或本文评论区交流。祝你知识管理愉快!