初探vue electron

TomatoSoup
拯救世界的一千零一種方法
6 min readMay 28, 2021

用vue來寫個桌面excel轉換器

身為一個科科人,看到篩檢流程塞車造成的校正回歸現象引發社會的激烈揶揄是很不願看到的,也好奇著自己是否能盡一份心力,只好六日沒事戳戳在醫院上班的女友有什麼是可以支援的(?

然後需求就來了:

我們醫院系統輸出的excel格式和上傳CDC的excel格式不太一樣,這段都要靠人力去硬幹,超級花時間的啊,有沒有辦法生個轉換器啊?

稍微討論一下,列出幾個需求:

  1. 部分欄位原始資料並沒有,需要靠邏輯去產生
  2. 不需設定,餵一個檔案進去,直接噴一個檔案出來的懶人轉換
  3. 因為資料不能外流,需要桌面程式做線下轉換(win7、win10、mac)

因為1. ,單純的欄位搬移無法滿足,需要有程式來產生其他欄位資料

因為2. ,在excel寫入巨集的做法不是最佳解

因為3.,不能用線上服務來解,線下環境需要支援多平台

綜合上述情況,決定試看看用Electron來實做桌面程式啦!

本篇順手紀錄一下開發的流程與打包的一些小坑,希望往後要再次開發Electron時能有所幫助XD

本次的專案在這裏,也歡迎各路大大指點鞭策

Electron就是個讓html、js、css等前端技術可以脫離瀏覽器的束縛,轉為桌面程式執行的一個框架。

但是在這裡我想進一步用Vue搭配Electron來進行開發,所以變成:

Vue CLI + Vue CLI Plugin Electron Builder

建立專案

先啟個專案,把上述組合引入

// Vue CLI創建專案
vue create excel-to-cdc
cd excel-to-cdc
// 安裝Vue CLI Plugin Electron Builder
vue add electron-builder

在package.json中可以看到多了幾個script

速速的在terminal中輸入:

yarn vue-cli-service electron:serve

就會出現熟悉的畫面&devtool了!

開發

/src/background.js

background.js是Electron的進入點,啟動時相關的hook都在其中,例如這段就是app啟動時,在開發模式下幫我們載入vue devtool:

而視窗的基本設定也是在這裏寫入:

其實我也只有改過啟動時的視窗長寬(欸

在這裏我還想引入Element ui來快速堆出操作介面:

// 安裝Element ui
yarn add element-ui
// 安裝個別載入Element ui需要的babel-plugin-component
yarn add babel-plugin-component -D

接著就按照官方文件來改寫babel.config.js和main.js:

/babel.config.js
/main.js

剩下的就是在熟悉的App.vue中進行畫面與邏輯的開發了,就不多贅述囉

最後完成品大概是這樣

murmur: 字串比對應該寫成正規表達式的…原諒我真的還沒學通(艸)

打包

從package.json中可以知道

yarn electron:build

這指令是用來打包、輸出成桌面程式的,打包完的程式預設會放在:

dist_electron/excel-to-cdc-0.1.0.dmg

從副檔名就可以知道,這只是給mac安裝用的…

要build windows的程式需要另外設定,我們可以回到package.json新增一段指令:

"build:win": "vue-cli-service electron:build --windows"

接著就可以在終端機中快樂的編譯出windows用程式了:

yarn build:win

打包完後就可以看到產生了windows的exe安裝檔了!

dist_electron/excel-to-cdc Setup 0.1.0.exe

另外還有不少人喜歡的免安裝版:

dist_electron/win-unpacked

就可以開心的交差啦!

測試後驚覺這windows程式只支援x64,win7如果灌的是x86會出現不相容無法安裝…

所以我們需要在vue.config.js中新增electronBuilder的設定:

再次執行

yarn build:win

編譯出的安裝檔就支援x86囉!

而免安裝檔則是存放在另一個路徑:

dist_electron/win-ia32-unpacked

就真的能開心交差啦!

初次嘗試Electron挺有趣的,一個下午就能夠將原有的技能樹往外擴充到桌面上發揮是個很棒的體驗,往後有機會再來繼續研究看看更細部的相關設定,例如icon的替換、編譯路徑的置換、與外界事件的傳遞等…看來還很有得摸呢XD

--

--