當前位置:
首頁 > 知識 > 使用JS開發桌面端應用程序NW.js-2-開發問題小記

使用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中的可使用的配置見官網:

2. nw-builder一次只能打包一個項目

nw默認不包含打包成.exe文件的形式,遂nw-builder項目為自動將nw應用打包壓縮成可執行文件的程序。

假設nw-builder的配置文件如下:

var nw = new NwBuilder({
version: "0.14.7",
files: "./app/**",//nw應用項目目錄
platforms: ["win32"],
});

配置欄位files指定了app文件夾下的所有文件,但app文件夾下存在兩個項目:nw-demo和zfile-explorer

使用JS開發桌面端應用程序NW.js-2-開發問題小記

?

對於這種情況nw-builder只會打包出按文件名排序的第一個文件夾項目:nw-demo

使用JS開發桌面端應用程序NW.js-2-開發問題小記

?


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文件

結論

在動態載入的頁面中,訪問全局變數只能使用global.*的方式。

之所以會這樣是因為nw的運行環境是chromiumNodejs混合的。所以可以在網頁js中執行Nodejs代碼。

雖然可以但不應該!

從頁面代碼的責任一致性上不應該在網頁代碼中編寫nodejs代碼,遂應該將global中的對象寫入每個網頁的window對象中。之後頁面代碼再從window.*中調用

植入每個頁面window中的方法

可利用nw的對package.json擴展欄位的inject_js_startinject_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%20Format/#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文件即可。這樣即使報錯了也會顯示出空窗口,同時也可以通過開發者工具欄查看問題原因,用戶也可以關閉應用,不至於無法結束進程。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 達人科技 的精彩文章:

數據應用達人之SQL基礎教程分享13-存儲過程與事務
Redis持久化機制比對
單例模式,多線程單例,雙重鎖定單例,工廠單例創建上下文
使用Web頁面配置ESP8266的參數

TAG:達人科技 |

您可能感興趣

純前端開發案例:用 SpreadJS 搭建信息系統軟體開發平台
Mapbox發布新SDK幫助開發人員開發AR導航應用程序
SuperSU開發者宣布:將停止開發所有ROOT應用
Vue.js 2.0 漸進開發應用實踐
在「小程序」PWA上開發WebRTC
SpringBoot2快速開發應用系統:開篇
谷歌發布ARCore 1.0,程序員如何開發AR應用?
Wine 3.2開發版發布
Wine 3.1開發版發布
Wine 3.6開發版本發布了 支持PNG格式圖標!
《Superhot VR》開發商:正在開發一款硬核VR體驗
蘋果發布Siri快捷方式測試版,iOS 12開發者提前使用
SpringMVC 開發 — 使用 Swagger 搭建介面請求頁面
Sumerian VR開發工具向公眾開放使用
使用C#開發Android應用之WebApp
GENKI為任天堂Switch主機開發Type-C介面藍牙音頻發射器
Windows漏洞利用開發教程Part 5:返回導向編程
Ghostlight成為NS官方開發商 並稱首款JRPG已在開發中
華為AI開發平台HiKey 970助力開發者打造各種的AI應用
蘋果:將開發AppleWatch錶盤第三方開發介面