1. 程式人生 > >Electron入門Demo之桌面應用計算器筆記(二)

Electron入門Demo之桌面應用計算器筆記(二)

### 碼文不易啊,轉載請帶上本文連結呀,感謝感謝 https://www.cnblogs.com/echoyya/p/14307996.html 在之前總結了一篇自學筆記,通過之前學習到的方法和知識,完成了一個較為簡單的桌面應用程式,**Electron 實現桌面計算器**,並打包成 `.exe 可執行檔案` 和 `可安裝包檔案` ## 簡要繪製一下該Demo的主要功能: ![](https://img2020.cnblogs.com/blog/1238759/202101/1238759-20210121144459299-1894849778.gif) ![](https://img2020.cnblogs.com/blog/1238759/202101/1238759-20210121144402636-1377543968.png) ## 簡短描述一下所用到的基礎知識: 1. 初始化應用,建立視窗,載入內容 2. 設定選單檔案,main.js 引入選單檔案 3. 渲染程序建立子視窗 4. 渲染程序與主程序之間通訊 5. 執行使用者選擇操作,並進行本地快取,便於下次啟動應用時,讀取使用者設定 6. 專案檔案目錄結構 ![](https://img2020.cnblogs.com/blog/1238759/202101/1238759-20210121144530267-272704703.png) ### 準備工作 1. 建立一個空的資料夾,並建立入口 `main.js` 檔案,計算器必要檔案,計算器的程式碼,此處就不貼了,已上傳至百度雲,可自行下載 - 連結:https://pan.baidu.com/s/1d-v4MimASMcYKkk_eSXz6Q 提取碼:ft7f 2. 安裝`electron` - npm init -y:初始化配置檔案 package.json - npm i electron 3. 建立資料夾及檔案 - 主程序選單檔案:`./main-process/calculatorMenu.js` - 渲染程序顏色檔案:`./render-process/calculatorColor.js` `main.js:`基本構建 ``` // app:控制應用的生命週期 BrowserWindow: 建立瀏覽器視窗 const { app ,BrowserWindow, ipcMain} = require('electron'); const path = require('path'); // 引入設定選單檔案 require('./main-process/calculatorMenu'); app.on('ready',ny_createWindow) let win; // 建立視窗 function ny_createWindow(){ win = new BrowserWindow({ width:345, height:370, webPreferences: { nodeIntegration: true, enableRemoteModule: true, } }); // 載入內容 win.loadURL(path.join(__dirname, './calculator/index.html')) // 計算器 win.on('close',function(){ win = null; // 關閉視窗 app.quit(); // 關閉應用 }) } ``` `./main-process/calculatorMenu.js` ``` // 1.建立選單模板 const { Menu, BrowserWindow, app} = require('electron'); const path = require('path'); let template = [{ label: '計算器', submenu: [{ label: '關於計算器', click: function () { ny_createAboutWindow() } }, { label: '退出', accelerator: 'ctrl+Q', click: function () { app.quit(); } } ] }, { label: '格式', submenu: [{ label: '顏色', click: function () { ny_createColorWindow() } }, { type: 'separator' }, { label: '字型增大', accelerator: 'F11', click: function (item,win) { // 主程序 - > 渲染程序 通訊 if(win){ win.webContents.send('add') // 不需要傳送資料 } } }, { label: '字型減小', accelerator: 'F12', click: function (item,win) { if(win){ win.webContents.send('cut') } } }, { label: '預設字型', accelerator: (function () { return 'ctrl+0' })(), click: function (item,win) { if(win){ win.webContents.send('normal') } } } ] } ] // 2.構建選單,例項化一個選單物件 let menu = Menu.buildFromTemplate(template); // 3. 把選單物件設定到應用中 Menu.setApplicationMenu(menu); // 4.建立 about 視窗 function ny_createAboutWindow() { let win = new BrowserWindow({ width: 284, height: 198 }) win.loadURL(path.join(__dirname, '../calculator/about.html')); // 子視窗不要選單 win.setMenu(null) win.on('close', function () { win = null; }) } // 5.建立 color 視窗 function ny_createColorWindow() { let win = new BrowserWindow({ width: 260, height: 95, webPreferences: { nodeIntegration: true } }); win.loadURL(path.join(__dirname, '../calculator/color.html')); win.setMenu(null); win.on('click', function () { win = null; }) } ``` `./calculator/color.html` ``` ``` `./render-process/calculatorColor.js` ``` // 渲染程序 const {ipcRenderer} = require('electron') //
  • let lis = document.querySelectorAll('li'); // 遍歷每個li,繫結點選事件 獲取對應的顏色值 this.dataset.color, 傳送到主程序 for (let i = 0; i < lis.length; i++) { var li = lis[i]; li.onclick = function(){ ipcRenderer.send('colorToMain',this.dataset.color) } } ``` ### 程序之間的通訊,傳遞顏色值和字型大小變化的指令 1. color傳值:`渲染程序 --> 主程序 --> 渲染程序` 2. fontSize傳值:`主程序 --> 渲染程序` ![](https://img2020.cnblogs.com/blog/1238759/202101/1238759-20210121144645329-1403371990.png) ### 程式碼補充: `main.js:` ``` ipcMain.on('colorToMain',function(event,color){ win.webContents.send('colorToRender',color); }) ``` `./calculator/index.js` ``` // 獲取螢幕input物件 let txt = document.getElementById("txt"); if (localStorage.getItem('color')) { txt.style.color = localStorage.getItem('color') } if (localStorage.getItem('fontSize')) { txt.style.fontSize = localStorage.getItem('fontSize') } // 接受 Color ipcRenderer.on('colorToRender', function (event, color) { txt.style.color = color localStorage.setItem('color', color) }) // 字型增大 ipcRenderer.on('add', function (event, data) { let fontSize = window.getComputedStyle(txt).fontSize; fontSize = parseInt(fontSize) + 3 txt.style.fontSize = fontSize + 'px' localStorage.setItem('fontSize',fontSize + 'px'); }); // 字型減小 ipcRenderer.on('cut', function (event, data) { let fontSize = window.getComputedStyle(txt).fontSize; fontSize = parseInt(fontSize) - 3; txt.style.fontSize = fontSize + 'px'; localStorage.setItem('fontSize',fontSize + 'px'); }) // 預設字型 ipcRenderer.on('normal', function (event, data) { txt.style.fontSize = '30px'; txt.style.color = '#ffffff'; localStorage.setItem('fontSize','30px'); localStorage.setItem('color', '#ffffff') }); ``` ### 打包為安裝包 - 下載:`npm i electron-builder -g` - electron-builder可以將應用程式打包為安裝檔案,如.exe .dmg,對於windows系統打包為.exe,對於mac系統打包為.dmg - 實現electron-builder的配置,package.json 檔案, `npm run XXX` 執行 ``` "build":{ "appId":"com.test.app", "productName":"calculator", "dmg":{ "icon":"./images/mac.icns", "window":{ "x":200, "y":150, "width":540, "height":380 } }, "mac": { "icon":"./images/mac.icns" }, "win":{ "icon":"./src/img/win.ico" } }, "scripts": { "start": "electorn .", "buildwin":"electron-builder --win ", "buildwin":"electron-builder --mac ", "packager":"electron-packager ./ calculator --platform=win32 --out=./dist --arch=x64 --app-version=1.0.1 --ignore=node_modules --icon=./src/img/win.ico --overwrite ", } ``` ![](https://img2020.cnblogs.com/blog/1238759/202101/1238759-20210121144705590-243031084.png) **上述為應用全部原始碼,歡迎指教共同學習~