node-webkit:用 HTML5+JS 开发跨平台的桌面应用

  • 杨赛

2013 年 7 月 7 日

话题:HTML5Node.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 提供多样的产品和服务。

HTML5Node.js语言 & 开发