Matrix 精选

Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。

文章代表作者个人观点,少数派仅对标题和排版略作修改。


经过大半年时间的开发工作,我们近期上线了 JSBox 2.0,又经过两周时间完成了一些优化和修复,现在是时候向大家介绍这个里程碑版本了。

我们在 2.0 版本里面主要做了两件事情:

  • 支持 Node.js
  • 改变了付费模式

这篇文章将详细介绍这两件事情给我们和用户带来的影响。

Node.js 运行时

了解 JSBox 的朋友可能知道,基于 Apple 的 JavaScript 引擎提供了一些编程接口,让你编写的 JavaScript 可以通过我们提供的 API 与 iOS 交互。例如:

  • 读取系统相册
  • 发送 HTTP 请求
  • 绘制图形用户界面
  • ...

我们都知道,JavaScript 社区很多现成的轮子,比如 npm 上面各式各样的 package。由于 JavaScriptCore 和平台的限制,只有很少量的 package 可以被直接用于 JSBox 的脚本。

所以我们在 2.0 里面直接支持了 Node.js,并且十分完善:

  • 完整的 Node.js 环境
  • REPL 环境
  • 包管理器
  • 丰富的 native 模块用于与 iOS 进行交互
  • 与 JSBox 脚本相互调用的能力

如果你已经有 Node.js 的相关知识,那么这些内容对你来说应该并不陌生。简单来说,你可以在 iOS 设备上直接写 Node.js 程序,直接使用各种各样的 npm 模块。

除此之外,我们还提供一系列原生模块,让你的 Node.js 程序可以直接与 iOS 原生功能进行交互,就像 JSBox 脚本之前能做到的那样,相关文档可以在 这里 找到。

如果你对 Node.js 的概念感到一头雾水,那么接下来我们会通过一些实际的例子来介绍 Node.js 如何让 JSBox 更实用。

使用 Express 构建网站

Express 是一个著名的 Web 应用开发框架,基于 Node.js。在 JSBox 里面新建一个 Node 模块时,你会看到这个样例代码:

Express

运行起来之后,将会看到 Safari 打开了一个网站,而网站背后的应用服务器,正是由 Express 所提供。这是一个简单的样例,用于展示一个 Node 模块如何工作。

为 JSBox 提供 Git 支持

我们为 JSBox 2.0 编写了一个 Git 客户端 GitBox(下载),它使用 JSBox 编写界面部分,用 Node.js 实现了其中的 Git 命令:

GitBox

这个客户端支持了 Git 大部分的常用功能,例如:

  • 检出和初始化 Git 仓库
  • 查看提交记录和文件改动(并提供 diff 视图)
  • 分支操作:查看、切换、新建以及合并两个分支
  • 标签操作:查看、检出以及新建标签
  • fetch, pull, commit 以及 push

这是一个完整的 Git 实现,虽然说在手机上常用的操作可能也就是检出项目和查看提交记录,但 GitBox 还是实现了大部分功能。你甚至可以在 JSBox 上完成一些修改,然后将改动推送到远端。

完成这个 Git 客户端,得益于开源项目 isomorphic-git,这也正是支持 Node.js 带给我们的好处。

P.S. 最棒的是,你可以用 GitBox 来检出下面的项目,因为他们都放在了 GitHub。

下载 YouTube 视频

如果想要把 YouTube 视频下载下来的话,只需要复制视频链接,然后打开这个脚本就好了:

YouTube 下载

这个样例基于 ytdl-core, 可以在这里找到。另外,webtorrent 项目也是使用 Node.js 编写,也可以在 JSBox 2.0 上面 直接使用

开发 React.js 程序

因为支持 Node.js,你可以使用 webpack 和 babel 搭建出一个 React.js 的开发环境,就像这样:

开发 React.js

JSBox 的编辑器也提供了高亮支持,虽然写起来不是那么舒服,但验证一下想法是没有问题的,你可以在这里找到这个项目。

开发 Vue.js 程序

基于同样的方式,你还可以搭建出一个 Vue.js 的开发环境:

