博客

Excalidraw 桌面版:PWA、Pake 应用,以及怎么把画好的图搬进去

常用网站 · · 约 8 分钟

Excalidraw 自己的页面里没有一处写到桌面客户端,所以能选的是浏览器标签页、安装 PWA,或者做一个 Pake 应用。Pake 应用能让 Excalidraw 有自己的图标和窗口,但有一个常让人意外的地方,它用的是自己的存储,你在浏览器里画的图不会出现在应用里,要先把图保存成 .excalidraw 文件,再到应用里打开这个文件。

Excalidraw 自己提供什么

Excalidraw 的 README 写到的是 excalidraw.com 上的托管应用、可以嵌入自己项目的 npm 包,以及集成里的一个 VS Code 扩展,并且给托管应用标了「PWA support (works offline)」。文档讲的是把这个包当 React 组件安装,Excalidraw+ 的页面讲的是云端工作区,三处都没有提到桌面客户端,比较合理的判断是官方没有。

这样想要一个独立窗口的 Excalidraw 就有三条路:

  • 浏览器标签页。 什么都不用装,画好的图也本来就在这里。
  • PWA。 Excalidraw 的 web manifest 把 display 设成了 standalone,所以 Chromium 内核的浏览器可以把它装成一个应用窗口,它还声明了 .excalidraw 是自己能打开的文件类型。各个浏览器怎么安装、和页面共享什么,见PWA 还是桌面应用。
  • Pake 应用。 系统网页视图外面的原生窗口,加载 excalidraw.com,再叠上 Pake 的窗口选项。

PWA 装得上的话它就是不错的答案,不用再多装一个工具。Pake 应用适合装不上的情况,比如浏览器不能安装、用的是 Linux 桌面,或者想做点配置,例如抄图的时候让它始终置顶压在文档上面。

画的图存在哪里

