Joplin教程
🤖 摘要:本文详解Evernote与Notion向Joplin迁移流程。明确“无损”为高保真还原,提供导出路径、自动化脚本与验证清单。澄清Joplin仅支持扁平笔记本配合标签分类,文件夹仅为UI分组。结合结构规范与同步策略,助用户构建高效知识库。
📌 阅读提示:本文假设你已安装 Joplin Desktop/App(v2.14+),并掌握基础同步配置。内容按“迁移实操 → 结构规范 → 避坑指南”递进,可直接作为工作流参考。
一、什么是“无损迁移”?核心目标与边界
| 维度 | “无损”的实际定义 | 技术边界说明 |
|---|---|---|
| 文本内容 | Markdown/HTML 结构完整,无乱码或段落丢失 | Notion 数据库视图、Embed、Toggle 等需手动转换 |
| 附件/图片 | 文件不丢失,路径可解析,Joplin 内可预览 | Evernote 内联图可能转 Base64;Notion CDN 链接需批量替换 |
| 元数据 | 创建/修改时间、标签、来源笔记ID 尽可能保留 | Joplin 默认不继承原始时间戳,需脚本或手动映射 |
| 结构映射 | 笔记本/文件夹 → Joplin Notebook + Folder | Joplin 不支持真嵌套笔记本,Folder 仅为 UI 虚拟分组 |
💡 结论:迁移的“无损”是工程妥协下的最高保真度(通常 ≥95%),而非像素级复刻。本文提供可复现的标准化流程,附自动化脚本与验证清单。
二、Evernote → Joplin 迁移指南
1. 标准导出路径
# Evernote Desktop → 文件 → 导出 → 选择笔记本 → .enex
# 注意:勾选“包含附件”(默认开启)
2. Joplin 导入步骤
- <code>Joplin → 工具 → 导入 → ENEX</code>
- 选择导出的 <code>.enex</code> 文件(支持批量)
- 映射目标笔记本(可新建或覆盖)
3. 常见损耗与修复方案
| 问题现象 | 原因 | 解决方案 |
|---|---|---|
| 图片显示为空白或损坏 | ENEX 中图片未正确嵌入 | 使用 EverExport 导出 + <code>enex2md</code> 转换 |
| 富文本格式降级为纯文本 | Joplin ENEX 解析器限制 | 导入后用 <code>Ctrl+Shift+M</code> 切换 Markdown,手动补全标题层级 |
| 标签丢失或重复 | ENEX 仅导出一级标签 | 导入后使用 Joplin CLI:<code>joplin tag list</code> + <code>joplin note set-tags</code> 批量修正 |
🔧 推荐自动化脚本(Node.js):
# 安装 enex2md
npm install -g enex2md
# 转换并保留时间戳(写入笔记元数据)
enex2md input.enex --output-dir ./joplin_imports --preserve-timestamps
# 导入到 Joplin(需开启 Joplin API)
curl -X POST http://127.0.0.1:41184/notes \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-F "title=@file" \
-F "body=@file.md" \
-F "tags=evernote_migrated,2024" \
-F "notebook_id=YOUR_NOTEBOOK_ID" ./joplin_imports/notes/*.md
三、Notion → Joplin 迁移指南
1. Notion 导出限制(官方)
- ✅ 支持:Markdown + CSV(数据库)
- ❌ 丢失:页面嵌套视图、Toggle、Embed、Comments、部分富文本样式
- ⚠️ 数据库导出为 CSV,需手动转为 Joplin Checklist/表格
2. 高保真迁移工作流
graph LR
A[Notion 页面] --> B(导出 Markdown)
B --> C{清理路径与链接}
C --> D[批量替换 CDN 图片为本地]
D --> E[Joplin 导入 / API 推送]
E --> F[数据库转 Checklist/表格]
🔹 关键工具链
| 步骤 | 推荐工具 | 说明 |
|---|---|---|
| Markdown 导出 | Markdownload(浏览器插件) | 保留标题层级、代码块、表格 |
| 图片本地化 | <code>notion-image-downloader</code>(Python)或手动 <code>Ctrl+S</code> 下载 CDN 链接 | Notion CDN 链接有有效期,需迁移时立即下载 |
| CSV → Joplin | <code>csv2joplin</code>(GitHub)或手动转为 Joplin Markdown Checklist 语法 | 示例:<code>- [ ] Task1\n- [ ] Task2</code> |
| 批量导入 | Joplin CLI + <code>fetch</code>/<code>curl</code> API | 避免 UI 导入卡顿(>500 页推荐 API) |
🔹 Notion 链接修复脚本(Python)
import re, os
from pathlib import Path
def fix_notion_links(md_file):
with open(md_file, 'r', encoding='utf-8') as f:
content = f.read()
# Notion 内部链接格式:[text](https://www.notion.so/.../xxx) → 替换为相对路径或 Joplin 笔记ID
content = re.sub(r'\]\(https://www\.notion\.so/pages/([^)]+)\)', r'](joplin://open?id=\1)', content)
with open(md_file, 'w', encoding='utf-8') as f:
f.write(content)
for file in Path('./notion_exports').glob('*.md'):
fix_notion_links(file)
四、通用验证与修复清单(迁移后必做)
| 检查项 | 验证方法 | 通过标准 |
|---|---|---|
| 内容完整性 | Joplin 对比源文件行数/附件数 | ≥95% 匹配,缺失项记录到 <code>migration_log.txt</code> |
| 图片可访问性 | 双击附件 → 预览成功 | 无 broken image,加载 ≤2s |
| 标签映射正确性 | <code>joplin note list –tags</code> | 无 <code>untagged</code>,来源标签已合并 |
| 跨笔记链接有效性 | <code>joplin search "joplin://open?id="</code> | 全部可跳转,无 404/空目标 |
| 时间戳一致性 | Joplin 元数据 vs 源导出 CSV | <code>created_time</code> / <code>updated_time</code> 误差 ≤1h |
📌 建议:迁移后运行一次 <code>joplin check –full</code>,Joplin 会自动扫描格式异常与孤立附件。
五、Joplin 多笔记本树形结构规范(重点澄清)
⚠️ 核心认知纠正
Joplin 不支持真嵌套笔记本。你看到的“文件夹”是 Notebook Folder(虚拟分组),仅作用于 UI 过滤,不随同步传播,也不影响性能或搜索范围。
✅ 正确结构模型
📁 Notebook Folders(仅本地 UI 分组)
├─ 📁 工作
│ ├─ 📁 项目A
│ └─ 📁 会议记录
├─ 📁 学习
└─ 📁 个人
📘 Real Notebooks(实际同步对象,扁平化)
├─ work_project_a
├─ work_meetings
├─ study_algorithms
└─ personal_finance
📐 设计原则与最佳实践
| 原则 | 说明 | Joplin 实现方式 |
|---|---|---|
| 扁平优先 | 笔记本数量 ≤50,避免同步冲突与 UI 卡顿 | 用 <code>#</code> 标签分类,而非深层 Folder |
| 命名规范 | <code>领域_类型_编号</code>(例:<code>dev_blog_post_01</code>) | 便于 CLI/脚本批量操作 |
| 标签分层 | <code>来源/用途/状态</code>(例:<code>#evernote_import #pending_review #urgent</code>) | Joplin 支持多标签,搜索语法:<code>tag:evernote_import status:pending</code> |
| 同步性能 | 笔记本内笔记数建议 ≤2000,附件总大小 ≤500MB/笔记本 | 超量按项目/季度拆分新笔记本 |
| 跨平台兼容 | iOS/Android 同步对 Folder 支持弱,依赖标签过滤 | 核心结构必须建立在 Notebook + Tags 上 |
🌳 推荐结构模板(适配主流工作流)
1. PARA 适配版
📘 Notebooks:
- projects_active
- projects_archive
- areas_health_work_finance
- resources_tech_books_refs
📁 Notebook Folders (UI only):
- 📁 当前项目 → projects_active, projects_archive, areas_*
- 📁 知识库 → resources_*
2. Zettelkasten / 卡片盒版
📘 Notebooks:
- zettel_fleeting (临时)
- zettel_literature (文献笔记)
- zettel_permanent (永久卡片)
🏷️ Tags: [[主题]] [[状态]] [[关联笔记ID]]
(利用 Joplin 的 WikiLinks `[[note_id]]` 实现双向链接)
六、进阶建议:结构 + 标签 + 同步的协同设计
- 同步前结构冻结:迁移完成后,执行 <code>joplin notebook reorder</code> 统一命名,避免后续 UI 混乱。
- 标签即索引:Joplin 搜索语法强大,优先用标签过滤(<code>tag:work AND tag:2024-Q3</code>),而非依赖 Folder。
- 附件管理:启用 <code>设置 → 附件 → 下载并存储到本地</code>,避免云端依赖导致离线失效。
- 版本控制:配合 Git(通过 Joplin CLI <code>joplin export –format md</code>)实现笔记结构化备份。
结语
迁移不是搬运,而是信息架构的重构。Evernote/Notion 到 Joplin 的“无损”本质是 保真内容 + 优化结构 + 保留检索能力。掌握 Notebook/Tags 的权责边界后,你将获得一个轻量、可脚本化、全平台一致的私人知识引擎。