# 利用 electron.js 建立桌面 APP ( Windows )
[
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
](https://s3.ap-northeast-1.amazonaws.com/download.swise.jp/SWise-Windows.exe)
###### tags : `w3HexSchool` . `electron`
> 當 PM 需要在無網路的環境中執行 vue 專案時
> 要如何交付 vue 專案 , 讓他可以去給客戶 demo 呢 ?
> 要求 PM 學會 vue cli ? 這顯然是個不太靠譜的作法 !
> 這時候 , 也許你會想要有個 windows 執行檔 , 讓 PM 方便執行你的成品
> 讓我們請出今天的主角 `electron` , 並發布 `.exe` 吧 !
官方 : https://www.electronjs.org/
![](https://i.imgur.com/qmHkLX1.png)
![](https://i.imgur.com/qXUwVSN.png)
## 安裝
> 利用 `electron-quick-start` 建立 `electron` 基礎專案
```shell=
# 複製 Quick Start 儲存庫
$ git clone https://github.com/electron/electron-quick-start
# 進到儲存庫裡
$ cd electron-quick-start
# 安裝相依的套件並執行
$ npm install && npm start
```
> 安裝結果
![](https://i.imgur.com/77QcBPI.png)
## 打包
> 使用 `electron-packager` 打包專案
官方 : https://github.com/electron/electron-packager
```shell=
# 下載 electron-packager
npm install electron-packager --save-dev
```
接下來需要在"scripts"增加執行electron-packager的指令,指令如下,
"package":"electron-packager . FishBucket --platform=win32 --arch=x64 --version=1.7.10
--icon=icons/Mushroom.ico --asar=true --out=build --ignore=node_modules/electron-* "
指令內容說明如下:
electron-packager . FishBucket: 將目前全部資料打包成FishBucket這個名字
--platform = darwin(Mac),win32(Windows),linux(LINUX)
--arch = ia32,x64,all
--version = Electron版本
--icon = icon路徑
--asar = true or false,設定trun是把程式文件封裝,比較不容易被看到原始碼
--out = 輸出文件名稱(dist)
--ignore = 忽略檔案不要打包,建議把electron都忽略掉,因為打包後裡面就有了,可以減少檔案大小
> 執行 `npm run package` 後 , 我們可以看到多了 `build/FishBucket` 資料夾
![](https://i.imgur.com/XvHdCkx.png)
之後 , 我們可以將 `FishBucket` 資料夾 , 丟給 `PM` 請他執行 `FishBucket/FishBucket.exe`
## 自定義菜單(menu)
> `menu` 官方文件 : https://www.electronjs.org/docs/api/menu
設定 `menu` 的 `template`
```javascript=
const isMac = process.platform === 'darwin';
const template = [
{
label: '檔案',
submenu: [
{
label: '關閉',
role: isMac ? 'close' : 'quit'
}
]
},
];
```
在 app ready 中 , 加上 `Menu.setApplicationMenu`
```javascript=
app.on('ready', function () {
+ const menu = Menu.buildFromTemplate(template);
+ Menu.setApplicationMenu(menu);
createWindow();
});
```
## ipcMain . ipcRender
> 範例請參考 : https://newsn.net/say/electron-ipc.html
> 我們需要利用 ipcMain 當 listener . ipcRender 當 trigger
> 執行 `start chrome http://localhost:3000` 開啟 `chrome 瀏覽器`
![](https://i.imgur.com/PShZuH0.png)
## 加入 vue 專案
- serve
開啟 electron APP 時 , 同時啟動 http-server
```javascript=
// in ./server.js
const handler = require('serve-handler');
const http = require('http');
const server = http.createServer((request, response) => {
// You pass two more arguments for config and middleware
// More details here: https://github.com/zeit/serve-handler#options
return handler(request, response, {
"public": 'dist'
});
});
server.listen(3000, () => {
console.log('Running at http://localhost:3000');
});
module.exports = server;
```
```javascript=
// in ./main.js
// start up server as app opening
+ const server = require('./server');
```
- `dist` 資料夾
將 `npm run build` 產出的 `dist` 資料夾 , 複製到 `FishBucket/dist` 資料夾
## 坑點紀錄
- app = undefined
> 用 `node ./main.js` 執行 , app 會變成 `undefined` , 所以要改成 `electron ./main.js` 去執行
## 參考資料
- [Electron with Vue.js](https://www.youtube.com/watch?v=Fl7---SEORQ)
- [Build an Electron App in Under 60 Minutes](https://www.youtube.com/watch?v=kN1Czs0m1SU)
- [Electron packager tutorial](https://www.christianengvall.se/electron-packager-tutorial/)