HTML5技术

使用JS开发桌面端应用程序NW.js-2-开发问题小记 - 小小沧海

字号+ 作者:H5之家 来源:H5之家 2017-07-12 11:00 我要评论( )

前言 本文为开发nw中遇到的各种问题,仅以记录供备忘以及遇到相同问题的人的一点点解决思路。 1. package.json中的window字段无效 原因:package.json中的window字段,只在main字段为*.html或是外部网址时有效,当为 *.js时是无效的。 关于其他package.json

前言

本文为开发nw中遇到的各种问题,仅以记录供备忘以及遇到相同问题的人的一点点解决思路。

1. package.json中的window字段无效

原因:package.json中的window字段,只在main字段为*.html或是外部网址时有效,当为 *.js时是无效的。

关于其他package.json中的可使用的配置见官网:
https://github.com/nwjs/nw.js/wiki/manifest-format

2. nw-builder一次只能打包一个项目

nw默认不包含打包成.exe文件的形式,遂nw-builder项目为自动将nw应用打包压缩成可执行文件的程序。
详见:https://www.npmjs.com/package/nw-builder

假设nw-builder的配置文件如下:

(['win32'], });

配置字段files指定了app文件夹下的所有文件,但app文件夹下存在两个项目:nw-demo和zfile-explorer

对于这种情况nw-builder只会打包出按文件名排序的第一个文件夹项目:nw-demo

3. 在nw中植入全局变量的方法

前提:需要在nw项目中的package.json中的main字段指定为*.js文件。或是指定本地的.html文件后再载入js文件

package.json文件 ... }

在mian字段指定的js文件中,再使用nw.Window.open来载入指定本地页面或是外部网址,如:

main.js文件: (win) { });

在这个js文件中可以使用4种方法植入全局变量或全局方法:
1、将全局变量使用var方式声明赋值
2、将全局变量直接赋值,无定义
3、将全局变量挂载到window上
4、将全局变量挂载到global上

测试代码:

main.js文件 xxcanghai_2 ..

在用nw动态载入的页面中写入一下代码测试

./view/index.html文件 <script> console.log(xxcanghai_1);//报错 console.log(window.xxcanghai_1);//undefined console.log(global.xxcanghai_1);//1 console.log(xxcanghai_2);//报错 console.log(window.xxcanghai_2);//undefined console.log(global.xxcanghai_2);//10 console.log(xxcanghai_3);//报错 console.log(window.xxcanghai_3);//undefined console.log(global.xxcanghai_3);//100 console.log(xxcanghai_4);//报错 console.log(window.xxcanghai_4);//undefined console.log(global.xxcanghai_4);//1000 </script>

结论:
在动态加载的页面中,访问全局变量只能使用global.*的方式。
之所以会这样是因为nw的运行环境是chromium和Nodejs混合的。所以可以在网页js中执行Nodejs代码。
虽然可以但不应该!
从页面代码的责任一致性上不应该在网页代码中编写nodejs代码,遂应该将global中的对象写入每个网页的window对象中。之后页面代码再从window.*中调用

植入每个页面window中的方法

可利用nw的对package.json扩展字段的inject_js_start和inject_js_end来实现。

官方说明:
inject_js_start: The injecting JavaScript code is to be executed after any files from css, but before any other DOM is constructed or any other script is run.

inject_js_end: The injecting JavaScript code is to be executed after the document object is loaded, before onload event is fired. This is mainly to be used as an option of Window.open() to inject JS in a new window.

inject_js_start字段指向本地的js文件,他可以在加载的任何页面的任何页面js执行前执行。

package.json文件:

在植入的js文件中,将global中的变量赋值到当前页面window中

./js/inject_js_start.js文件: //将node的global中的变量写入每个即将打开的页面的js的window对象中 window["xxcanghai_1"] = global["xxcanghai_1"]

之后即可在任何nw打开的页面中通过window.xxcanghai_1来访问全局变量了。

4. nwjs主进程出现异常后不显示窗体

现象:nwjs主进程出现异常后不显示窗体,不弹出错误提示,也不会自动结束进程
原因:package.json文件中的main字段为.js文件,同时此js文件出现error时会出现此问题。
解决方案:package.json文件中的main字段使用.html文件,然后再载入要执行的nw主程序js文件即可。这样即使报错了也会显示出空窗口,同时也可以通过开发者工具栏查看问题原因,用户也可以关闭应用,不至于无法结束进程。

其他教程文章

使用 NW.js 将 Web 应用打包为桌面应用
https://chensd.com/2016-04/Transfer-web-app-to-desktop-app-with-NW-js.html

NW.js 入坑指南:
https://segmentfault.com/a/1190000003870613

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • HTML5开发,背后的事情你知道吗? - 箜喒

    HTML5开发,背后的事情你知道吗? - 箜喒

    2017-07-12 10:03

  • 在Visual Studio 2017中使用Asp.Net Core构建Angular4应用程序 - SmallProg

    在Visual Studio 2017中使用Asp.Net Core构建Angular4应用程序 - Sma

    2017-07-08 16:01

  • C#开发移动应用系列(4.调用系统应用,以及第三方应用(调用与被调用)) - GuZhenYin

    C#开发移动应用系列(4.调用系统应用,以及第三方应用(调用与被调用))

    2017-07-07 09:01

  • createjs 小游戏开发实战 - beidan

    createjs 小游戏开发实战 - beidan

    2017-07-07 08:00

网友点评
e