使用 NodeJS 框架 NW.js 编写桌面应用入门

前阵子还在琢磨于 Atom Shell 和 Node-Webkit 间如何作个选择。基于 Atom Shell 有点像是站在了 Node-Webkit 的肩膀上的原因,感觉 Atom Shell  会有些优势,所以首先体验了下 使用 NodeJS 框架 Atom Shell 编写桌面应用入门。至于它们实现上是否合并了 Context 对我目前来说还不清楚会有什么影响。

正当我要安下心来的时候,先前那个 Node-Webkit 最近几日来了个华丽变身,以更为简洁明快的名字 NW.js 横空出世,并且与 NodeJS 的另一分支 io.js 更热乎。新的名字似乎有意在含糊它与 Webkit 之间的关系。对于 NW.js 的这一激动人心之举, 难免心起涟漪,顿绝不能只是路过,而况它还是出自国人之手,自豪感总有的。

于是决心一试,略玩之后发现, 特别是开发阶段可显示 toolbar -- 浏览任意 html, 前进/后退/刷新,并能用 Developer Tools 调试 UI 和 JavaScript 的特性。这才令我有些爱不释手,尚不知 Atom Shell 是否有类似的功能。

开始随我体验 NW.js 的 Hello World 程序,这里包含了外部 js 和 css 文件,仍是以 Mac OS X 平台为例,其他平台类似。

1. 前提条件,安装 NW.js

$ npm install nw -g

nw 模块就安装在 /usr/local/lib/node_modules/nw 目录下了,以后可以直接用 nw 命令来测试程序。

/usr/local/lib/node_modules/nw/nwjs/nwjs.app 是一个可用来打包应用的壳,与 Atom Shell 基本一至。

2. 建立文件, 目录

nwjs-app/
 ├── app.js
 ├── index.html
 ├── package.json
 └── style.css

这里是一个简单的应用,实际 js 或 css 文件较多,或用到第三方的 js 或 css,需要更好的组织目录,如 js 文件放在 script 子目录中,把 css 文件放在  style 子目录中。

package.json 内容:

index.html 内容:

要说 Hello World 程序 ,上面两个文件就足够了,这里再加点料,像 Web 开发一样的引入 js 和  css 文件。下面的两个文件,app.js 和 style.css 可以说明它们确实在发挥着光和热。

app.js 内容:

style.css 内容:

3. 运行程序

命令行下进到项目所在的项目,直接执行 nw

nwjs-app $ nw

或者为 nw 指定应用目录,如

$ nw nwjs-app

因为在 package.json 中注释掉了 toolbar: false 默认为 true, 所以界面如下

hello-nw

toolbar 提供了前进,后退,刷新页面,还能修改地址,以及地址栏后的两个开发工具按钮。

上面的显示效果告诉了我们各个部件工作都很正常如预期。点击上面那个齿轮,打开 Developer Tool

nw.js-developer-tool

对于 Web 开发人员,上面那个界面太熟悉了,有了这个再也不用担心界面的调节了,控制台的输出还捕获在这里的 Console,还能断点调试 JavaScript 代码,总之就等于一个 FireBug 摆在了你的面前。

4. 打包应用程序

如果是自己的工具,上面的步骤已经足够了,要是别的机器上安装了 NodeJS 和 NW.js,拷贝工程目录也可以的。

与 Atom Shell 基本是一样的,以 /usr/local/lib/node_modules/nw/nwjs/nwjs.app 为壳 -- 可以在 nwjs.io 上下载,把项目打包成 app.nw 放到前面那个壳的 Contents/Resources 目录中。

操作步骤

1) 拷贝出  nwjs.app 并重命名为 hello-nwjs.app

$ cp -R /usr/local/lib/node_modules/nw/nwjs/nwjs.app ./hello-nwjs.app

2) 打包项目文件到上面的 hello-nwjs.app/Contents/Resources 中

在项目目录下:

nwjs-app$ zip -r ../hello-nwjs.app/Contents/Resources/app.nw *

这时候就可以双击 hello-nwjs.app 来执行了,或者 open hell-nwjs.app 命令打开

nw.js-package

已以把上面 package.json 中的 toolbar 改为 false 了,现在的  hello-nwjs.app 可是个实实在在的桌面应用程序了。

通过修改 hello-nwjs.app 中的配置文件,图标等来进一步定制应用程序。


同样,NodeJS 项目用 Grunt 来管理是再适合不过的,有一个 Grunt 插件 grunt-node-webkit-builder 就是干这个的,只是它还没来得急变成 grunt-nw-builder。

无奈 NW.js 才刚刚昭告天下 node-webkit is renamed NW.js for io.js migration,所以基本能找到的资料都是关于 Node-Webkit 的。

看到 NW.js 对 io.js 的拥抱,有些担心 NodeJS 的分支化的担忧,当然不可能像 Android 那样的碎片化,也许 io.js 不过像是 MySQL 的 MariaDB 分支那样。

参考: 1. 將html檔打包給node-webkit—入門教學
2. 使用node-webkit构建桌面应用程序
3. node-webkit入门:用JS开发跨平台的桌面应用
4. Introduction to HTML5 Desktop Apps With Node-Webkit

本文链接 https://yanbin.blog/nodejs-nw-js-gui-app-hello-world/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

7 Comments
Inline Feedbacks
View all comments
天使之翼
天使之翼
6 years ago

博主您好
本人刚刚为了HTML课件打包而入手NW.js,遇到了如下的困难,希望您能指点您能指点江山:
下面是我的package.json内容,打开的是我的课件的在线网址,现在有个需求:让浏览器在使用中能像普通浏览器一样,按F11可以在全屏和恢复窗口之间进行切换;按esc可以取消全屏!因为对编程不是太懂,定义F11快捷的代码,在网上费了好大劲找到了,但是不知道如何在所有课件页面实现快捷键的功能,难道所有的网页都要引入JS吗?期待您的指教,非常感谢,能加您QQ吗,本人可以付费求助

{
"main": "http://news.baidu.com", //课件网址,这里做例子,用的百度新闻链接
"name": "baidu",
"window": {
"title": "baidu",
"icon": "assest/img/logo.png",
"toolbar": true,
"width": 1366,
"height": 768,
"min_width": 400,
"min_height": 200
},
"webkit": {
"plugin": true,
"java": false,
"page-cache": false
}
}

--------------------------------------------

var gui = require('nw.gui');
var win = gui.Window.get();

var option = {
key: "F11",
active: function () {
win.enterFullscreen();
}
};

// 创建快捷键
var shortcut = new gui.Shortcut(option);

// 注册全局快捷键
gui.App.registerGlobalHotKey(shortcut);

// 解除注册,在应用结束的时候执行
//gui.App.unregisterGlobalHotKey(shortcut);

Yanbin
6 years ago
Reply to  天使之翼

未曾深入去了解,也只是大概知道 NW.js 可用来做什么

lussen
lussen
7 years ago

无法显示toolbar 是什么情况?

trackback

[…] 使用 NodeJS 框架 NW.js 编写桌面应用入门 […]

green
8 years ago

能告诉我一下怎么出的 .app文件的吗?