为什么我们构建了一个由生锈的桌面应用程序来预览文档
#javascript #网络开发人员 #写作 #rust

我们采取了不寻常的选择来构建用于文档的桌面应用程序。如果环顾四周,文档工具通常属于2个类别:开源CLI工具和基于云的Wysiwyg编辑器。在这篇文章中,我们将讨论导致我们构建桌面应用程序的原因,以及它如何实际工作。

这是为了什么?

我们的桌面应用程序允许用户预览他们的文档一旦发布的样子。它还捕获了错误的链接或句法问题等错误。

用户可以在选择编辑旁边打开我们的应用程序,编辑他们的标记文档,并且该应用程序将在每个保存上刷新以反映最新版本。

an animation of the Doctave app updating the content shown when an edit is made in a text editor

当检测到错误时,立即通知用户,然后单击错误中的链接将您带到页面上。

a cropped screenshot of the desktop app showing an error notifying the user about a broken link

尽管我的意见显然是有偏见的,但这种快速的反馈循环的工作真是太棒了。应用程序需要毫秒才能完成该项目的完整重新渲染,因此您可以在键入的基本上快速移动。

为什么要使用桌面应用?

Doctave是用
建造的 docs-as-code
心里。如上所述,文档工具有两种流行的方法:CLIS和基于云的Wysiwyg编辑。 docs-as-code的点正在处理源控件中的本地文件,因此云立即被输出。

因此,这留下了CLI选项。没有什么可以阻止Doctave拥有此界面的“从技术上”

$ doctave serve .
Serving your docs at http://localhost:9090
...

但这是需要CLI的负面因素。

更好的UX

在过去的几年中,桌面应用程序已经复兴。这可能部分是由于电子等技术使以跨平台桌面应用程序构建的应用程序更容易运输应用程序,但它也是arguably6

因为用户体验可以更好。

我们的用户喜欢在一个地方进行预览和错误检查。您不必旋转终端会议,也不必在编辑器,终端和浏览器之间进行交换。

另外,我们的应用程序很快。我们将Tauri用于应用程序的外壳以及编译您的文档的业务逻辑。它在陶里(Tauri)内部运行,而不是在浏览器环境中(以下内容)。这就是我们可以得到如此快速的响应时间的方式:我们运行本机代码,而不是一束JavaScript甚至WebAssembly。可以在CLI中这样做吗?是的,但是桌面应用程序为我们提供了一个很好的环境来利用本机代码和Web技术。

最后,更新变得琐碎。 Tauri的内置更新功能在3个操作系统中无瑕,确保我们的用户拥有最新,最出色的版本,但头痛最小。每次有新版本时,您都会收到一个弹出窗口,并且更新会自动发生。实际上没有一种更新CLI的通用方法。

非开发者用户

许多使用技术文档的人本身不是开发人员。它们仍然是技术性的,但是在技术作家,产品经理或支持代理等角色中。他们在命令行上很舒服,可以使用git,但不想花时间理解为什么他们的OpenSSL版本不符合预期。

如果您希望用户设置一个复杂的开发环境来运行您的工具,那么您将疏远这一重要的用户组。当微小的环境差异导致npm install失败时,甚至开发人员也会感到沮丧!

有一些减轻这种方法的方法,例如构建静态二进制文件。但是,您仍然存在一个问题,即在发布功能时使用户更新您的SDK,必须支持不同的软件包管理器,必须确保OS不会将软件标记为恶意,等等。

我们从用户那里听到的常见评论:使用Doctave更容易。

它是如何工作的?

如上所述,Doctave使用Tauri作为我们应用的外壳。将其视为轻巧且以安全性为中心的电子。这是一个非常有趣的项目,我强烈建议您进行检查。出于我们的目的,以下是有趣的两个关键功能:

  • 它使用每个操作系统的本机Web视图,使应用捆绑包 明显较小
  • 您可以在Rust中编码您的本地“后端”,您可以从内部调用它 Web视图

(注意:这不是“ Web服务器后端”。这是运行本机的代码
在本地的Tauri过程中。)

Doctave的核心文档项目解析代码是用Rust编写的,我们称其为libdoctave。它需要输入一堆文件,并创建一个内存结构,您可以用来渲染Doctave文档网站。它均在桌面应用程序和我们的Web平台中使用,并通过Rustler编写。

这就是我们能够在桌面和Web平台上共享代码的方式。无论我们在哪里,我们都可以呈现相同的内容。

渲染页面

为例,让我们浏览当Doctove呈现您正在编辑的页面时发生的事情。

首先,Doctave在我们的本地“后端”中运行一个线程,该线程正在监视文件系统事件。如果检测到更改,它会触发该项目的刷新。这是其工作原理:

  1. 后端重新阅读 all disk的项目文件
  2. 它将这些文件馈送到libdoctave以创建项目中的内存表示
  3. libdoctave首先运行一个build阶段,以检查项目在句法上是正确的
  4. libdoctave接下来运行一个verify阶段,在其中检查所有页面是否有问题
  5. 最后,请求的页面的HTML已序列化并发送到前端以显示,并将任何错误

每次您编辑文件时,这一切都会发生在单位数毫秒中。

如您所见,如果需要,仍然有很大的优化空间。对于逐步更新libdoctave内存表示表示,我们可能会更聪明。我们只能通过读取已更改的文件来减少IO。

到目前为止,这并不是必需的。

桌面应用岩石ðÖ

押注陶里(Tauri)并总体上拥有桌面应用程序是一个很好的决定。尤其是我们对技术的选择,即生锈,这种组合是一种令人愉快的或有点常规的技术堆栈。

每个初创公司都有一定数量的“创新代币”,您可以在风险和/或新技术上使用。在我们的情况下,这是一项巨大的投资。