Node.js常用来构建高并发的C/S应用,将这种模式移植到NW.js程序中虽然可行且费不了什么功夫,但仅仅这样做并不能发挥出平台所有的潜力;要知道NW.js允许直接在DOM中和Node.js交互,而这将大大加快程序的运行和简化开发
var fs = require('fs')
npm install
之后 var _ = require('underscore')
NW.js中的global对象除了Node.js中的作用,还能使用DOM,这样就提供了一个 在窗口和Node.js上下文中共享对象 的途径;此外,一旦window对象被创建,所有global对象中的成员也会被自动指定到前者上,这也就是能在DOM中直接require的原因
//index.html
nw.Window.open('newWindow.html');
global.shareObj = {
myData: 'foo'
};//module.js
console.log(shareObj.myData); //foo//newWindow.html
console.log(global.shareObj.myData); //foo
window.openDatabase
和nw.gui
process也是一个在窗口中和Node.js上下文中都可以访问到的全局对象
除了可以访问固有的 process.env.HOME
得到主目录等,还添加了如下属性:
一旦所有初始化工作完成,window对象就被传递到Node.js内部的global对象上,用global.window或简单的用window就可以取得;并且当页面跳转后,window对象才会被更新
//nodeModule.js
exports.checkWindowVar = function() {
console.log(window.myVar); //注意此处window的指向
}//newWindow.html
var myVar = 'Foo';
var mod = require('./nodeModule.js');
mod.checkWindowVars(); //这里会在控制台打印出变量值//index.html
var myVar = 'Hello';
var mod = require('./nodeModule.js');
mod.checkWindowVars(); //Hello
location.href = 'newWindow.html'
,
则newWindow.html中打印值为Foo;因为此时为页面跳转nw.Window.open('newWindow.html')
,
则newWindow.html中打印值仍为Hello;除非先 global.window = window
除了之前看到的 process.mainModule 之外,还可以利用 process.mainModule.exports 在不同的上下文中共享对象:
//package.json
{
"name": "time-test",
"main": "index.html",
"node-main":"nodemain.js"
}//nodemain.js
var secondes = 0;
setInterval(function() {
seconds++;
}, 1000);
exports.secondsSinceStart = function() {
return seconds;
}//index.html
var seconds = process.mainModule.exports.secondsSinceStart();
$('#time').text(`系统启动了${seconds()}秒`);
require('./modules/myModule');fs.readFileSync('data/myData.json', 'utf8');
//根目录下的util.js
exports.dirname = __dirname;//index.html
var dirname = require('./util').dirname;
Windows系统处理路径采用反斜杠(backslash),而其他系统一般使用斜杠(slash),采用Node.js的 path 模块解决:
var path = require('path');
var dirname = require('./util').dirname;console.log( path.normalize('/my/folder') ); //Mac输出'/my/folder',Win输出'\\my\\folder'console.log( path.join(dirname, 'data/my.json') ); //Mac输出'/xxx/myApp/data/my.json',Win输出'c:\\xx\\myApp\\data\\my.json'
针对某些特殊路径,比如桌面,可以利用 process 处理:
var path = require('path');
var desktopPath;
switch (process.platform) {
case 'darwin':
case 'linux':
desktopPath = path.join(process.env.HOME, 'Desktop');
break;
case 'win32':
case 'win64':
desktopPath = path.join(process.env.USERPROFILE, 'Desktop');
break;
default:
throw '不支持的系统';
break;
}
console.log(desktopPath);
因为 DOM 和 Node.js 是两个不同的上下文环境,所以也会遇到类似iframe页面和主页面中的js数组由于继承的顶端object不是同一个而不能用 instanceof 互相判断的问题
//nodeContext.js
exports.myArr = [1, 2, 3];//index.html
var nodeContext = require('./nodeContext');
var windowContext = {myArr: [1, 2, 3]};
console.log(windowContext.myArr instanceof Array); //true
console.log(nodeContext.myArr instanceof Array); //truevar nwglobal = require('nwglobal');
console.log(nodeContext.myArr instanceof nwglobal.Array); //true
同样可以从html中创建对象传递给Node.js:
//nodeContext.js
exports.checkArr = arr=>arr instanceof Array;//index.html
var nodeContext = require('./nodeContext');
var nwglobal = require('nwglobal');
var windowArr = [1, 2, 3];
console.log( nodeContext.checkArr(windowArr) ); //false
var nodeArr = nwglobal.Array(1, 2, 3);
console.log( nodeContext.checkArr(nodeArr) ); //true
* 原创文章转载请注明出处