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

来源:http://www.cnblogs.com/xxcanghai/archive/2017/07/11/7152686.html
-Advertisement-
Play Games

# 前言本文為開發nw中遇到的各種問題,僅以記錄供備忘以及遇到相同問題的人的一點點解決思路。# 1. package.json中的window欄位無效**原因**:`package.json`中的`window`欄位,只在`main`欄位為`*.html`或是外部網址時有效,當為 `*.js`時是無... ...


前言

本文為開發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中的可使用的配置見官網:
https://github.com/nwjs/nw.js/wiki/manifest-format

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

nw預設不包含打包成.exe文件的形式,遂nw-builder項目為自動將nw應用打包壓縮成可執行文件的程式。
詳見:https://www.npmjs.com/package/nw-builder

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

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

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

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

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

<script>
   console.log(xxcanghai_1);//報錯
   console.log(window.xxcanghai_1);//undefined
   console.log(global.xxcanghai_1);//1

   console.log(xxcanghai_2);//報錯
   console.log(window.xxcanghai_2);//undefined
   console.log(global.xxcanghai_2);//10

   console.log(xxcanghai_3);//報錯
   console.log(window.xxcanghai_3);//undefined
   console.log(global.xxcanghai_3);//100

   console.log(xxcanghai_4);//報錯
   console.log(window.xxcanghai_4);//undefined
   console.log(global.xxcanghai_4);//1000
</script>

結論
在動態載入的頁面中,訪問全局變數只能使用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": "[email protected]",
  "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文件即可。這樣即使報錯了也會顯示出空視窗,同時也可以通過開發者工具欄查看問題原因,用戶也可以關閉應用,不至於無法結束進程。

其他教程文章

使用 NW.js 將 Web 應用打包為桌面應用
https://chensd.com/2016-04/Transfer-web-app-to-desktop-app-with-NW-js.html

NW.js 入坑指南:
https://segmentfault.com/a/1190000003870613


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 當我們不會寫後端介面來測試ajax時,我們可以使用node環境來模擬一個後端介面。 1、模擬後端介面可參考http://www.cnblogs.com/heyujun-/p/6793900.html網站整站開發小例子,在打開命令視窗並轉到所在項目文件夾下在命令行中輸入npm install expr ...
  • 現在我們來看一下vue中的數據監聽事件$watch, js代碼: html代碼: 這就是數組的監聽,對於json我們也是一樣的,但是我們得給他一個深度監聽,$watch的第三個參數{deep:true}。 angular 中的數據交互有$http,同樣對於vue我們也是有數據交互的,有post,ge ...
  • 把info類下麵所有的a標簽鏈接後天加"#article"。 jQuery(document).ready(function($){ $('.info a').each(function(){ let Ahref = $(this).attr("href") + "#article"; $(this ...
  • 我在寫代碼時候經常會在tpl的<script>里寫類似的代碼: 剛開始的時候只知道寫了它不需要調用,直接執行,就這樣依葫蘆畫瓢,我寫了很多代碼。說道這,還要說說這貨的載入順序,如果把代碼直接寫到script標簽里,當頁面載入完這個script標簽就會執行裡邊的代碼了。如果在這代碼里用到了未載入的do ...
  • 我們現在來學習一下vue中一些簡單的小東西: 首先我們必須要引入vue.js文件哦! 1.有關文本框里的checkbox js代碼: html代碼: 這樣checked的屬性值就可以顯示到頁面上了,我們可以利用它寫顯示隱藏的小案例。 2.vue中的迴圈遍歷: js代碼: html代碼: 這樣我們就可 ...
  • 聲明式渲染 Vue.js 的核心是一個允許採用簡潔的模板語法來聲明式的將數據渲染進 DOM: 我們已經生成了我們的第一個 Vue 應用!看起來這跟單單渲染一個字元串模板非常類似,但是 Vue 在背後做了大量工作。現在數據和 DOM 已經被綁定在一起,所有的元素都是響應式的。我們如何知道?打開你的瀏覽 ...
  • Vue.js是一套構建用戶界面的漸進式框架。與其他重量級框架不同的是,Vue 採用自底向上增量開發的設計。 Vue 的核心庫只關註視圖層,它不僅易於上手,還便於與第三方庫或既有項目整合。 另一方面,當與單文件組件和 Vue 生態系統支持的庫結合使用時,Vue 也完全能夠為複雜的單頁應用程式提供驅動。 ...
  • 事件綁定 事件綁定方法I:綁定元素屬性 事件綁定方法II:綁定對象屬性 事件綁定方法III:使用addEventListener() 方法(DOM2級事件程式) addEventListener 語法:target.addEventListener(type,listener,useCapture) ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...