2009 年,Node.js 横空出世,JavaScript 终于突破了浏览器,可以在不同的平台上处理各种各样的任务,但当时,人们还只是拿它作为 Web 服务器或者前端开发工具来使用。到了 2011 年,有个人突发奇想,既然 Node 可以运行在不同的桌面上,为什么不拿它来开发桌面应用呢?于是,node-webkit(后改为 nw.js)诞生了。到今天,用 JS 开发桌面应用已经是从创业公司到巨头的共同选择。
这个人就是 Roger,今天,我想和你聊聊他的故事。
Roger 原名王文睿,老家在辽宁大连,1996 年进入中科大后一直读到博士毕业。在上课和研究期间,他第一次接触了 Linux,第一时间就产生了浓厚的兴趣。最开始,他只是在学校 BBS 的 Linux 版面上活跃,在上面交流和回答其他人的问题。和其他热衷 Linux 的同学熟悉以后,他开始组织线下的活动,包括一些现场的讲座和交流,以及 LUD(Linux User Diner) 聚会。当时学校向他们提供了定期场地,后来,在 2003 年他和其他小伙伴们注册成为了学校正式的社团,这就是中科大 LUG(Linux User Group)的由来。
2005 年,Roger 博士毕业,进入了英特尔,并且一待就超过了十年。
很多人可能以为英特尔就是个做芯片的公司,但实际上,英特尔的软件和服务部门有几千名员工,加上其他部门从事软件开发工作的人员,规模和一个大型的软件公司相当。所以在内部可以为工程师提供各种领域的工作机会。
在英特尔,Roger 待过不少的项目组,从开发虚拟化和应用移植的方案,之后在开发者工具产品部门和开源技术中心任职,参与 Java XML 性能库、MeeGo 和 Tizen 操作系统等多个系统和软件开发项目。
Roger 很喜欢英特尔的工程师文化的工作氛围,英特尔会不断追求前沿的技术以保证自己业界领导者的地位,因此员工都有机会学习和参与到业界最新技术当中。
(业余时间里,Roger 除了研究业界技术动态以外,还喜欢美剧、游戏和足球等活动。最近喜欢研究厨艺,他说,做菜和喜欢的编程有很多相似之处。)
现在,Roger 的工作很大一部分与开源相关,他每天仍然会写代码,也一直在维护知名开源项目 nw.js。他认为如果乐于不断学习新知识,并且乐于以更聪明的方式工作,编程会是一项非常理想的工作。
MeeGo 和 Tizen 是基于 Linux 的移动操作系统,它们是英特尔、诺基亚和三星带头发起,曾试图作为 Android 和 iOS 的挑战者,类似的操作系统还有 Mozilla 发起的 Firefox OS。它们的特点是基于 html5 等 web 技术编写应用,鼓励跨平台的开发生态环境。
但是,这些尝试都失败了,Web 技术编写移动应用在当时还不成熟,功能和性能都有所欠缺,移动设备和网络的性能低下,也无法给 Web 应用提供良好的体验。
从 2009 年开始,Roger 所在的团队当时的工作是给这些移动操作系统开发 Web Runtime,即让这些 Web 应用跑起来的核心引擎。其中一项主要的任务就是拓展它的本地 API,比如操作本地文件、使用 GPS 传感器等,以实现和原生应用同样的功能。
对于如何实现这个功能,项目里的同事有不同的想法。Roger 在会议上和同事讨论时,他起初是想利用 Mozilla 的 js-ctypes 这样的项目,可以让 JavaScript 方便的调用任意 C 语言的代码。不过这个想法并没有被采纳。
后来英特尔开源部门开展了创新计划活动,工程师可以花 10% 的时间投入在自己的项目上,Roger 又想起了这个想法。那时候 Roger 正好了解到 node.js 这个项目,感觉用它来扩展本地的 API 是最好的选择——它拥有足够的能力,而且 JavaScript 开发者很熟悉 Node.js 的 API,它正好也处于起步阶段(当时的 Node.js 平台上有大概 4000 多个软件包),很受欢迎。Roger 想到了将两个项目集成在一起,这样 web 开发者就可以在 web 页面中直接调用 Node.js 平台的众多库。
说干就干,Roger 很快开始了编写代码,第一个实现的版本是基于 webkit 和 Node.js,命名为 node-webkit,经过了公司内部的开源流程后于 2011 年底在 GitHub 上 发布,并在 Node.js 社区的邮件列表里 宣布。由于它实现了一种新的编程方式,并且开发者不需要学习新知识就可以直接开始使用,在社区里得到了很好的反响。
公司的其他部门也对这个项目产生了兴趣,甚至有些人开始用它开发产品,后来公司也表示了进一步的支持,同意他用 50% 的时间来开发这个项目,过了一段时间以后又同意他招收一个实习生来一起工作,他在项目的邮件列表里发布了职位,不久后他收到了赵成的简历。
赵成以前曾经把 gtk 库的一些功能包装给 Node.js 使用,毫无疑问这是一个能力很强的小伙子,Roger 很快接纳了他,两人一起对 NW 做了改进,后来赵成成为当年的英特尔最佳年度实习生之一。
赵成本有机会留下来,但他最终还是选择离开,在 2012 年 12 月,他给 GitHub 做外包开发,尝试将 Atom 从嵌入式 Chromium 框架和原生 JavaScript 迁移到 NW 上来,由于项目的特殊性,移植困难重重,并导致最终诞生了 Atom Shell 项目(即后来的 Electron),这是和 NW 类似,同样用 Web 技术开发跨平台桌面应用的工具。
随着 NW 和 Electron 的推动,使用 Web 技术开发桌面应用的技术终于彻底流行开来。
NW 上一次最重要的改进是在 2016 年发布的 0.13 版本,它的内部进行了一次重构。经过这个版本以后,NW 的软件质量有了不少提高,并且也能按时跟随 Chromium 发布新版本。对于这类项目来说,升级 Chromium 代码非常重要,因为 NW 发布的软件代码中,99% 都来自 Chromium 项目。每次 Chromium 升级都会修正大量错误,包括几十个安全补丁,同时提供最新的 Web 标准、新功能、新硬件支持和性能改进。这次重构也是以后很多的工作的基础。
NW 的大部分代码来自于 Chromium 和 Node.js 两个项目,Roger 和其他贡献者编写的那部分采用了 MIT 授权,加上 Chromium 和 Node.js 项目的开源授权,所以任何人在这些授权下都可以将这个项目商业化。对商业化的友好,导致后来出现了一些下游的商业化项目,例如 tint,以及集成和重新发布了 NW 的其他开发工具,例如 Construct2。
现在,NW 能够定期跟随 Chromium 和 Node.js 发布最新的版本,软件质量也有了不少提高。使用 NW 开发的软件也越来越多,典型的有微信小程序开发者工具。
NW 创立了使用 Web 技术开发本地应用的一种新模式,应用程序使用 Web 技术开发,容易开发出漂亮的用户界面,并借助 Node.js 平台的强大功能;同时对想开发本地应用的公司来说也比较容易找到开发者;已有的网站代码也易于复用。未来希望借这个项目推广这种开发模式,让越来越多的应用使用这种技术开发。或许它会成为 Java runtime 或者 .NET runtime 这样应用广泛的技术。
但同时 Roger 也认为,NW 这类技术仍然有很长的路要走:首先是性能需要进一步优化,如果能占用更少的内存、对用户输入响应更快的话,体验会更接近原生应用;另外 Web 平台的快速演进和稳定性对应用开发者也是一大挑战:目前,依赖 Web 运行时的应用需要不断维护以应对浏览器升级,例如 Chrome 66 版本中 autoplay 策略的变更就使很多网站不能正常工作,直到 Chrome 71 中才采纳开发者的意见实行了一个折衷方案。
Roger 乐于看到 Electron 的发展,他希望 Electron 能够和 NW 一起,推动这个领域不断的扩大和发展。对应用开发者来说,同时有两个选择,并且它们之间相互促进发展是比较理想的情况。
经历了 MeeGo 和 Tizen 的失败,以及 NW 的成功,让 Roger 认识到:知道什么是正确的事,比知道如何高效的做某件事重要的多。它会让你少走许多弯路,效果远高于延长工作时间和提高工作效率。雷军有句名言也表达了类似的意思,只要不走到只知道空谈的另一个极端,找方向值得你花更多的时间。技术人在选择技术和规划职业道路时也同样适用,希望 Roger 的经历和他的感悟能给读者一些参考。
在移动端研发领域 Native 研发效率低体验好,Hybrid 研发效率高体验差,美团支付基于容器增强在界面体验的实践,让美团钱包达到接近 Native 体验,同时兼备 Hybrid 的研发效率,其中包括白屏问题的解决,SPA 使用 Native 导航,离线化等。具体技术措施可以来 ArchSummit 现场听分享。会议报名最后 3 天,感兴趣联系票务灰灰 17326843116
戳 阅读原文,了解更多干货详情!