原文地址:My Github Blog
這兩個月來接觸到一個開源項目:node-webkit(項目地址:https://github.com/rogerwang/node-webkit),也做了一點點小小的Code Contribution。打算開始寫一些文章,介紹一下這個開源項目,以及相關的技術細節實現。這是第0篇,就先作為一個簡要的介紹吧。
是什么?
node-webkit是一個基於chromium和node.js實現的應用程序運行時環境,也即是說我們可以通過HTML,CSS,JavaScript實現一個本地化的應用程序。整個項目最具創意的部分就是將node.js整合進來,使得應用開發者能夠直接在DOM里使用node.js模塊,大大增強了Web端JavaScript的能力。該項目是由Intel開源項目中心開發與維護的。
架構概覽
目前node-webkit是基於chrome content api實現的,架構圖如下:
如果熟悉chrome這個瀏覽器架構的人一眼就可以看出來,node-webkit所處的層次與chrome是一致的,換句話說:node-webkit就是一個功能極簡的web瀏覽器,它可以用來加載網頁,執行JS腳本,不論是本地的html文件還是服務器端的文件。
- 至於什么是chrome content api呢?該模塊的主要功能是采用多進程(包含Browser進程,Render進程以及GPU進程)的模型渲染一個頁面。它包含了幾乎所有的HTML5的特性以及GPU加速渲染。該模塊的目的就是讓想在應用程序中嵌入瀏覽器模塊,但又不想包含全部瀏覽器所有功能的開發者使用的。
- 為什么要采用chrome content api而不是其他?
- Content API提供了公開且穩定的接口,且相對於CEF3更加靈活。CEF3也是基於Content API實現的一個可以將渲染網頁的功能嵌入到應用程序之中的框架,雖然其接口經過封裝后使用起來相比比較簡單和方便,但是當需要使用到Content API的很多功能時候,CEF3的接口可能做不到。
- V8引擎的高效。眾所周知,V8引擎對於Javascript這門語言的重要性,chrome瀏覽器的成功也得益於其執行Javascript的快速!而對於node-webkit,作為一個本地化的應用程序運行環境,javascript代碼執行的效率也是至關重要的,使得應用程序與用戶之間的交互更接近Native Application的流暢性。
- 前面介紹Content API的時候也提到了,HTML5的特性以及GPU加速,對WebGL等的支持。最新版本在html5test.com測試得到的分數是:460。
如何使用其進行開發?
接下來的這個部分將完成一個簡單的應用程序。主要想體現的是:(1)使用node.js模塊;(2)nw提供的增加本地化應用特性的API;(3)打包並發布你的應用程序。
- 了解應用程序結構。如下圖所示,每個應用程序都會有一個package.json文件來描述應用程序的相關信息以及初始窗口的屬性等。
示例程序的package.json文件內容如下:(關於各個參數所代表的含義可以在wiki上查找:https://github.com/rogerwang/node-webkit/wiki/Manifest-format)
index.html文件的內容如下,該段代碼主要是使用node.js的fs模塊讀取"E:/"目錄下的文件夾,在每個文件夾的點擊事件中,我們調用node-webkit
中提供的shell接口在窗口管理器中打開該文件夾。
- 打包應用並發布。具體的打包方法https://github.com/rogerwang/node-webkit/wiki/How-to-package-and-distribute-your-apps。效果圖
扯點node-webkit與chrome packaged app的不同。
- 更少的開發限制,更自由:在node-webkit中,我們可以發現其sandbox特性已經被關閉。熟悉chrome packaged app或者extension開發的人都知道其對安全性的要求之嚴格,比如CSP的限制。而在node-webkit中,這些限制都不存在,作為一個本地化的應用程序運行時環境,我個人覺得這個是非常重要的一點!
- 更本地化的接口:node-webkit實現了很多有關窗口操作的API,同時也實現了像菜單欄,系統的托盤圖標支持,系統剪貼板等的API,目前還在不斷的完善中。(我自己也參與到了一部分API的開發中,同時也修復了一些小bug。)
最后:目前采用node-webkit開發出來的應用程序列表:https://github.com/rogerwang/node-webkit/wiki/List-of-apps-and-companies-using-node-webkit,據我所知道
LightTable 也是基於node-webkit實現的。
我的Github:
@zhchbin
