摘要:遠(yuǎn)程讀取會(huì)有許多限制,防止引起不必要的安全隱患。比較時(shí)可以把點(diǎn)去掉轉(zhuǎn)為數(shù)字類型比較腳本執(zhí)行完畢下載前可以拿到更新日志時(shí)間版本號(hào)和包大小,下載時(shí)可以拿到速度。然后開(kāi)啟該項(xiàng)目的構(gòu)建。將第一步生成的填至項(xiàng)目環(huán)境變量,參數(shù)名為。
父母都是做出納相關(guān)的工作,希望我能給他們做個(gè)簡(jiǎn)單的進(jìn)銷存,在上班的時(shí)候使用。開(kāi)發(fā)一個(gè)不需要花錢買服務(wù)器,不需要依賴網(wǎng)絡(luò)(更新除外),單機(jī)版的程序,對(duì)于前端出身的我來(lái)說(shuō),那么electron或nwjs是最好的選擇。
electron官網(wǎng)對(duì)electron與nwjs的比較
這里我選擇了electron,因?yàn)楹苁煜ue,就使用國(guó)人集成的electron-vue進(jìn)行快速開(kāi)發(fā)。本地?cái)?shù)據(jù)庫(kù)采用輕量嵌入型數(shù)據(jù)庫(kù)sqlite3,不二之選。UI組件為iview。
本次項(xiàng)目【easy-invoices】github地址:https://github.com/CaanDoll/easy-invoices (求一波star~)
軟件下載(目前只構(gòu)建了windows版本):https://github.com/CaanDoll/easy-invoices/releases
electron官網(wǎng):https://electronjs.org/
electron-vue官網(wǎng):https://electron.org.cn/vue/index.html
界面預(yù)覽:
物品管理
進(jìn)出明細(xì)
安裝python2.7 和 Visual Studio 2015
二、安裝vue-cli腳手架,初始化electron-vue目錄$ npm install -g vue-cli $ vue init simulatedgreg/electron-vue easy-invoices
打包選擇electron-builder。builder可以打包成具體文件,也可以是exe安裝程序,而packager只能打包具體文件。下面會(huì)具體說(shuō)明打包。
該命令會(huì)生成一個(gè)easy-invoices文件夾,大致目錄如下(有細(xì)微變動(dòng))
.electron-vue:主要是webpack配置,還有一些封裝好了的命令行的輸出,供開(kāi)發(fā)、打包調(diào)試用。可以自行添加一些配置,如在webpack.render.config.js里添加less-loader和eslint-loader。
build:打包需要的素材,例如icon。打包后的默認(rèn)目錄也在于此
src:源碼,main是主進(jìn)程部分,render是渲染進(jìn)程部分,下文會(huì)講到這兩個(gè)概念。index.ejs會(huì)被編譯為html的入口。
static:靜態(tài)資源
有一些文件是我后來(lái)加上去的,比如eslint相關(guān)(.eslintrc.js,.eslintignore),與commit信息校驗(yàn)相關(guān)(verify_commmit_msg.js)等
.travis.yml為linux構(gòu)建平臺(tái)的配置,appveyor.yml為windows構(gòu)建平臺(tái)的配置。之后也會(huì)詳細(xì)提到自動(dòng)化構(gòu)建。
三、sqlite3集成nodejs中使用c++模塊會(huì)涉及到編譯問(wèn)題,該編譯常常會(huì)導(dǎo)致一些問(wèn)題發(fā)生。
詳細(xì)的操作請(qǐng)見(jiàn)我的另外一篇文章《electron項(xiàng)目中使用sqlite3的編譯問(wèn)題(windows)》
在使用electron開(kāi)發(fā)之前,我們需要注意以下幾點(diǎn)
electron的運(yùn)行依托于nodejs環(huán)境,渲染界面使用chromium。因此,我們開(kāi)發(fā)界面實(shí)則編寫html,并且在開(kāi)發(fā)的過(guò)程中,可以使用nodejs原生模塊,比如fs文件模塊、os系統(tǒng)模塊等。這使得我們的程序有更多的權(quán)限和功能,可以非常強(qiáng)大。但在強(qiáng)大的同時(shí),開(kāi)發(fā)者需要擔(dān)起自身的責(zé)任,需要更多的去注意安全問(wèn)題。
在electron里,最核心的兩個(gè)概念就是主進(jìn)程和渲染進(jìn)程。主進(jìn)程負(fù)責(zé)整個(gè)程序的調(diào)度,控制一些功能,只有一個(gè)。而渲染進(jìn)程負(fù)責(zé)界面的渲染。他們之間可以相互通信。
electron加載html有兩種方式,一種通過(guò)本地路徑讀取,一種通過(guò)http遠(yuǎn)程讀取。遠(yuǎn)程讀取會(huì)有許多限制,防止引起不必要的安全隱患。electron-vue封裝好了開(kāi)發(fā)模式和生產(chǎn)模式,開(kāi)發(fā)模式啟動(dòng)webpack-dev-server,渲染進(jìn)程遠(yuǎn)程讀取,生產(chǎn)模式打包至本地,渲染進(jìn)程本地路徑讀取。
electron-vue將vue與webpack集成進(jìn)來(lái)快速開(kāi)發(fā)。前端界面使用vue去開(kāi)發(fā),并使用vue-router做單窗口路由控制。webpack進(jìn)行模塊打包與開(kāi)發(fā)時(shí)的監(jiān)聽(tīng)。electron-vue腳手架提供了vue-electron,并已經(jīng)封裝了這個(gè)方法,當(dāng)運(yùn)行環(huán)境為electron的時(shí)候,會(huì)將electron掛載在Vue.prototype上。electron對(duì)象上有許多api,詳情請(qǐng)參考文檔。
// vue入口文件 // src/renderer/main.js if (!process.env.IS_WEB) Vue.use(require("vue-electron"));
...
1.主進(jìn)程與渲染進(jìn)程通信主進(jìn)程向渲染進(jìn)程發(fā)送消息:
// src/main/index.js import { BrowserWindow } from "electron"; const mainWindow = new BrowserWindow(); mainWindow.webContents.send("messageOne", "haha"); // 某vue組件
7. 打包前文提到,我采用的是electron-builder進(jìn)行打包。electron-builder官方文檔
打包的主要配置在package.json里:{ "scripts":{ "build": "node .electron-vue/build.js && electron-builder", "build:dir": "node .electron-vue/build.js && electron-builder --dir" }, "build": { "productName": "easy-invoices", "copyright": "caandoll", "appId": "org.caandoll.easy-invoices", "directories": { "output": "build" }, "files": [ "dist/electron/**/*" ], "dmg": { "contents": [ { "x": 410, "y": 150, "type": "link", "path": "/Applications" }, { "x": 130, "y": 150, "type": "file" } ] }, "mac": { "icon": "build/icons/icon.png" }, "win": { "icon": "build/icons/icon.png" }, "linux": { "icon": "build/icons/icon.png" }, "nsis": { "oneClick": false, "allowToChangeInstallationDirectory": true } } }scripts:
build:打包成exe安裝程序
build:dir:打包成文件形式
build:
productName:項(xiàng)目名
copyright:版權(quán)
directories:打包目錄
win: windows配置。icon為程序圖標(biāo)目錄,windows圖標(biāo)至少需要320 x 320,否則報(bào)錯(cuò)
nsis:windows安裝程序exe配置,如果不配置,那么一鍵安裝至C盤User一個(gè)local app目錄下,不符合程序使用要求,這里我設(shè)置了oneClick:false和allowToChangeInstallationDirectory:true,就是不讓程序一鍵安裝,讓用戶去選擇安裝目錄。
其他如appId,dmg,linux、mac都是macOS和linux系統(tǒng)配置,沒(méi)有仔細(xì)研究
8. CI自動(dòng)構(gòu)建發(fā)布travis和appveyor是開(kāi)源的兩個(gè)自動(dòng)化構(gòu)建平臺(tái),免費(fèi)服務(wù)于github等開(kāi)源項(xiàng)目(不開(kāi)源項(xiàng)目貌似要給錢)。如果你是在其他這兩個(gè)CI平臺(tái)不支持的倉(cāng)庫(kù),可使用其他構(gòu)建工具,原理相同。
①. 在https://github.com/settings/tokens Generate new token,寫上描述,勾上發(fā)布權(quán)限,生成token。該token只可見(jiàn)一次,注意保存
②. https://www.appveyor.com/注冊(cè)用戶,使用github登錄。然后開(kāi)啟該項(xiàng)目的構(gòu)建。
③. 將第一步生成的token填至項(xiàng)目環(huán)境變量,參數(shù)名為GH_TOKEN。發(fā)布的時(shí)候會(huì)自動(dòng)使用GH_TOKEN進(jìn)行g(shù)ithub release api的調(diào)用。
④. package.json
{ "repository": { "type": "git", "url": "https://github.com/CaanDoll/easy-invoices.git" }, "scripts":{ "build:ci": "node .electron-vue/build.js && electron-builder --publish always" }, }build:ci:執(zhí)行后,不僅打包,還會(huì)將打包后程序上傳,發(fā)布成github的release草稿,手動(dòng)編輯后即可發(fā)布。
⑥. appveyor.yml
version: 0.0.{build} branches: only: - master image: Visual Studio 2017 platform: - x64 cache: - node_modules - "%APPDATA% pm-cache" - "%USERPROFILE%.electron" - "%USERPROFILE%AppDataLocalYarncache" init: - git config --global core.autocrlf input install: - ps: Install-Product node 8 x64 - yarn build_script: - yarn build:ci test: offversion:為構(gòu)建的版本號(hào),會(huì)自增,這個(gè)和程序的版本號(hào)沒(méi)有關(guān)系
branches:指定在哪個(gè)分支進(jìn)行構(gòu)建
image:基礎(chǔ)鏡像,windows程序構(gòu)建會(huì)用到vs
platform:系統(tǒng)位數(shù):如x86(32位),x64(64位)
cache:npm緩存目錄
init:初始執(zhí)行命令,將所有代碼換行符改為CRLF模式
install:安裝包
build_script:執(zhí)行命令
接下來(lái)提交在github master分支或者merge到master分支(申請(qǐng)merge之后也會(huì)觸發(fā))就可以觸發(fā)構(gòu)建了,在appveyor平臺(tái)上可以看到。
五、其他一些細(xì)節(jié) 1.打開(kāi)系統(tǒng)默認(rèn)瀏覽器對(duì)應(yīng)鏈接或者打開(kāi)我的電腦對(duì)應(yīng)文件目錄如果使用一般的a標(biāo)簽,會(huì)直接將程序的界面跳轉(zhuǎn)至這個(gè)鏈接,因?yàn)楸旧砭褪菫g覽器內(nèi)核。加上target:_blank的話更會(huì)沒(méi)有反應(yīng)了。這個(gè)時(shí)候需要調(diào)用electron.shell。上面的openExternal(url)方法就是打開(kāi)瀏覽器,openItem(path)打開(kāi)文件目錄。
// vue入口文件 // src/renderer/main.js if (!process.env.IS_WEB) Vue.use(require("vue-electron")); // 某頁(yè)面組件xxx.vue2.導(dǎo)出excel(下載文件)如果在服務(wù)端進(jìn)行導(dǎo)出,有兩個(gè)步驟,第一步是將數(shù)據(jù)填充并生成excel,第二步是將文件發(fā)送出去。使用electron本地進(jìn)行導(dǎo)出也不例外,但因?yàn)椴皇钦{(diào)用http接口,會(huì)有一些差異。
nodejs生成excel在這里就不多描述,以后我會(huì)補(bǔ)充相應(yīng)的文章。在這里先推薦這兩個(gè)庫(kù),如果生成的excel比較簡(jiǎn)單,橫行數(shù)列并沒(méi)有任何樣式的,可以使用node-xlsx。如果需要生成較為復(fù)雜的excel,比如有樣式要求,有合并單元格的需求,可以使用ejsExcel。
假設(shè)我們已經(jīng)導(dǎo)出了一個(gè)名為test.xlsx的excel在系統(tǒng)臨時(shí)目錄(os.tmpdir()):C:UsersusernameAppDataLocalTempappnametest.xlsx// src/main/index.js import { ipcMain } from "electron"; // mainWindow來(lái)自new BrowserWindow ipcMain.on("download", (event, downloadPath) => { mainWindow.webContents.downloadURL(downloadPath);// 這個(gè)時(shí)候會(huì)彈出讓用戶選擇下載目錄 mainWindow.webContents.session.once("will-download", (event, item) => { item.once("done", (event, state) => { // 成功的話 state為completed 取消的話 state為cancelled mainWindow.webContents.send("downstate", state); }); }); }); // 渲染進(jìn)程 ipcRenderer.send("download", "C:UsersusernameAppDataLocalTempappname est.xlsx"); ipcRenderer.once("downstate", (event, arg) => { if (arg === "completed") { console.log("下載成功"); } else if (arg === "cancelled"){ console.log("下載取消"); } else { console.log("下載失敗") }3.窗口相關(guān)① 窗口欄
原生的窗口欄不是那么美觀,我們可以去掉原生窗口欄,自己寫一個(gè)。
主進(jìn)程// src/main/index.js import { BrowserWindow、ipcMain } from "electron"; // 創(chuàng)建窗口時(shí)配置 const mainWindow = new BrowserWindow({ frame: false, // 去掉原生窗口欄 ... }); // 主進(jìn)程監(jiān)聽(tīng)事件進(jìn)行窗口最小化、最大化、關(guān)閉 // 窗口最小化 ipcMain.on("min-window", () => { mainWindow.minimize(); }); // 窗口最大化 ipcMain.on("max-window", () => { if (mainWindow.isMaximized()) { mainWindow.restore(); } else { mainWindow.maximize(); } }); // 關(guān)閉 ipcMain.on("close-window", () => { mainWindow.close(); });頭部組件或其他組件,這樣就可以在自己定義的元素上去執(zhí)行窗口操作了
css設(shè)置拖拽區(qū)域,拖拽區(qū)域會(huì)自動(dòng)有雙擊最大化的功能,注意:拖拽區(qū)域內(nèi)的點(diǎn)擊、移入移出等事件將無(wú)效,需要將拖拽區(qū)域內(nèi)的按鈕等元素設(shè)為非拖拽區(qū)域即可
header { -webkit-app-region: drag; // 拖拽區(qū)域 .version { .ivu-tooltip { -webkit-app-region: no-drag; // 非拖拽區(qū)域 } } .right { a { -webkit-app-region: no-drag; // 非拖拽區(qū)域 } } }② 啟動(dòng)時(shí)窗口白屏
程序啟動(dòng)時(shí),界面渲染需要一定時(shí)間,導(dǎo)致白屏一下,體驗(yàn)不好。解決方案一種是將程序的背景色設(shè)為html的背景色,另外一種就是等界面加載完畢之后再顯示窗口,代碼如下:
主進(jìn)程中// src/main/index.js import { BrowserWindow} from "electron"; const mainWindow = new BrowserWindow({ show: false, ... }); // 加載好html再呈現(xiàn)window,避免白屏 mainWindow.on("ready-to-show", () => { mainWindow.show(); mainWindow.focus(); });結(jié)語(yǔ)electron非常好玩,它解放了我們?cè)跒g覽器中開(kāi)發(fā)界面的束縛。C/S架構(gòu)也有很多不同于功能點(diǎn)需要多多考慮。第一次寫比較長(zhǎng)的文章,個(gè)中可能會(huì)有手誤或者知識(shí)錯(cuò)誤,順序也不是最理想的。歡迎討論,也請(qǐng)各路大牛多多指教,指出不正!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/98829.html
摘要:其實(shí)這個(gè)應(yīng)用并不是那么的特別需求,一來(lái)本人寫越來(lái)越少,二來(lái)開(kāi)發(fā)工作也是越做越少,再者目前的編輯器幾乎都支持直接剪切板上傳圖片,使圖床應(yīng)用的場(chǎng)景越來(lái)越少。 其實(shí)這個(gè)應(yīng)用并不是那么的特別需求,一來(lái)本人寫blog越來(lái)越少,二來(lái)開(kāi)發(fā)工作也是越做越少,再者目前的編輯器幾乎都支持直接剪切板上傳圖片,使圖床應(yīng)用的場(chǎng)景越來(lái)越少。不過(guò)本人本著不想丟棄技術(shù)的內(nèi)心想法,以及鍛煉自己寫一個(gè)完整項(xiàng)目,還是開(kāi)啟了...
摘要:翻譯一下它是一個(gè)運(yùn)行時(shí),可以像一樣這樣執(zhí)行也是一個(gè)使用構(gòu)建跨平臺(tái)原生桌面應(yīng)用的框架。具有兩個(gè)進(jìn)程,分別是主進(jìn)程,以及渲染進(jìn)程。 什么是 electron 官網(wǎng)里這么說(shuō):Electron提供了一個(gè)Nodejs的運(yùn)行時(shí),專注于構(gòu)建桌面應(yīng)用,同時(shí)使用web頁(yè)面來(lái)作為應(yīng)用的GUI,你可以將其看作是一個(gè)由JavaScript控制的迷你版的Chromium瀏覽器。 翻譯一下:它是一個(gè)運(yùn)行時(shí),可以像...
摘要:推薦使用使用指定打包位。開(kāi)發(fā)環(huán)境跨域代理設(shè)置如果是接口,需要配置這個(gè)參數(shù)如果接口跨域,需要進(jìn)行這個(gè)參數(shù)配置通過(guò)新窗口打開(kāi)項(xiàng)目?jī)?nèi)頁(yè)面 ————僅以此文記錄個(gè)人使用vuejs開(kāi)發(fā)項(xiàng)目對(duì)一些需求的處理方法,不定期更新... 加載favicon.ico圖標(biāo) //index.html // build/webpack.dev.conf.js new HtmlWebpackPlugin({ ...
摘要:項(xiàng)目環(huán)境代碼完成時(shí)間廢話不多說(shuō),先放源碼安裝依賴運(yùn)行項(xiàng)目打包項(xiàng)目目錄結(jié)構(gòu)先在主進(jìn)程引入在方法里添加以下代碼,獲取打印機(jī)列表在主線程下,通過(guò)對(duì)象監(jiān)聽(tīng)渲染線程傳過(guò)來(lái)的事件在主線程中獲取打印機(jī)列表通過(guò)發(fā)送事件到渲染線程,同時(shí)將 項(xiàng)目環(huán)境 node 10.15.3yarn 1.15.2win10代碼完成時(shí)間2019-4-18 廢話不多說(shuō),先放源碼 GitHub https://github....
摘要:發(fā)布不到兩天,上數(shù)已近,這個(gè)業(yè)界大熱的史上最輕量的開(kāi)源發(fā)行版,你試過(guò)了沒(méi)資深架構(gòu)師來(lái)教你走出嘗鮮第一步使用教程在此前言昨天,正式發(fā)布了一款史上最輕量的開(kāi)源發(fā)行版。大小只有,極簡(jiǎn),輕便,易于使用。 發(fā)布不到兩天,GitHub上Star數(shù)已近3000,這個(gè)業(yè)界大熱的、史上最輕量的開(kāi)源Kubernetes發(fā)行版,你試過(guò)了沒(méi)? Rancher資深架構(gòu)師來(lái)教你走出嘗鮮第一步!使用教程在此! sh...
閱讀 2381·2021-11-23 09:51
閱讀 5852·2021-09-22 15:39
閱讀 3404·2021-09-02 15:15
閱讀 3557·2019-08-30 15:54
閱讀 2416·2019-08-30 15:53
閱讀 1456·2019-08-30 14:04
閱讀 2510·2019-08-29 18:33
閱讀 2477·2019-08-29 13:08