基于Electron實(shí)現(xiàn)桌面應(yīng)用開(kāi)發(fā)代碼實(shí)例
Electron是一個(gè)可以使用 JavaScript,HTML 和 CSS 構(gòu)建跨平臺(tái)桌面應(yīng)用程序的開(kāi)源框架。
本文主要分享一下采用vue + electron開(kāi)發(fā)桌面程序的搭建過(guò)程。
1. 環(huán)境準(zhǔn)備
這里采用的是vue-cli3.x,可以通過(guò)下面的指令查看當(dāng)前vue-cli的版本:
vue --version# 3.9.3 這里我用的是3.9.3
如果沒(méi)有裝vue-cli可以通過(guò)下面的命令安裝:
npm install -g @vue/cli
如果是vue-cli還是2.x可以先卸載2.x然后裝3.x
npm uninstall vue-cli -g
npm install -g @vue/cli
2. 創(chuàng)建項(xiàng)目
這里采用vue-cli創(chuàng)建vue項(xiàng)目。
vue create electron-helloworld
引入vue-cli-plugin-electron-builder
cd electron-helloworld
vue add electron-builder
這一步需要拉取electron-vX.Y.Z-win32-x64.zip,過(guò)程非常漫長(zhǎng)。
3. 運(yùn)行項(xiàng)目
運(yùn)行electron項(xiàng)目。
npm run electron:serve
4. node通訊
正常來(lái)說(shuō)vue組件應(yīng)該只關(guān)心頁(yè)面層的邏輯即可,所以為了解耦,可以在Vue Component和Node API、Electron API中間插入一個(gè)橋接層,然后通過(guò)IPC進(jìn)行通訊,如下圖所示:
按照關(guān)系圖,Vue Commponent通過(guò)Service發(fā)布事件,完成與Node API和Electron API的通訊,下面根據(jù)這個(gè)關(guān)系寫一個(gè)讀取文件內(nèi)容的示例。
創(chuàng)建Service,發(fā)布事件并監(jiān)聽(tīng)
/bridge/service/Service.js
import { ipcRenderer } from 'electron' class Service { readTxt(params, callback) { ipcRenderer.once('readTxt', (e, ret) => callback(ret)) // 將params參數(shù)傳給Server ipcRenderer.send('readTxt', params) } } export default new Service()
創(chuàng)建Server,監(jiān)聽(tīng)事件并讀取文件內(nèi)容返回
/bridge/server/Server.js
import { ipcMain } from "electron"; import fs from 'fs' export default class Server { constructor(app, win) { this.app = app this.win = win } initEventHandler() { ipcMain.on('readTxt', (e, params) => { // 這里將參數(shù)轉(zhuǎn)化為json,然后讀取G:\\0.txt的內(nèi)容一起返回 const pms = JSON.stringify(params) const ret = fs.readFileSync('G:\\0.txt') e.sender.send('readTxt', pms + '::::' + ret) }) } }
啟動(dòng)Server
在創(chuàng)建完Server之后,需要在應(yīng)用程序啟動(dòng)的時(shí)候啟動(dòng)并讓其監(jiān)聽(tīng)對(duì)應(yīng)的事件。
這里可以創(chuàng)建一個(gè)ApplicationContext,來(lái)啟動(dòng)Server。
/bridge/ApplicationContext.js
import Server from './server/Server' export default class ApplicationContext { constructor(app, window) { this.app = app this.window = window } init() { new Server(this.app, this.window).initEventHandler() } }
然后在background.js中實(shí)例化ApplicationContext,并調(diào)用init方法。
win.on('closed', () => { win = null }) // Windows創(chuàng)建完成后初始化context new ApplicationContext(app, win).init()
Vue組件調(diào)用Service
完成上面三步之后,只需要在vue組件中調(diào)用Service即可,這一步跟普通開(kāi)發(fā)vue程序是一樣的。
<div>{{txt}}</div> <button @click="readTxt">讀取文件信息</button>
<script> import service from '@/bridge/service/Service' export default { name: 'HelloWorld', props: { msg: String }, data() { return { txt: '' } }, methods: { readTxt() { // 這里傳入兩個(gè)參數(shù),并將返回結(jié)果賦值給txt,在div中顯示出來(lái) service.readTxt({ p1: '參數(shù)1', p2: '參數(shù)2' }, resp => { this.txt = resp }) } } } </script>
至此,一個(gè)electron helloworld示例就完成了。
5. node API undefind
在上面的過(guò)程中可能會(huì)遇到node API undefined的情況,這是因?yàn)閑lectron禁用了node集成,在background.js中創(chuàng)建window的時(shí)候指定了配置:
webPreferences: { // Use pluginOptions.nodeIntegration, leave this alone // See nklayman.github.io/vue-cli-plugin-electron builder/guide/security.html#node-integration for more info nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION // nodeIntegration: true }
這里可以通過(guò)配置electronBuilder插件解決。
在項(xiàng)目目錄根目錄下面創(chuàng)建vue.config.js,內(nèi)容如下:
// see https://cli.vuejs.org/config module.exports = { productionSourceMap: false, pluginOptions: { electronBuilder: { nodeIntegration: true, }, configureWebpack: { resolve: { symlinks: true } } } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JS實(shí)現(xiàn)的合并多個(gè)數(shù)組去重算法示例
這篇文章主要介紹了JS實(shí)現(xiàn)的合并多個(gè)數(shù)組去重算法,涉及javascript數(shù)組遍歷、判斷、運(yùn)算、排序等相關(guān)操作技巧,需要的朋友可以參考下2018-04-04javascript實(shí)現(xiàn)的多個(gè)層切換效果通用函數(shù)實(shí)例
這篇文章主要介紹了javascript實(shí)現(xiàn)的多個(gè)層切換效果通用函數(shù),涉及javascript針對(duì)頁(yè)面元素樣式的遍歷與操作技巧,需要的朋友可以參考下2015-07-07JavaScript高級(jí)程序設(shè)計(jì) 閱讀筆記(二十一) JavaScript中的XML
雖然XML和DOM已經(jīng)變成Web開(kāi)發(fā)的重要組成部分,但目前僅IE跟Mozilla支持客戶端的XML處理2012-09-09小程序?qū)崿F(xiàn)左右來(lái)回滾動(dòng)字幕效果
這篇文章主要為大家詳細(xì)介紹了小程序?qū)崿F(xiàn)左右來(lái)回滾動(dòng)字幕效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12js完美實(shí)現(xiàn)@提到好友特效(兼容各大瀏覽器)
本文給大家分享的是一則使用javascript完美實(shí)現(xiàn)兼容各大瀏覽器的@好友自動(dòng)提示的特效,是根據(jù)百度貼吧的效果模仿來(lái)的,推薦給小伙伴們,希望大家能夠喜歡。2015-03-03JavaScript中push(),join() 函數(shù) 實(shí)例詳解
本文通過(guò)實(shí)例給大家介紹了JavaScript中push(),join() 的知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09JS實(shí)現(xiàn)在Repeater控件中創(chuàng)建可隱藏區(qū)域的代碼
在WEB應(yīng)用中,如何才能使應(yīng)用高效率呢?如何才能吸引用戶呢?這的確是個(gè)大學(xué)問(wèn),頁(yè)面的內(nèi)容,色搭配等都十分重要。但不可忽視的是,多數(shù)情況下,對(duì)于數(shù)據(jù)的呈現(xiàn)方式也是十分重要的。2010-09-09微信小程序input抖動(dòng)問(wèn)題的修復(fù)方法
這篇文章主要給大家介紹了關(guān)于微信小程序input抖動(dòng)問(wèn)題的修復(fù)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03JavaScript異步編程:異步數(shù)據(jù)收集的具體方法
我們先嘗試在不借助任何工具函數(shù)的情況下來(lái)解決這個(gè)問(wèn)題。筆者能想到的最簡(jiǎn)單的方法是:因前一個(gè)readFile的回調(diào)運(yùn)行下一個(gè)readFile,同時(shí)跟蹤記錄迄今已觸發(fā)的回調(diào)次數(shù),并最終顯示輸出。下面是筆者的實(shí)現(xiàn)結(jié)果。2013-08-08