NW.js 简介与使用方法


Posted in Javascript onFebruary 01, 2018

简介

NW.js (原名 node-webkit)是一个基于 Chromium 和 node.js 的应用运行时,通过它可以用 HTML 和 JavaScript 编写原生应用程序。它还允许您从 DOM 调用 Node.js 的模块 ,实现了一个用所有 Web 技术来写原生应用程序的新的开发模式。

(1)以网络最流行的技术编写原生应用程序的新方法

(2)基于HTML5, CSS3, JS and WebGL而编写

(3)完全支持nodejs所有api及第三方模块

(4)可以使用DOM直接调用nodejs模块

(5)容易打包和分发

(6)支持运行环境包括32位和64位的Window、Linux和Mac OS 

使用方法如下:

一、下载nw

1.下载 NW.js(官网:http://nwjs.io/

这里面normal这个算是运行时吧,sdk那个是一些工具箱,建议都下下来~

https://nwjs.io/downloads/

2.下载 Enigma Virtual Box(官网:http://enigmaprotector.com/

二、配置 package.json 文件

{
 "name": "nw-demo",
 "version": "0.0.1",
 "main": "index.html"
}

更多的可用如下:

{
 "main": "app/index.html", 
 "name": "WeixinMenuEditor",
 "description": "使用nw.js封装的一个微信公众号菜单编辑器App",
 "version": "0.0.1",
 "keywords": [ "微信", "菜单编辑器" ], 
 "window": {
 "title": "微信菜单编辑器",
 "icon": "app/static/img/weixin_logo.jpg",
 "toolbar": true,
 "frame": true,
 "width": 1008,
 "height": 750,
 "position": "center",
 "min_width": 400,
 "min_height": 200
 },
 "webkit": {
 "plugin": true,
 "java": false,
 "page-cache": false 
 },
 "chromium-args" :"-allow-file-access-from-files"
}
  • title : 字符串,设置默认 title。
  • width/height : 主窗口的大小。
  • toolbar : bool 值。是否显示导航栏。
  • icon : 窗口的 icon。
  • position :字符串。窗口打开时的位置,可以设置为“null”、“center”或者“mouse”。
  • min_width/min_height : 窗口的最小值。
  • max_width/max_height : 窗口显示的最大值。
  • resizable : bool 值。是否允许调整窗口大小。
  • always-on-top : bool 值。窗口置顶。
  • fullscreen : bool 值。是否全屏显示。
  • show_in_taskbar : 是否在任务栏显示图标。
  • frame : bool 值。如果设置为 false,程序将无边框显示。
  • "chromium-args" :"-allow-file-access-from-files" 相当于给谷歌浏览器添加启动参数一样,这行代码允许angularjs直接访问本地json文件。

三、生成exe

项目目录如下:

NW.js 简介与使用方法

将html项目压缩成zip,并改名为nw,输入以下命令

copy /b nw.exe+app.nw firstApp.exe

四、打发包发布

打开 Enigma Virtual Box 程序(enigmavb.exe),界面应该是这样的:

NW.js 简介与使用方法

然后在 Enter Input File Name 处选择上一步生成的 test.exe 文件,Enter Output Name 可以默认;

之后再点击下面的 Add 按钮,将 nwjs 文件夹(名称不一定是 nwjs ,就是最开始第一步 NW.js 环境的那个文件夹)下除 nw.exe 和 test.nw 以及 test.exe 之外的所有文件加载上,然后点击 Process ,等待执行成功即可,这时候会在相应的路径下生成一个新的 .exe 文件(我们暂且叫做 newtest.exe),此时的 newtest.exe 文件即可在任意的 Windows 环境下运行了,你可以拷贝给你的小伙伴去 Show 一下。

下面是nw使用过程中的一些坑

1.如果只希望当前应用获取焦点才执行快捷键,看看这个库用js设置快捷键

// 加载本地ui库
 var gui = require('nw.gui');
 var option = {
 key: "Ctrl+R",
 active: function () {
  alert("全局快捷键" + this.key + "按下");
 },
 failed: function (msg) {
  //创建快捷键失败
  alert(msg);
 }
 };
 // 创建快捷键
 var shortcut = new gui.Shortcut(option);
 // 注册全局快捷键
 gui.App.registerGlobalHotKey(shortcut);
 // 解除注册,在应用结束的时候执行
 gui.App.unregisterGlobalHotKey(shortcut);

2.nw.js不能对页面多次刷新,各种不正常,这是由于刷新页面后重新加载js文件对变量重新赋值引起的bug。 解决方案

nw.js 读取和保存文件

<html>
<head>
 <meta charset="utf-8"/>
 <title>nw.js实现文件读写</title>
</head>
<body>
 <input id="readFile" type="file" >读取文件</input>
 <!-- 默认文件名为filename.html -->
 <input id="writeFile" nwsaveas="filename.html" type="file">保存文件</input>
 <p></p>
 <script>
 //nw.js提供的读写文件模块
 var fs = require("fs");
 //读文件
 var chooser = document.querySelector('#readFile');
 chooser.addEventListener("change", function (evt) {
  //用户选择的文件
  var filePath = this.value.toString();
  document.querySelector("p").innerHTML = "读取文件从" + filePath;
  fs.readFile(filePath, function (err, data) {
   if (err) {
   layer.msg("读取文件失败! :" + err.message);
   return;
   } else {
   console.log(data);
   alert(data);
   }
  })
  });
 //写文件
 chooser = document.querySelector('#writeFile');
 chooser.addEventListener("change", function (evt) {
  //用户选择的文件
  var filePath = this.value.toString();
  document.querySelector("p").innerHTML = "写入文件到:" + filePath;
  //把hello写入文件
  fs.writeFile(filePath, "Hello!\n", function (err) {
   if (err) {
   alert("保存失败!");
   }
  }); 
  });
 </script>
</body>
</html>

3.使用nwjs的'fs'直接保存cancas为本地图片,在网上找到的方法都是弹出选择框保存,但我需要直接保存图片到指定路径,不能弹出对话框让用户选择。kailniris给了一个解决方案,可行,代码如下:

var fs = require('fs');
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.moveTo(0, 0);
ctx.lineTo(200, 100);
ctx.stroke();
 <canvas id="myCanvas" width="200" height="100" style="border:1px solid #000000;">
 </canvas>
base64Data = c.toDataURL("image/png").replace(/^data:image\/png;base64,/, "")
fs.writeFile("c:/Dev/test.png", base64Data, 'base64', function (err) {
 if (err) {
 console.log("err", err);
 } else {
 return res.json({ 'status': 'success' });
 }
});

用html2canvas把html页面转换为图片,再把图片保存到本地。贴一下代码(需要导入html2canvas.js和jquery):

//要保存图片的文件路径
  var filePath = templateDir + filename + '.html';
  //要保存的html页面
  var editerDocument = window.editor.edit.iframe.get().contentWindow.document;
  html2canvas(editerDocument.body, {
  onrendered: function (canvas) {
   var base64Data = canvas.toDataURL("image/png").replace(/^data:image\/png;base64,/, "")
   var fs = require("fs");
   fs.writeFile(templateDir + filename + '.png', base64Data, 'base64', function (err) {
   if (err) {
    alert("保存模板失败!");
   }
   $('#model_template_name').modal("hide");
   layer.msg("模板已保存为" + filename);
   });
  }
  });

4.在app.js里引用Node内置模块

//调用NodeJs内置模块
 $scope.fs = require('fs'); 
 
//读取配置文件
 $scope.readConfig = function () {
  try {
  var configStr = $scope.fs.readFileSync(config.weixin.path, 'utf8');
  console.log(configStr);
  var obj = eval('(' + configStr + ')');
  $scope.weixin.appid = obj.appid;
  $scope.weixin.appsecret = obj.appsecret;
  $scope.weixin.qrcodeurl = obj.qrcodeurl;
  }
  catch (e) {
  console.log(e);
  alert("读取微信配置文件失败");
  }
 }
 //写入配置文件
 $scope.writeConfig = function () {
  try {
  var configStr = JSON.stringify($scope.weixin);
  $scope.fs.writeFileSync(config.weixin.path, configStr, {encoding: 'utf8'});
  return true;
  }
  catch (e) {
  console.log(e);
  alert("写入微信配置文件失败");
  return false;
  }
 }

5.引用第三方模块wechat-api

//调用NodeJs第三方模块
 $scope.wechatApi = require('wechat-api');
 $scope.query = function () {
  var api = new $scope.wechatApi($scope.weixin.appid, $scope.weixin.appsecret);
  api.getMenu(function (err, result) {
  if (err) {
   console.log(err);
   alert("查询菜单异常");
  } else {
   load(result);
   $scope.$apply();//需要手动刷新
  }
  });
 };

 更多详细的可以参考 http://liuxp.me/nwjs/References/Window/ 中文文档

总结

以上所述是小编给大家介绍的NW.js 简介与使用方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js通过location.search来获取页面传来的参数
Sep 11 Javascript
node.js中的querystring.stringify方法使用说明
Dec 10 Javascript
网页从弹窗页面单选框传值至父页面代码分享
Sep 29 Javascript
JS组件Bootstrap Table表格行拖拽效果实现代码
Aug 27 Javascript
jQuery ajax读取本地json文件的实例
Oct 31 jQuery
JS实现二维数组横纵列转置的方法
Apr 17 Javascript
Vue 重置组件到初始状态的方法示例
Oct 10 Javascript
vue模仿网易云音乐的单页面应用
Apr 24 Javascript
微信小程序缓存过期时间的使用详情
May 12 Javascript
微信小程序实现搜索功能并跳转搜索结果页面
May 18 Javascript
JS动态显示倒计时效果
Dec 12 Javascript
JS 4个超级实用的小技巧 提升开发效率
Oct 05 Javascript
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
Feb 01 #Javascript
Vue组件之自定义事件的功能图解
Feb 01 #Javascript
微信小程序三级联动选择器使用方法
May 19 #Javascript
jquery应用实例分享_实现手风琴特效
Feb 01 #jQuery
使用JS模拟锚点跳转的实例
Feb 01 #Javascript
微信小程序实现图片预览功能
Jan 31 #Javascript
vue单页应用加百度统计代码(亲测有效)
Jan 31 #Javascript
You might like
php你的验证码安全码?
2007/01/02 PHP
PHP设计模式之工厂模式定义与用法详解
2018/04/03 PHP
PHP获取远程http或ftp文件的md5值的方法
2019/04/15 PHP
用js查找法实现当前栏目的高亮显示的代码
2007/11/24 Javascript
JS Loading功能的简单实现
2013/11/29 Javascript
JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
2015/02/03 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
关于微信中a链接无法跳转问题
2016/08/02 Javascript
JS实现密码框的显示密码和隐藏密码功能示例
2016/12/26 Javascript
微信小程序 按钮滑动的实现方法
2017/09/27 Javascript
基于vue2.0动态组件及render详解
2018/03/17 Javascript
JavaScript函数节流和函数去抖知识点学习
2018/07/31 Javascript
通过npm或yarn自动生成vue组件的方法示例
2019/02/12 Javascript
怎么使用javascript深度拷贝一个数组
2019/06/06 Javascript
细述Javascript的加法运算符的具体使用
2019/10/18 Javascript
vuex刷新后数据丢失的解决方法
2020/10/18 Javascript
[47:21]Liquid vs TNC Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
python中global与nonlocal比较
2014/11/21 Python
Python实现的批量下载RFC文档
2015/03/10 Python
简单掌握Python的Collections模块中counter结构的用法
2016/07/07 Python
Django中利用filter与simple_tag为前端自定义函数的实现方法
2017/06/15 Python
python 计算数组中每个数字出现多少次--“Bucket”桶的思想
2017/12/19 Python
Python基于最小二乘法实现曲线拟合示例
2018/06/14 Python
Python自动登录QQ的实现示例
2020/08/28 Python
美国性感内衣店:Yandy
2018/06/12 全球购物
xml有哪些解析技术?区别是什么
2016/04/26 面试题
生产部统计员岗位职责
2014/01/05 职场文书
临床医师专业个人自我评价
2014/01/08 职场文书
《威尼斯的小艇》教学反思
2014/02/17 职场文书
社会发展项目建议书
2014/08/25 职场文书
祖国在我心中演讲稿(小学生)
2014/09/23 职场文书
2015年保洁员工作总结
2015/05/04 职场文书
幼儿园六一儿童节开幕词
2016/03/04 职场文书
启迪人心的励志语录:脾气永远不要大于本事
2020/01/02 职场文书
python模块与C和C++动态库相互调用实现过程示例
2021/11/02 Python
WebRTC记录音视频流(web技术分享)
2022/02/24 Javascript