使用JS开发桌面端应用程序NW.js-2-开发问题小记
前言
本文为开发nw中遇到的各种问题,仅以记录供备忘以及遇到相同问题的人的一点点解决思路。
1. package.json中的window字段无效
原因:package.json中的window字段,只在main字段为*.html或是外部网址时有效,当为 *.js时是无效的。
{
"name": "blog",
"main": "http://xxcanghai.cnblogs.com/",//main为网址,下方的window设定有效
//"main": "index.html",//main为 *.html,下方的window设定有效
//"main": "index.js",//main为 *.js,下方的window设定无效!!
"version": "0.0.1",
"window": {
"title": "Nw.js Demo",//如果 index.html没有title,则会显示这里的值
"icon": "assest/img/logo.png",//标题栏图标
"position": "center",//默认显示位置
"width": 1280,
"height": 680,
"frame": true,//是否显示最外层的框架,设为false之后 窗口的最小化、最大化、关闭 就没有了
"resizable": true,
"min_width": 1028
},
}
关于其他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的配置文件如下:
var nw = new NwBuilder({
version: '0.14.7',
files: './app/**',//nw应用项目目录
platforms: ['win32'],
});
配置字段files指定了app文件夹下的所有文件,但app文件夹下存在两个项目:nw-demo和zfile-explorer

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