这一段决定了你怎么在浏览器和应用之间搬图。从 excalidraw.com 的源码看,当前画布会写进页面的 localStorage,元素放在 excalidraw 这个键下,视图设置放在 excalidraw-state 下,每次改动之后一小会儿就保存,粘贴进来的图片和你的形状库则放在页面的 IndexedDB 里。Excalidraw 在开始界面上也这么说:「您的绘图已保存在您的浏览器存储中,浏览器存储可能会被无意清除,将您的工作定期保存到一个文件,以避免丢失」(英文界面是 Your drawings are saved in your browser's storage)。

浏览器存储属于某一个浏览器配置和某一个网站,Chrome 里的 excalidraw.com 和 Safari 里的是两份,另一个应用里的网页视图又是一份。Pake 应用建在系统网页视图上,Mac 上是 WKWebView,Windows 上是 Microsoft Edge WebView2,存储是它自己的,所以哪怕你在 excalidraw.com 上画了一年,应用启动时画布也是空的,这和在 Safari 里登录过某个网站、应用并不会跟着登录是同一个道理,见 Notion 桌面版。

图并没有丢,它还在浏览器里,只是应用看不到。两边之间的桥是文件,因为 Excalidraw 的文件格式是扩展名为 .excalidraw 的开放 JSON 格式,两边都能读写。

从精选里做出来

在 Pake 的创建页里,在粘贴网址或搜索下面应用开始创建中输入 Excalidraw,或者打开效率分类点 Excalidraw 这一项,找不到就粘贴 https://excalidraw.com/。这一项只带了网址、名称和图标,描述是「手绘风格的白板和示意图」。无痕浏览保持关闭,因为无痕不保留网站数据,每次关掉应用图就没了,然后点创建应用。

想用命令行,或者要在 Arch 以外的 Linux 上做,Pake CLI 可以做同样的事:

pake https://excalidraw.com --name Excalidraw

精选里的条目和它们的设置怎么工作,见 Pake 的精选页。

把浏览器里的图搬进应用

在图所在的那个浏览器里做,要赶在你开始依赖应用之前。

  1. 打开 excalidraw.com,打开主菜单。
  2. 选保存到...,弹出的对话框标题是保存到本地,说明写的是把画布数据导出成之后可以导入的文件,点保存为文件,浏览器会写出一个以图名命名的 .excalidraw 文件(英文界面里分别是 Save to...、Save to disk 和 Save to file)。
  3. 打开你的 Pake Excalidraw 应用,在它的菜单里选打开(英文 Open),或者按 Cmd O(Windows 和 Linux 上是 Ctrl O),选中那个 .excalidraw 文件。

应用里的画布上已经有内容时,从菜单里点打开会先问一下,从文件加载这个对话框写着从文件加载将替换现有内容,并给出先备份的几种方式,按 Cmd O 则不问,直接替换画布,所以先看清你是往哪一边加载。反过来也是同样的步骤,在应用里保存到...,到浏览器里打开。

在 Pake 应用里,保存出来的文件可能是作为下载到达的,而不是走一个保存对话框。Pake 应用把下载放进系统的下载文件夹,用 Pake CLI 的话可以用 --download-dir 换一个文件夹,见命令行参数。先看一眼第一个文件落在哪里,再把它挪到你放图的地方。

你的形状库是另一份,它放在 IndexedDB 里,可以导出成 .excalidrawlib 文件,到另一边再导入库里。

让文件当主本,别让浏览器状态当主本

两个地方各存一份之后,唯一始终一样的就是文件,所以把它当主本。一个好用的习惯是给图起个名,用 Cmd S 存进一个有备份的文件夹,之后就从这个文件接着画。第一次保存为文件之后,Excalidraw 可以出现一个保存至当前文件的菜单项,直接写回同一个文件,不过只有页面拿到了这个文件的可写句柄时才会这样,没有的话就再用保存到...存一次,旧的那份自己替换掉。

要把图发到 Excalidraw 之外,导出图片...(Cmd Shift E)里有包含画布数据这个选项(英文 Embed scene),带着它导出的 PNG 或 SVG 里仍然有画布数据,以后可以再打开这张图,不带的话它就只是一张图片,Excalidraw 没法从里面恢复画布。

Excalidraw+ 和免费版

Excalidraw+ 是付费的云端那一边。它的价格页把 Free 写成完整的编辑器加一个无限画布,Plus 是每位用户每月 6 美元,有不限数量的画布和文件夹、云端保存、可编辑或只读的分享、PDF 和 PPTX 导出,另有 14 天试用。页面上没有提到 Plus 的桌面客户端或离线使用。

图要跟着你在几台设备之间走的话,云端保存正好解决这件事,套一层壳替代不了,Pake 应用打开的是同一个网站,套餐限制也一样。如果自己备份一个放 .excalidraw 文件的文件夹就够,免费版加文件就能覆盖。

出问题时怎么查

  • 应用里的画布是空的。 这是预期的,原因见上文,先在浏览器里把图保存成文件,再到应用里打开。
  • 每次启动之后图都没了。 先检查无痕浏览,点编辑,关掉后点保存修改。已经是关闭的话,看有没有存储提示,配额用完时 Excalidraw 会写「超过浏览器存储配额。更改将不会被保存。」,赶紧存成文件。
  • 打开没反应或者文件被拒绝。 不是 Excalidraw JSON 的文件会被拒绝,导出时没勾包含画布数据的 PNG 或 SVG 也没法恢复成画布。

重要的图搬之前先拿一张临时的试一遍,在浏览器里画个矩形,保存,在应用里打开,再关掉重开应用,确认画布还在。

常见问题

Excalidraw 有官方桌面客户端吗?

README、文档和 Excalidraw+ 的页面都没有列出。它发布的是托管应用(本身是 PWA)和 npm 包,README 的集成里另外列了一个社区做的 VS Code 扩展。早年的 Electron 套壳 excalidraw/excalidraw-desktop 已经在 GitHub 上归档,并标为弃用。

能双击 .excalidraw 文件直接打开吗?

装好的 Excalidraw PWA 在 Chromium 浏览器里声明了 .excalidraw 是它能打开的文件类型。Pake 应用里请在应用内用打开选文件。

Pake 应用能离线用吗?

Pake 加载的是网站,应用自己没有离线副本。Excalidraw 的离线能力来自它的 PWA,离线画图很重要的话就用 PWA。