使用node-webkit开发exe窗口程序
====关于原生程序与壳中程序的议论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实战》
使用node-webkit开发exe窗口程序的更多相关文章
- uni-app开发的应用(小程序,app,web等),使用Node+Koa2开发的后端程序接收上传文件的方法
uni-app使用使用Node+Koa2开发的后端程序接收上传的文件 通过gitbook浏览此随笔 通过其它客户端上传(h5,小程序等),接收方法一致 使用koa接收时,我们需安装一个中间件koa-b ...
- Node webkit启动最大化窗口
<!DOCTYPE html> <html> <head> </head> <body> <p style=" ...
- Win32 程序开发:窗口类结构体 WNDCLASS 和 WNDCLASSEX
一.窗口类结构体简介 窗口类结构体包含了窗口的各种参数信息.比如:窗口的图标.菜单栏.背景颜色.窗口的消息处理等等. 窗口类结构体有两个:WNDCLASS(早期版本) 和 WNDCLASSEX(新版本 ...
- heX——基于 HTML5 和 Node.JS 开发桌面应用
heX 是网易有道团队的一个开源项目,允许你采用前端技术(HTML,CSS,JavaScript)开发桌面应用软件的跨平台解决方案.heX 是你开发桌面应用的一种新的选择,意在解决传统桌面应用开发中繁 ...
- heX:用HTML5和Node.JS开发桌面应用
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- (转)heX——基于 HTML5 和 Node.JS 开发桌面应用
本文转载自:http://techblog.youdao.com/?p=685 简介:heX,一个允许你采用前端技术(HTML,CSS,JavaScript)开发桌面应用软件的跨平台解决方案.是你开发 ...
- electron之Windows下使用 html js css 开发桌面应用程序
1.atom/electron github: https://github.com/atom/electron 中文文档: https://github.com/atom/electron/tree ...
- Electron开发跨平台桌面程序入门教程
最近一直在学习 Electron 开发桌面应用程序,在尝试了 java swing 和 FXjava 后,感叹还是 Electron 开发桌面应用上手最快.我会在这一篇文章中实现一个HelloWord ...
- 【转】使用NetBeans和Eclipse开发PHP应用程序
[51CTO独家特稿]各位用户如果单独看NetBeans和Eclipse的市场占有率,你可能会认为使用其中任何一种IDE开发PHP应用程序都没有 问题,例如: 1.NetBeans:一款开源的集成开发 ...
随机推荐
- php回调函数
1.array_filter($arr, "odd") <?php $arr = array(1, 2, 3, 4, 5, 6, 7, 8, 9); function odd ...
- malloc函数和其他内存分配函数
1. 需要包含头文件:#i nclude 或 #i nclude 函数声明(函数原型): void *malloc(int size); 说明:malloc 向系统申请分配指定size个字节的内存空间 ...
- MySQL: 详细的sql语句
1添 1.1[插入单行] insert [into] <表名> (列名) values (列值)例:insert into Strdents (姓名,性别,出生日期) values ('开 ...
- keepalived对nginx高可用演练脚本
keepalived对nginx高可用演练脚本 参考文章:http://deidara.blog.51cto.com/400447/302402/ .安装nginx.keepalived.epel-r ...
- 给你完美浪漫的七夕,APICloud送你双人电影票!
我一直觉得“幸福的感觉” 就像存款 留着以后用 会幸福感爆棚 于是,我一直习惯于等等,再等等 以为那样就会很幸福 直到有一天,突然发现,在我构想的未来中,总是有你 世界那么大,我只在乎你 世界那么长, ...
- .net平台下深拷贝和浅拷贝
在.net类库中,对象克隆广泛存在于各种类型的实现中,凡是实现了ICloneable接口的类型都具备克隆其对象实例的能力.所以本文讲述的深拷贝和浅拷贝也是在实现ICloneable接口的基础上进行的. ...
- 快速理解Docker - 容器级虚拟化解决方案
是什么 简单的说Docker是一个构建在LXC之上的,基于进程容器(Processcontainer)的轻量级VM解决方案 拿现实世界中货物的运输作类比, 为了解决各种型号规格尺寸的货物在各种运输工具 ...
- frame与bounds的区别
原来你M,frame.size和bounds.size不总是一样的 在UIViewController的- (void)willAnimateRotationToInterfaceOrientatio ...
- lua序列化(支持循环引用)
lua序列化 支持key类型为string, number 支持value类型为string, number, table, boolean 支持循环引用 支持加密序列化 支持loadstring反序 ...
- canvas学习之制作动画
html部分 ...... <body> <canvas id="myCanvas" width="400" height="400 ...