开发 Vue.js

这个项目和 React.js 的项目类似,都是基于 webpack 和本地的应用服务器搭建出来的开发环境,你可以在这里找到这个项目。

后续开发计划

以上就是关于 JSBox 2.0 里面目前主要更新的介绍,同时我们也在不断地开发新的功能,例如:

  • Dark Mode
  • 自定义主题
  • 编辑器支持多个标签
  • 更好的 iPad 支持

这些功能我们将会在今年的晚些时候提供,敬请期待。

对于付费模式的思考

为了让 JSBox 得到持续的发展,让我们能够投入更多精力去完善这个产品,2.0 采用了全新的付费模式:通过一次付费来解锁当前以及接下来一年的功能,解锁过的功能永久可用。

老用户最关心的问题是:是不是不继续付费,JSBox 就不能用了?不是的。对于老用户而言,2.0 发布以前的全部功能,你都是可以永久免费用下去的。

JSBox 2.0 虽然采用了订阅解锁功能的机制,但相较于「不订阅就不能使用高级功能」的设定而言,最大的区别是功能「一经解锁解锁便永久可用」。停止付费不会损失任何功能,仅在后续看到感兴趣的高级功能时付费,完全可选。

曾经我们也想过将 2.0 版本单独上线成一个新应用,但那种方式会造成版本的分裂,进而老版本里面的一些问题不能得到修复。

为什么不提供永久解锁高级版的机制?基于目前国内黑产的状况,我们不想提供直接通过付费买断应用的机制。但如果用户已经长时间在连续支持,我们可能会直接解锁永久版本,目前具体的方案仍在考虑中。

付费的问题总是会很敏感,而改变付费模式更是复杂,很多人看到订阅制会条件反射地抵触,认为工具类软件并不需要像视频会员那样持续消耗的服务成本,不适合使用订阅制。我们完全尊重从用户角度出发的这个想法,但我也想谈谈我对于订阅制的思考,带大家看看 JSBox 的订阅更新制有什么不同,以及我们为了维护用户权益和软件的持续发展做了哪些努力。

传统付费模式的问题

长期以来,传统付费模式存在一个严重问题:随着维护时间变长,开发者的更新动力会不断下降。最主要的原因是收入下降,尤其是对于小众、独立的作品来说。

JSBox 上线两年多,发布过 60 多次更新,平均每两周就发布一个新版本。其中很多大更新在初始版本里面是没有的,例如:

  • 界面编辑器
  • Markdown 等文件的预览
  • 编辑器插件
  • Node.js 支持

相比初始版本,编程接口的增加和改进更是数不胜数。从持续提供新功能,而不只是修复缺陷的角度来说,JSBox 可以说做到了良心软件的水平。

但是,没有软件可以这么一直更新下去。随着用户群体的饱和,会逐渐变成用爱发电,这对开发者来说是不可持续的。

在订阅制出现之前,普遍的解决方案是发布新的付费应用,让老用户优惠升级。这个方案看起来不错,但也有明显的缺陷:

首先,版本的分裂会导致老版本被遗弃。这意味着如果 JSBox 2.0 是一个新应用,1.0 最初还会有一些 bug 修复之类的更新,但之后就会被放弃,因为开发者不可能管理那么多版本。这对不想要 2.0 功能,只想用 1.0 功能的老用户是不公平的,本质上是逼他们二选一:出钱升级,或者放弃使用。现实中的例子很多,相信很多用户都深有体会。

现在的移动端软件已经不像很多年前 Windows 程序那样,几十年不更新仍然可以跑得很好。iOS 几乎每年都有 Breaking Change,导致应用只要一两年不适配就会体验很差,可以想想你心爱的软件里有没有这样的例子。

另外,这种模式可能会导致用户刚购买老版本就被抛弃。试想一下你在 1.0 版本的末期购买了它,但很快开发者就发布了 2.0,你怎么看待这种问题?

最后,很多应用通过套装实现了老版本到新版本的迁移优惠,但是由于 App Store「一个应用只能被用于一个套装」的限制,后续再升级不能享有优惠。

