首发:个人博客,更新&纠错&回复

====关于原生程序与壳中程序的议论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实战》

长期欢迎项目合作机会介绍,项目收入10%用于酬谢介绍人。新浪微博:@冷镜,QQ:908789432

使用node-webkit开发exe窗口程序的更多相关文章

  1. uni-app开发的应用(小程序,app,web等),使用Node+Koa2开发的后端程序接收上传文件的方法

    uni-app使用使用Node+Koa2开发的后端程序接收上传的文件 通过gitbook浏览此随笔 通过其它客户端上传(h5,小程序等),接收方法一致 使用koa接收时,我们需安装一个中间件koa-b ...

  2. Node webkit启动最大化窗口

    <!DOCTYPE html> <html> <head>     </head> <body>     <p style=" ...

  3. Win32 程序开发:窗口类结构体 WNDCLASS 和 WNDCLASSEX

    一.窗口类结构体简介 窗口类结构体包含了窗口的各种参数信息.比如:窗口的图标.菜单栏.背景颜色.窗口的消息处理等等. 窗口类结构体有两个:WNDCLASS(早期版本) 和 WNDCLASSEX(新版本 ...

  4. heX——基于 HTML5 和 Node.JS 开发桌面应用

    heX 是网易有道团队的一个开源项目,允许你采用前端技术(HTML,CSS,JavaScript)开发桌面应用软件的跨平台解决方案.heX 是你开发桌面应用的一种新的选择,意在解决传统桌面应用开发中繁 ...

  5. heX:用HTML5和Node.JS开发桌面应用

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  6. (转)heX——基于 HTML5 和 Node.JS 开发桌面应用

    本文转载自:http://techblog.youdao.com/?p=685 简介:heX,一个允许你采用前端技术(HTML,CSS,JavaScript)开发桌面应用软件的跨平台解决方案.是你开发 ...

  7. electron之Windows下使用 html js css 开发桌面应用程序

    1.atom/electron github: https://github.com/atom/electron 中文文档: https://github.com/atom/electron/tree ...

  8. Electron开发跨平台桌面程序入门教程

    最近一直在学习 Electron 开发桌面应用程序,在尝试了 java swing 和 FXjava 后,感叹还是 Electron 开发桌面应用上手最快.我会在这一篇文章中实现一个HelloWord ...

  9. 【转】使用NetBeans和Eclipse开发PHP应用程序

    [51CTO独家特稿]各位用户如果单独看NetBeans和Eclipse的市场占有率,你可能会认为使用其中任何一种IDE开发PHP应用程序都没有 问题,例如: 1.NetBeans:一款开源的集成开发 ...

随机推荐

  1. Selenium2学习-033-WebUI自动化实战实例-031-页面快照截图应用之二 -- 区域截图

    我在之前的文章中曾给出浏览器显示区域截图的方法,具体请参阅 .或许,有些小主已经想到了,每次都获取整个显示区域的截图存储,那么经过一段时间后,所使用的图片服务器的容量将会受到极大的挑战,尤其是在产品需 ...

  2. Selenium2学习-019-WebUI自动化实战实例-017-获取浏览器类型

    Web UI 自动化脚本分布执行过程中有时候需要获取浏览器的相关信息,此文给出了一个简略获取浏览器类型的方法,敬请各位小主们参阅.若有不足之处,敬请大神指正,不胜感激! 闲话少述,上码. /** * ...

  3. 由单例模式学到:lock锁

    lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁. lock (xxx) { // Critical code section. } lock 关键字可确保当一 ...

  4. jenkins邮件模板

    步骤 1.在jenkins主目录中新建一个模板文件夹 命名为:email-templates 3.把模板代码放入到模板文件夹  with_results.groovy 4.设置邮件发送模板配置 5.配 ...

  5. Android ExpandableListView的下拉刷新实现

    该控件的修改时根据PullToRefreshList的机制修改 下面是对ExpandableListView的扩展 package com.up91.gwy.view.componet; import ...

  6. winston日志管理3

    Further Reading 延伸阅读 Events and Callbacks in Winston winston的事件和回调 Each instance of winston.Logger i ...

  7. android关于The connection to adb is down, and a severe error has occured.这个问题的解决办法

    有时在打开模拟器的时候会出现The connection to adb is down, and a severe error has occured.这个问题,这个问题的解决办法有两个: 方法一:找 ...

  8. Java数据库连接——JDBC调用存储过程,事务管理和高级应用

    一.JDBC常用的API深入详解及存储过程的调用 相关链接:Jdbc调用存储过程 1.存储过程(Stored Procedure)的介绍 我们常用的操作数据库语言SQL语句在执行的时候需要先编译,然后 ...

  9. MongoDB是?

    MongoDB是? MongoDB是一个基于分布式文件存储的数据库 由C++编写 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当 ...

  10. Go prepare statment超过mysql最大数

    mysql_stmt_prepare failed! error(1461)Can't create more than max_prepared_stmt_count statements (cur ...