node-webkit:用HTML5+JS开发跨平台的桌面应用
过去一年间,Node.js吸引了越来越多的目光;同时,一个叫做node-webkit的项目在Github上引起了越来越多的关注。在启动一年之后,node-webkit从一个默默无闻的项目成功跻身GitHub C++项目关注度排行榜前五强。在2012年的沪JS大会上,该项目的开发者之一赵成做过一个分享,对node-webkit是什么进行了一个介绍。2013年4月,台湾工程师钱逢祥在台湾的开源大会上也介绍了这个项目:这年头,你只需要懂node-webkit!另一方面,英文JavaScript圈子的知名社区JSJ也对node-webkit进行过讨论。最近吸引了很多开发者的新兴IDE工具Light Table,也是基于node-webkit开发的。
node-webkit是个什么样的项目,引起这样多的关注?近日,InfoQ编辑见到了这个项目的发起人Rogerwang,向他了解了一些有关这个项目的情况。
node-webkit项目发起人简介:Rogerwang,真名王文睿,英特尔开放源码技术中心(OTC)的软件架构师。最开始,node-webkit是一个业余项目。现在,Roger可以在工作时间进行这个项目的开发,而且有一个实习生跟他一起工作。
InfoQ:根据我的理解,node-webkit是通过Node.js和WebKit技术的融合,提供一个跨Windows、Linux、OS X平台下的客户端应用开发的底层框架,跟移动终端上的PhoneGap等项目的原理类似,不知这么理解是不是正确?你自己如何介绍node-webkit的目的和实现原理?
王文睿:是的。通过Node.js和WebKit技术的融合,开发者可以用HTML5技术编写UI,同时又能利用Node.js平台上众多library访问本地OS的能力,最终达到用Web技术就可以编写桌面应用的目的。
实现上是基于Chromium项目的Content Layer构建(Chromium Browser也同样基于Content Layer);实现上的特点是把Node.js的消息循环(libuv)和Chromium Renderer进程的消息循环合并到一起,因为这样才能从DOM(HTML)中直接调用Node.js提供的函数;把Node.js使用的V8引擎和Chromium的V8引擎合并,使得Node.js的Javascript和DOM里面的Javascript可以互相访问;另外因为是支持本地应用,所以安全模型和Web程序有很大不同:node-webkit程序可以做web应用不允许做的很多事情,除了通过node.js访问本地OS以外,还可以进行跨域访问等操作。
InfoQ:你是怎样开始了解WebKit和Node.js的?怎么就想到将这两个技术结合到一起,提供一个这样的方案呢?
王文睿:平时的工作和WebKit有关,所以平时也会去了解Web领域相关的技术,所以大概了解Node.js项目的状况。2011年底的一天,我们同事在工作会议上讨论如何为WebKit或者web runtime添加扩展接口API的时候有了这个想法。
InfoQ:你自己如何评价目前项目的完成状态?当前的node-webkit适合开发哪些需求的客户端应用,不适合开发哪些需求的客户端应用?
王文睿:现在已经达到一定的成熟度。有不少公司和各种项目基于node-webkit开发。node-webkit适合了解Web技术(JS/HTML/CSS)的开发者开发各种桌面应用,而且直接支持3种主流桌面平台。
目前它还不支持移动平台。另外也不支持嵌入到其他C++软件中。
InfoQ:node-webkit目前在Github上已经有将近4000个star,360个fork。这个项目目前来自你们团队和外部团队的贡献情况如何?
王文睿:绝大部分代码来自于内部的两个开发者。另一位开发者(Zhao Cheng)在这里实习的半年多期间主要的贡献是开发native UI支持,以及将架构从CEF迁移到Content Layer。
我们一直欢迎和鼓励外部贡献代码。目前来自外部的代码比较少,原因可能是我们的用户大部分是Web开发者,而我们的代码却是C/C++编写的。
InfoQ:你对node-webkit的下一步计划是什么?是否有计划根据这个项目打造一些更加易用的产品?
王文睿:目前的重点主要是进一步增强功能(我们的用户在GitHub的issue上报了很多的feature request)和壮大社区(希望有更多的开发人员加入我们的开源项目)。node-webkit平台本身非常灵活,我们欢迎大家利用node-webkit提供多样的产品和服务。