碼文不易啊,轉載請帶上本文連結呀,感謝感謝 https://www.cnblogs.com/echoyya/p/14307996.html
在之前總結了一篇自學筆記,通過之前學習到的方法和知識,完成了一個較為簡單的桌面應用程式,Electron 實現桌面計算器,並打包成 .exe 可執行檔案
和 可安裝包檔案
簡要繪製一下該Demo的主要功能:
簡短描述一下所用到的基礎知識:
-
初始化應用,建立視窗,載入內容
-
設定選單檔案,main.js 引入選單檔案
-
渲染程式建立子視窗
-
渲染程式與主程式之間通訊
-
執行使用者選擇操作,並進行本地快取,便於下次啟動應用時,讀取使用者設定
-
專案檔案目錄結構
準備工作
-
建立一個空的資料夾,並建立入口
main.js
檔案,計算器必要檔案,計算器的程式碼,此處就不貼了,已上傳至百度雲,可自行下載- 連結:https://pan.baidu.com/s/1d-v4MimASMcYKkk_eSXz6Q 提取碼:ft7f
-
安裝
electron
-
npm init -y:初始化配置檔案 package.json
-
npm i electron
-
-
建立資料夾及檔案
-
主程式選單檔案:
./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
<script>
require('../render-process/calculatorColor');
</script>
./render-process/calculatorColor.js
// 渲染程式
const {ipcRenderer} = require('electron')
//<li data-color="#00ffff" style="background-color: #00ffff;"></li>
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)
}
}
程式之間的通訊,傳遞顏色值和字型大小變化的指令
-
color傳值:
渲染程式 --> 主程式 --> 渲染程式
-
fontSize傳值:
主程式 --> 渲染程式
程式碼補充:
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 ", }
上述為應用全部原始碼,歡迎指教共同學習~~~!