前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用NW.js构建跨平台桌面应用(3)-利用Node.js

用NW.js构建跨平台桌面应用(3)-利用Node.js

作者头像
江米小枣
发布2020-06-15 14:58:01
2.3K0
发布2020-06-15 14:58:01
举报
文章被收录于专栏:云前端云前端

Node.js常用来构建高并发的C/S应用,将这种模式移植到NW.js程序中虽然可行且费不了什么功夫,但仅仅这样做并不能发挥出平台所有的潜力;要知道NW.js允许直接在DOM中和Node.js交互,而这将大大加快程序的运行和简化开发

使用Node.js模块

  1. 内部模块 var fs = require('fs')
  2. 第三方模块 npm install 之后 var _ = require('underscore')
  3. C/C++ 模块

global对象

NW.js中的global对象除了Node.js中的作用,还能使用DOM,这样就提供了一个 在窗口和Node.js上下文中共享对象 的途径;此外,一旦window对象被创建,所有global对象中的成员也会被自动指定到前者上,这也就是能在DOM中直接require的原因

代码语言:javascript
复制
//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
  • 在global顶端对象中指定了变量后,引用时可以省略global关键字
  • 一些DOM操作不能在Node.js上下文中运行,比如window.openDatabasenw.gui
  • 不要过度利用global对象

process对象

process也是一个在窗口中和Node.js上下文中都可以访问到的全局对象

除了可以访问固有的 process.env.HOME 得到主目录等,还添加了如下属性:

  • process.version['NW.js']
  • process.version['chromium']
  • process.mainModule //获得起始页或起始模块(由配置文件中的main或node-main指定)

window对象

一旦所有初始化工作完成,window对象就被传递到Node.js内部的global对象上,用global.window或简单的用window就可以取得;并且当页面跳转后,window对象才会被更新

代码语言:javascript
复制
//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
  • 如果在index.html中location.href = 'newWindow.html', 则newWindow.html中打印值为Foo;因为此时为页面跳转
  • 如果在index.html中nw.Window.open('newWindow.html'), 则newWindow.html中打印值仍为Hello;除非先 global.window = window

主模块

  • manifest文件(package.json)中,node节点指向一个html页面,作为程序启动后的首个窗口
  • 类似的还有node-main节点,指向一个Node.js模块,在程序的整个生命周期中,一直在后台运行

除了之前看到的 process.mainModule 之外,还可以利用 process.mainModule.exports 在不同的上下文中共享对象:

代码语言:javascript
复制
//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()}秒`);

处理路径

相对路径
代码语言:javascript
复制
require('./modules/myModule');fs.readFileSync('data/myData.json', 'utf8');
绝对路径
  • 可以用 App.dataPath 获得程序的绝对路径
  • 在html中可以引用 window.location.pathname 获得当前页面绝对路径
  • 以及默认限制为只能在Node.js模块中使用的 __dirname,获得当前模块绝对路径
  • 也可封装 __dirname 以供html使用:
代码语言:javascript
复制
//根目录下的util.js
exports.dirname = __dirname;//index.html
var dirname = require('./util').dirname;
跨平台

Windows系统处理路径采用反斜杠(backslash),而其他系统一般使用斜杠(slash),采用Node.js的 path 模块解决:

代码语言:javascript
复制
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 处理:

代码语言:javascript
复制
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);

解决instanceof问题

因为 DOM 和 Node.js 是两个不同的上下文环境,所以也会遇到类似iframe页面和主页面中的js数组由于继承的顶端object不是同一个而不能用 instanceof 互相判断的问题

  • 数组也可以用 Array.isArray 代替解决
  • 或者采用 nwglobal模块,使DOM环境中可以正确判断来自 Node.js 的类型:
代码语言:javascript
复制
//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:

代码语言:javascript
复制
//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

* 原创文章转载请注明出处

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云前端 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用Node.js模块
  • global对象
  • process对象
  • window对象
  • 主模块
  • 处理路径
    • 相对路径
      • 绝对路径
        • 跨平台
        • 解决instanceof问题
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档