Raycast和它的插件系统

Published on
Authors

Raycast是我最近非常喜爱的App,他完全取代了Alfred。就像VSCode取代Sublime,Figma取代Sketch一样,不需要过渡,直接全方位取代。
强烈推荐macOS用户试试Raycast,目前个人用户完全免费。 已经有很多文章介绍Raycast有多么好用了,我这里只说说Raycast插件系统的设计,可以说做到了开发体验、安全性、性能、UI一致性的完美平衡。 下图是Raycast的Github插件,查看我提交的一个Pull Request。其中有较为复杂的UI,也能渲染Markdown文本,那具体是如何实现的。 Raycast插件示例

开发体验

想要开发Raycast插件需要会什么?需要学习什么?

需要会什么:

  • TypeScript
  • React

需要学习什么:

  • Raycast的部分API
  • Raycast提供的组件库

TypeScript和React大部分前端开发者都会用。学习一个组件库和API,对于开发者也不是难事。给Raycast开发一个插件,用到的就是大部分前端开发者日常工具链,而且Raycast还支持React Devtools进行调试。 Raycast调试 Raycast调试

性能

看到Raycast使用React和TypeScript开发,一瞬间就想到是不是用了Electron或者WebView,但Electron的启动速度、包体积、资源占用是很大的。
Raycast采用了一个非常巧妙的办法,类似React Native他们实现了自己的Reconciliation,把React component tree转为AppKit渲染。
这样Raycast与开发者都可以利用React的生态,比如react-devtools,比如各种前端库,又能保证性能。 Raycast提供一个 @raycast/api库,里面只有一个二进制文件和TypeScript定义。RPC调用等事情都是由这个库实现的。

UI一致

因为Raycast使用了类似React Native的渲染方式。所以开发者只能使用Raycast提供的组件,而不能任意实现。
这样Raycat就能保证UI的一致性,也能保证各个UI组件的渲染性能(比如渲染一段Markdown)

安全

关于插件的安全问题涉及这几点:

  • 插件和插件之间隔离
  • 插件和Raycast主程序隔离
  • 插件和宿主机隔离

Raycast的插件是由Node.js子进程运行的。Raycast通过RPC和Node.js通信,插件自身是不能直接影响Raycast的。
每个插件运行在独立的Worker里,保证插件与插件之间是隔离的。
目前插件是能访问文件系统的,未来可能会限制。不过Raycast提供了API给插件使用,用于保存密码、Token之类的敏感信息。

除了技术层面解决安全问题,在插件管理上也很巧妙。
Sketch、Alfred的插件都是Github的一个个Repo,很多都不再维护。但Raycast使用一个官方Repo维护所有插件。开发者想要提交插件,就向这个Repo提交Pull Request。

这就带来两个好处:

  • 代码完全开源,其他人可以参考,可以review安全问题
  • 代码由Raycast管理,当API更新后有不兼容改动,Raycast可以直接升级

总结

Raycast利用React的特点使其能高性能的渲染插件,又因为用的TypeScript和React,使开发者能够更容易上手。非常巧妙。