订阅制的问题

为了解决上述矛盾,订阅制应运而生。很多开发者,尤其一些国外的知名开发者,率先迁移至了这个方案。订阅制可以解决可持续开发的痛点,但却引入了新的问题:

  • 为什么我需要不断地「供养」一个软件?
  • 这个软件又不提供服务,为什么需要订阅?
  • 为什么我买了东西,却不能永久使用?

是的,订阅制让用户失去了对软件的「拥有感」。从用户视角出发,「不续费就把功能给夺走」感觉像是在租用软件,没有踏实感;而服务被简单地归类为「版权费用」「服务器成本」等更容易察觉的支出,对于「持续性的开发成本」缺少了公允的评价标准。

从订阅制被推出以来,我们就一直关注着,但也一直深感推行这种制度面临的阻力。近几年,一些前辈对订阅制进行了更多探索,比如 Sketch 和 Working Copy。他们实行的「订阅解锁更新,并保留已解锁的功能」让我们了解到最适合现阶段的付费制度,是「订阅更新制」。

什么是订阅更新制

也即「付费解锁当前版本的所有功能及订阅期内的所有更新,解锁过的功能永久可用」。这种方式几乎可以解决上述所有问题:

  • 没有版本分裂,不会造成老版本被遗弃
  • 老用户和新用户的权益将得到公平对待,都以时长计算
  • 老用户不需要通过套装升级到另一个应用,还可以享受活动折扣价
  • 只对感兴趣的更新付费,而不会失去已经得到的功能
  • 开发者的开发和维护工作可以良性循环

举个简单的例子:如果你不需要 JSBox 2.0 里面新发布的 Node.js 功能,订阅也恰好过期了,你可以忽略这次更新,不需要付费。而你之前使用的功能,都还可以继续使用,之后的适配和修复也不会少。

如果之后的某次更新有你感兴趣的高级功能,可以付费解锁,你将自动获得当前的全部功能(包括上述例子中你忽略的那一次更新),以及接下来的一年更新。

就是这么简单,没有任何强迫,决定权完全在你自己手里。

而从开发者的角度,可持续的收入会激励我们开发更多有趣的功能,形成一个良性循环,这是我们认为现阶段软件开发的健康模式。

老用户

这种制度已经非常接近我们心目中的理想状态了,但仍然有一个缺陷:JSBox 曾经是一个付费应用,我们必须对付费下载的用户进行妥善的 迁移,为此我们也做了诸多努力。

付费下载的用户被视为自动完成了一年的订阅,所以老用户群体又分成两类:购买未满一年的购买满一年的

对于未满一年的用户,根据规则可以直接获得 JSBox 2.0 的全部功能,无需订阅。而我们仍然为这部分用户提供了 6.8 折的价格,如果订阅的话,剩余时长将被补齐,不会丢失。举个例子,你在 2.0 发布前 6 个月购买了 JSBox,然后用限时优惠订阅了 2.0。App Store 的订阅结束时间是一年后,但我们会把剩余的 6 个月补齐到你的 PRO 权益时长,也即一年半才会结束。

对于满一年的用户,JSBox 2.0 发布的 Pro 功能是需要订阅的,因为 Pro 权益已经过期了。除了同样的 6.8 折订阅外,我们在应用内还准备了一个礼物。这个礼物只有 2.0 发布前已满一年的用户才能获得,算是一个小补偿或者小彩蛋吧。

最后

希望 2.0 是 JSBox 的新开始,因为我们还有很多事情要做去推动它变得更好,感谢大家的支持。

欢迎在评论区留下评论,不管是对付费机制有疑问,或是对功能有期待。我们将会在周五挑选 5 条对我们最有价值的评论,送出 JSBox 一年高级版兑换码一枚。


拓展阅读

> 下载少数派 客户端、关注 少数派公众号 ,发现更多新酷应用 🆒

> 年度回顾、好物推荐……更多精彩尽在 少数派 2019 年度盘点 🎉