3. 在nw中植入全局变量的方法
前提:需要在nw项目中的package.json中的main字段指定为*.js文件。或是指定本地的.html文件后再载入js文件
package.json文件
{
"name": "nw-demo",
"version": "1.0.0",
"description": "",
"main": "./main.js",
"scripts": {
"start":"cd ../../ & gulp nw"
},
...
}
在mian字段指定的js文件中,再使用nw.Window.open来载入指定本地页面或是外部网址,如:
main.js文件:
nw.Window.open('./view/index.html', {
height:600,
width:800
}, function (win) { });
在这个js文件中可以使用4种方法植入全局变量或全局方法:
1、将全局变量使用var方式声明赋值
2、将全局变量直接赋值,无定义
3、将全局变量挂载到window上
4、将全局变量挂载到global上
测试代码:
main.js文件
//var定义方式
var xxcanghai_1 = 1;
//直接赋值方式
xxcanghai_2 = 10;
//挂载到window对象上
window.xxcanghai_3 = 100;
//挂载到global对象上
global.xxcanghai_4 = 1000;
在用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.
http://docs.nwjs.io/en/latest/References/Manifest Format/#inject_js_start
inject_js_start字段指向本地的js文件,他可以在加载的任何页面的任何页面js执行前执行。
package.json文件:
{
"name": "blog",
"version": "1.0.0",
"main": "./main.html",
"inject_js_start": "./js/inject_js_start.js",//设置所有页面前植入的js文件地址
"author": "xxcanghai@gmail.com",
"license": "ISC",
}
在植入的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
使用JS开发桌面端应用程序NW.js-2-开发问题小记的更多相关文章
- 使用JS开发桌面端应用程序NW.js-1-Menu菜单的使用小记
前言 本文主要内容为nw.js官方文档中没有提到,而在实际入手开发过程中才碰到的问题以及经验的汇总. 详情请查看官方文档:http://docs.nwjs.io/en/latest/Reference ...
- 使用JS开发桌面端应用程序NW.js-3-开发问题小记
前言 因为我们的项目是2C的,而XP系统是最大的用户量占比,所以只能使用nw开发而不能用Electron,本文谨记开发nw过程中遇到的各种问题以及解决方案. nw.Window.open打开新窗口不能 ...
- arcpy+PyQt+py2exe快速开发桌面端ArcGIS应用程序
前段时间有一个项目,大体是要做一个GIS数据处理工具. 一般的方法是基于ArcObjects来进行开发,因为我对ArcObjects不太熟悉,所以就思考有没有其他简单快速的方法来做. 在查看ArcGI ...
- 基于Vue.js PC桌面端弹出框组件|vue自定义弹层组件|vue模态框
vue.js构建的轻量级PC网页端交互式弹层组件VLayer. 前段时间有分享过一个vue移动端弹窗组件,今天给大家分享一个最近开发的vue pc端弹出层组件. VLayer 一款集Alert.Dia ...
- 使用Java开发桌面即时通讯程序遇到的问题
项目:https://www.lking.top/?p=87 1. JPanel面板绘制背景图片问题. 参考大佬:https://www.jb51.net/article/101516.htm 本项目 ...
- js手机移动端选择插件 mobileSelect.js
一.mobileSelect获取方法 mobileSelect支持单选.多级联动.自定义回调函数.二次渲染.最新版本下载地址[2017-09-21更新]: https://github.com/onl ...
- nw.js桌面软件开发系列 第0.1节 HTML5和桌面软件开发的碰撞
第0.1节 HTML5和桌面软件开发的碰撞 当我们谈论桌面软件开发技术的时候,你会想到什么?如果不对技术本身进行更为深入的探讨,在我的世界里,有这么多技术概念可以被罗列出来(请原谅我本质上是一个Win ...
- 关于Nodejs开发桌面应用。NW.js 和 Electron 优缺点分析对比
从开发角度来说,选择用 nw.js 还是 election ,区别其实不是很大.大部分工作还是在自己的 javascript 和 HTML 上.国内比较有名的,比如微信web开发工具.钉钉都是基于 n ...
- NW.js将网站打包成桌面应用
需求:已有一个网站,因为浏览器兼容性等问题,想自己封装一个浏览器,打开时固定打开这个网站,通过这样的封装,将网站变成桌面应用程序. 1. 下载并安装NW.js的最新稳定版本(NW.js) 2. 创建一 ...
随机推荐
- 使用VideoView开发视频总结
一.VideoView及其相关组件总结 在Android中,播放视频有2种方式,第一种方式是使用MediaPlayer结合SurfaceView来播放,通过MediaPlayer来控制视频的播放.暂停 ...
- 在ie下,a标签包被img的时候,为什么有个蓝色的边线
效果像下图这样 那是由于<img>在ie下有默认边框,只要清除边框就可以了,在style中定义 img{ border:none } 显示效果就变成下面这样了 完!
- 9.并发包非阻塞队列ConcurrentLinkedQueue
jdk1.7.0_79 队列是一种非常常用的数据结构,一进一出,先进先出. 在Java并发包中提供了两种类型的队列,非阻塞队列与阻塞队列,当然它们都是线程安全的,无需担心在多线程并发环境所带来的不可 ...
- SpringMVC 整合Jackson报错
最近用spring4.x整合Jackson,结果莫名其妙的一直报错,网上收索的结果都是在maven或者gradle的环境下配置依赖条件解决的:但是eclipseIDE环境下的jar包应该是会自动依赖影 ...
- 提高java编程质量 - (五)switch语句break不能忘以及default不同位置的用法
先看一段代码: public class Test{ public static void main(String[] args){ System.)); } } public static Stri ...
- 常见浏览器的宽高代码写法!有原生JavaScript和jquery两种写法-------------------------------以及我的个人网站
我的个人网站 点击链接!欢迎大家访问 下面是网页一些常见的宽高的获取.........这是原生的写法(JavaScript) 网页可见区域宽: document.body.clientWidth 网页 ...
- WPF MVVM 架构 Step By Step(3)(把后台代码移到一个类中)
我觉得大部分开发者应该已经知道怎么去解决这个问题.一般都是把后台代码(GLUE code)移动到一个类库.这个类库用来代表UI的属性和行为.任何代码当被移到一个类库中时都可以被编译成一个DLL,然后可 ...
- RSA加密通信小结(三)--生成加解密所需的SSL命令与流程
在iOS中使用RSA加密解密,需要用到.der和.p12后缀格式的文件,其中.der格式的文件存放的是公钥(Public key)用于加密,.p12格式的文件存放的是私钥(Private key)用于 ...
- V9发布内容时保留框架<iframe></iframe>
有些时候,发布文章内容的时候需要用到<iframe></iframe>框架站外内容最近在发布内容时就遇到这个问题,<iframe></iframe>给转 ...
- python核心数据结构之字典
 [TOC ...