nw.js node-webkit系列(16)可能会遇到的故障及故障排除

本篇将介绍开发者在使用node-webkit中可能会遇到的故障。

(1)Audio故障

媒体文件在node-webkit开发中应该有用到,常遇到的问题是MP3格式和其他非自由媒体格式的编码器问题。详细请查看:

https://github.com/nwjs/nw.js/wiki/Using-MP3-%26-MP4-%28H.264%29-using-the--video--%26--audio--tags.


(2)WebGL故障

使用WebGL不可缺少来自DirectX 的两个DLL动态链接库,或者你的显卡驱动/程序不能再谷歌核心的黑名单中,详细请参考:

https://github.com/rogerwang/node-webkit/issues/185

有时候CSS不能正确的显示,比如说-webkit-transform:translateZ(-1000px);这可能就是WebGL的故障的原因了。


(3)node-webkit运行故障

node-webkit无法再你的电脑运行,可以参考:

https://github.com/nwjs/nw.js/issues/136

https://github.com/nwjs/nw.js/issues/770


(4)编程陷阱-Console and timers

Node.js 和 Chromium 各自有实现 setTimeout 和 console的方法。通常我们使用的console是由Chromium 实现的。因为可以在浏览器的开发者工具中查看到打印信息。

相对于 setTimeout 方法, WebKi实现的方法是window.setTimeout,Node实现的方法是global.setTimeout。

如果浏览器正在轮询渲染界面,这时建议使用global.setTimeout,因为它的准确度比window.setTimeout要高。


(5)编程陷阱-Transfer objects between window and node

当你在<script>标签使用require方法时,很可能会诱惑你去做一件事情:把所有的JavaScript库都包装进第三模块并使用require方法去调用。大多时候这种做法是没有问题的,但是针对某些例子这却是一个非常错误的方法。

Contexts

首先,我有必要介绍一下context的概念。所有的js变量都存在于js context中,而且所有的js context在<script>中都有一个根变量且能被其调用的。

在浏览器的世界里,你打开的所有窗口都有一个window对象,而且全局变量会存在于你所创建的window中,所以不同窗口的变量并不会冲突。这是因为所有的浏览器窗口都有独立的js context。而window就是调用这些js context的全局根变量。

在Node.js世界里,事情就更加简单了。每一个模块都有自己独立的context(如require(fs)就是其中一个模块),所以模块之间的变量并不会冲突。如果你想要在两个context中传递参数,你必须使用require 和 export ,这是Node.js的系统的基本方法。

与webkit相同,Node.js的context之间也有一个全局根变量如global ,所有模块的context都存在于global的context中。所以像元素global、process 和 console都可以在模块间通用。


Bridge between window and node

为了实现window和node互相调用,node-webkit做的事情,就是在window context创建时,利用node context给window context创建成员变量。如window context中需要调用jQuery,则添加语句

global.$ = $;

require方法是使用node.js的基本方法,如果需要调用某个模块,则使用require(module),这时,node-webkit将会执行node.js调用的的模块代码,并且能够获得该模块代码的window context。

<script src="js/jquery-1.8.0.js"></script>
<h1 id="content">Hello GUI菜单</h1>
<script>
    //在global定义$($就是jQuery),会在hello.js中用到
	global.$ = $;
	global.mm = "mm";<span style="white-space:pre">													</span>            require('./js/hello.js');
	console.log(window.hh);
</script>

window.hh = "hello world!!";
//使用到jQuery
$('#content').text('Modifying DOM elements');<span style="white-space:pre">											</span>    console.log(global.mm);


Operations that require window context

调用require请求的window context中的方法,代码如下:

<script src="js/jquery-1.8.0.js"></script>
<script>
	global.window = window;
	var cache = require('./js/cache');
	console.log(cache);
</script>

// In cache.js
exports.get111 = function (key, callback) {}

(注)如果你想把js编写成一个类库让require直接调用(隐藏地址),如一个node context相对于多个窗口调用,请参照下面节内容:

nw.js node-webkit系列(15)如何使用内部模块和第三方模块进行开发


(6)打开app,窗口内显示找不到文件

有一种情况是,因为app路径带空格或者特殊字符,nw执行程序无法解析app路径以致无法打开app的情况,如Windows XP系统的桌面目录是C:\Documents and Settings\,当app在XP系统的桌面将无法被nw执行程序识别。针对这种情况,我们可以使用隐藏目录,只需要在package.json文件里修改如下即可:

{
	"main": "app://AppName/index.html"
}

(注):AppName可以取任意值,这里但是app://是必须的。


(7)在Windows系统上无法使用WebGL

只要在nw根目录上添加这两个文件即可:D3DCompiler_XX.dll and d3dx9_XX.dll


(8)node.js在nw上如何写服务端脚本

详细信息请查看:https://github.com/nwjs/nw.js/wiki/About-Node.js-server-side-script-in-nw.js


(9)nw的require()方法和RequireJS的require()冲突怎么办?

默认情况下系统使用的是nw的require()方法,针对这个问题,现在的RequireJS已经新增了一个调用名称requirejs,可以用此名称防止与nw的require()方法冲突。

RPGViewer 2.8 功能简介 一、浏览 执行文件菜单中的打开。如果你是第一次查看这个游戏,RPGViewer弹出对话框让你选择游戏的路径,一般选择游戏主程序所在目录即可 之后就可以用浏览菜单或者浏览工具栏查看游戏中的图片了。 如果遇到不支持的图片格式或者读取图片时发生错误,RPGViewer在状态栏显示相关的出错信息。 二、搜索 可以根据文件名查找图片。支持查找的游戏列表详见附录1 搜索支持模糊查找、区分大小写和正则表达式,正则表达式的具体定义参见附录3 三、导出(支持bmp、jpg、png和mng格式,mng格式的说明参见附录2。另外支持导出为三国群英传的SHP格式) RPGViewer提供三种导出功能: 1、当前帧 导出当前显示的图片 2、当前图片 当图片仅有一帧时,和导出“当前帧”相同。否则将导出该图片的所有帧。 3、所有图片 导出所有图片(!注意:如果图片有多帧,那么此功能导出所有帧!) 注:有些导出图片的高度是负的,可能在某些图片浏览器中不能正常显示。建议使用Irfanview或PhotoShop进行查看和编辑 全部导出功能将所有的图片导出到目标文件夹中,文件名依次为1-1.bmp,2-1.bmp... 四、导入(支持bmp、gif、jpg和png格式) 你可以导入bmp或者png(支持透明色和alpha通道)格式的图片(注:“导入”操作只是引入了一个替换的标记,此时并未进行实际的替换) 如果想取消对当前图片的替换可以使用“导入”菜单中的“还原” 全部图像都替换完之后,执行“导入”菜单中的“保存”,所作的替换就生效 五、压缩包操作 可以提取游戏数据包中的所有文件,并支持部分游戏的文件替换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值