目录11

写作工作流

写作工作流

这篇说明「在 Obsidian 写笔记 → 发布到博客」的完整流程。

数据流

   你的笔记(位置任意)                   Astro 站点
   ─────────────────                ──────────────────
   任意路径/我的笔记.md  ──npm run pub──▶  src/content/blog/我的笔记.md
   (原生语法,永不改)      转换           (标准 markdown,构建输入)
   任意路径/图片目录/                          │
        │                                      ▼
        └────图片复制──▶  public/attachments/我的笔记/
                                               │
                                               ▼
                                         npm run build
                                               │
                                               ▼
                                         dist/ 静态站点

核心原则:源文件永不修改。 发布脚本只读它、转换后写到别处。 这样 Obsidian 里始终是原生语法(图片正常显示、双链可跳转), 博客拿到的是干净的标准 markdown。

日常流程

最常用:指定一篇笔记 + 它的附件目录

Bash1 行
node scripts/publish.mjs "E:/笔记/机器学习.md" --img "E:/笔记/附件"

附件目录可以给多个(同一张图散在几个地方也没问题):

Bash4 行
node scripts/publish.mjs "E:/笔记/ML.md" \
    --img "E:/笔记/附件" \
    --img "E:/图库/截图" \
    --img "D:/其他/配图"

-i 是 --img 的简写:

Bash1 行
node scripts/publish.mjs "E:/笔记/ML.md" -i "E:/笔记/附件" -i "E:/图库"

也可以给目录(发布目录下全部 .md)

Bash1 行
node scripts/publish.mjs "E:/笔记/博客" --img "E:/笔记/博客/附件"

完整流程

Bash13 行
# 1. 在 Obsidian 里写完,确认图片都放好了

# 2. 看一眼会做什么(不写文件)
node scripts/publish.mjs "E:/笔记/ML.md" -i "E:/笔记/附件" --dry-run

# 3. 发布
node scripts/publish.mjs "E:/笔记/ML.md" -i "E:/笔记/附件"

# 4. 校验图片引用(会列出命中失败的)
npm run check

# 5. 预览
npm run dev

命令一览

选项 作用
--img <目录> / -i <目录> 图片查找目录,可给多次
--dry-run 只看会做什么,不写文件
--force 覆盖 src/content/blog/ 里已存在的同名文件
--keep-images 不复制图片(图片已在 public/ 里)
--flat 图片直接放 public/attachments/ 下,不按文章名分目录

不带任何路径参数时,退化为旧行为:发布 obsidian/博客/ 下全部, 附件按文件名匹配。

图片怎么被找到

按你给的目录顺序找,每个目录也会看一层子目录:

  1. 每个 --img 指定的目录(含其一层子目录)
  2. 笔记文件自己所在的目录(含其一层子目录)

允许省略扩展名 —— 写 ![[截图]] 会依次试 .png / .jpg / .jpeg / .gif / .webp / .svg / .bmp / .avif。

图片在站点上的位置

<任意源路径>/截图.png
  →  public/attachments/<文章名>/截图.png
  →  引用写作 /attachments/<文章名>/截图.png

这条规则与源目录无关,只取决于文章名。所以:

  • 换源目录、换笔记放哪都不影响 —— 不会出现「引用与文件对不上、图片全 404」
  • 不同笔记的同名图片互不干扰(各自在自己的子目录下)
  • 加 --flat 则统一放 public/attachments/,不分子目录

路径里的中文与空格用 encodeURI 编码(空格 → %20、中文 → 百分号编码)。

脚本做了什么

Obsidian 写法 发布后 说明
![[图.png]] ![图](/attachments/<文章名>/图.png) 并复制图片到 public/
![[图.png|600]] 同上,尺寸丢弃 Obsidian 的显示宽度,Astro 按容器自适应
![[图]] 同上 省略扩展名,自动试所有图片扩展名
![](图.png) ![](/attachments/<文章名>/图.png) 相对路径 → 站点绝对路径
![](图.png|800) 同上,尺寸丢弃
![](https://…) 原样 外链不动
![](/attachments/…) 原样 已是绝对路径
[[某笔记]] 保留并警告 本站未启用 wikilinks,会显示成 [[某笔记]]
> [!note] 标题 蓝框 callout 照常转换
frontmatter 缺 date 自动补(用文件 mtime) 缺了会导致整篇构建失败

常见问题

图片 404

跑 npm run check,它会列出所有命中失败的引用。 注意它已排除代码块与行内代码里的示例文字,报出来的都是真问题。

「找不到图片」

图片不在你给的任何一个 --img 目录里。检查三件事: 目录路径拼对了吗、文件名与笔记里写的完全一致吗 (中文文件名容易差一两个字符)、图片是不是在更深层的子目录里 (脚本只看一层)。

「已存在,跳过」

src/content/blog/ 里已有同名文件。加 --force 覆盖 —— 但注意这会丢掉你对已发布文章的直接修改,改旧文建议直接编辑 src/content/blog/ 下的那份。

在 Obsidian 里设置附件位置

设置 → 文件与链接 → 附件默认位置选「当前文件夹下的指定文件夹」, 填 附件。这样所有图片自动进同一目录,发布时一个 --img 就够。

为什么不自动监听

Obsidian 存盘非常频繁(改一个字就触发),监听会导致 dev server 反复重建。 手动触发更可控 —— 发布前你还能在 Obsidian 里预览效果。

与「直接编辑 src/content/blog」的关系

两种方式并存,按场景选:

Obsidian → 发布 直接编辑 src/content/blog/
图片 Obsidian 里能正常显示 看不到图(那些是绝对路径)
双链 可跳转 无效
语法 Obsidian 原生 已是标准 md
适合 新文章、需要配图 改旧文、微调措辞

改已有文章时两种都行 —— 直接改 src/content/blog/ 下那份即可, 重新发布需要加 --force(会覆盖)。