====關於原生程序與殼中程序的議論begin====
在所有用戶windows機器上都能直接跑的程序,如果不采用微軟系的語言,如VB,C++,C#等,而采用Java,Python,Ruby之類的語言開發,最終的結果在體積上一定遠大於微軟系語言開發的程序,因為這些語言不具備直接生成exe執行文件的能力,都需要額外的中間層來提供環境,而這個中間層的體積往往不小。
最直觀的道理就是,java程序只能在裝有java虛擬機的機器上跑,如果你想突破這個限制,讓它跑在任何一台機器上,那你必須把虛擬機打包在你的程序里一並提供給用戶,最終還是改變不了要跑在虛擬機里的命運,唯一的好處是不用客戶手動安裝虛擬機了,其他語言同理。
這就是原生程序與加殼程序的區別,原生程序的優點在針對特定平台編譯,體積小,速度快,而加殼程序因為必須把殼引入到用戶機器中,體積臃腫,加殼程序的優點在可以用程序員自己舒服的語言開發,而且甚至可以跨平台開發——發布的時候針對不同的平台加不同的殼就OK了,java的招牌式口號“一次編寫,處處運行”前提正是其程序都是殼中程序,不同的殼(即java虛擬機)向上暴露的接口都是一樣的,這樣殼中程序可以在安穩的環境中編寫。
在微軟系的語言中.NET是個有意思的角色,嚴格講它編寫出的程序也是殼中程序,但這個殼是微軟的“官方殼”,不管你用到的第一個使用.net殼的windows程序是什么,微軟會引導你下載安裝這個殼,之后一勞永逸,你再使用其他的殼中程序就不用再下載了。在這個角度上看,.net官方殼幾乎與windows操作系統融為一體了,共同構成了應用程序的下層基礎,把應用程序看做直接基於平台的原生程序也無妨了。
至於java開發的桌面程序,由於始終是小眾奇葩的存在,而且不是微軟官方支持的,如果你只發布官方程序,對非程序員的用戶來說,下載安裝jdk和配置環境變量實在是過於復雜,所以為了方便用戶安裝,你只得把虛擬機一並打包進發布的程序中,這造成程序的體積大大加大了,增加服務器磁盤占用、下載流量、下載時間、用戶磁盤占用——總之是缺點多多。其他語言如python、ruby等桌面程序的開發同理。
在手機開發中,用html5開發的手機應用可以一次開發、兩次打包,分別成為安卓和蘋果的APP,與之前提到的所有問題最大的不同在於,html5的界面程序可以不存放於用戶本地,而存放於遠端的服務器上,這帶來的好處是減少文件大小和方便版本升級,而且web前端的人才實力和數量決定了用web技術做程序界面是個好主意。唯一的問題是,由於殼的存在,這種中轉的方式必然導致程序性能不如原生程序,這個問題是一切殼中程序共有的,甚至.net也無法避免。只是,相對於殼帶來的當然損失,程序員實力問題導致的性能差異是更主要的原因,在不是“只要用殼就一定不行”的情況下,程序員的架構能力和編碼能力才是程序性能好壞的最大決定因素,總結說就是殼中程序的性能輸在了起跑線上,但還有機會治療。
這兩天學習的node-webkit技術,是使用javascript語言編寫桌面程序的技術,容易想到想達成這個目的,必須解決兩個問題,一是javascript在操作系統中的運行環境,二是javascript在操作系統中顯示圖形界面的解決方案。第一個問題的解決者是Node.js,而第二個問題的解決者是webkit,因此這項技術理所當然地命名為了node-webkit。
正如用html5做安卓蘋果應用、用nodejs做服務器端開發一樣,這項技術的出現帶來的好處,一是讓前端程序員有了做windows界面程序的可能性,二是讓前端美工有了做windows界面的可能性。我個人感覺最有趣的一點,由於這個技術棧中沒有任何技術需要編譯,html和css是聲明式語言,而javascript是解釋型語言,這意味着可以隨時在文件夾中點開源碼,改變我的exe程序的內容。
可以把node-webkit提供的文件們看做一個exe程序模板,模板中鏤空的部分即“程序界面和邏輯”需要程序員根據業務來填空,控制流還是在node-webkit手里,它在某些時候看看你的“填空”,說“哦原來你要這樣啊可以”,然后執行下去。這是典型的“框架”的工作,它從你手里搶來了控制權,控制反轉,你淪為編寫局部代碼的凡人。一切殼的職責都是如此,它給了你靈活自由的DIY發揮空間,但你只能在這個空間內施展才華。
你施展才華的方式,就是編寫html文件和javascript代碼。由於nodejs的存在,你除了編寫瀏覽器腳本還能編寫與操作系統和網絡相關的腳本,以及你需要的一切。Node.js在服務端已經無所不能,你的桌面程序也無所不能,服務端能引用的庫,你當然都可以使用。而你在B/S中能實現的前端樣式和布局,由於webkit的存在,也都能在你的桌面程序中大展身手。
====關於原生程序與殼中程序的議論end====
總之:
上面說得有點啰嗦,總之node-webkit提供了足夠的可能性,讓熟練的前端工作者足以開發出自己想要的桌面程序。
上一個個人的練習程序:一個最簡陋的文本編輯器,代碼在這里,使用方法為下載源碼后放到node-webkit的文件夾里,運行nw.exe即可,nw.exe會找到package.json,按照其中的定義展示程序。程序界面如下:
參考資料:
Node.js的API,介紹了官方模塊的用法。
node-webkit的github地址
node-webkit的中文參考資料
Node.js入門書籍:
《Node.js開發指南》
《Node.js實戰》