禹神:一小時快速上手Electron,前端Electron開發教程,筆記。一篇文章入門Electron

一、Electron是什么

簡單的一句話,就是用html+css+js+nodejs+(Native Api)做兼容多個系統(Windows、Linux、Mac)的軟件。

官網解釋如下(有點像繞口令):
Electron是一個使用 JavaScript、HTML 和 CSS 構建桌面應用程序的框架。 嵌入 Chromium 和 Node.js 到 二進制的 Electron 允許您保持一個 JavaScript 代碼代碼庫并創建 在Windows上運行的跨平臺應用 macOS和Linux——不需要本地開發 經驗。
在這里插入圖片描述
在這里插入圖片描述

二、Elemtron流程模型

Electron流程模型圖

三、Electron搭建工程,若成功則輸出123

3.1 準備

可參考Electron官網地址
需要node和npm,先檢測是否安裝。

node -v
npm -v

在這里插入圖片描述

3.2 項目初始化

命令行創建

mkdir my-electron-app && cd my-electron-app
npm init

或者,手動快速創建
在這里插入圖片描述

package.json文件

{"name": "my-electron-app","version": "1.0.0","description": "test Electron","main": "main.js","author": "Bin9153","license": "MIT"
}

有幾條規則需要遵循:

entry point 應為 main.js.
author 與 description 可為任意值,但對于應用打包是必填項。
在這里插入圖片描述

3.3 安裝 Electron

npm install --save-dev electron
//或者
npm install electron -D

3.4 配置并啟動

在 package.json配置文件中的scripts字段下增加一條start命令:

{"scripts": {"start": "electron ."}
}

這一步,完整的package.json

{"name": "my-electron-app","version": "1.0.0","main": "main.js","scripts": {"start": "electron ."},"author": "bin9153","license": "ISC","description": "electron test","dependencies": {"electron": "^31.2.0"}
}

代碼解析:
package代碼解析
創建main.js
在這里插入圖片描述
在main.js里寫入

console.log(123)

在這里插入圖片描述

再運行!

npm start

注意:

  1. 先創建main.js,否則報錯
  2. 如果main.js里沒寫輸出(或其他代碼)則,啟動了運行窗口也不容易看出變化

啟動輸出123
成功輸出123,工程搭建完成。

四、開始制作程序

4.1 案例1:做一個簡易網頁程序

點擊可以查看,browser-window配置項的開發文檔
在main.js里寫入

const {app, BrowserWindow} = require('electron')app.on('ready', () => {//當app準備好后,執行createWindow創建窗口const win = new BrowserWindow({width: 800,//窗口寬度height: 600,//窗口高度autoHideMenuBar: true,//自動隱藏菜單檔alwaysOnTop: true,//置頂x: 0,//窗口位置x坐標y: 0//窗口位置y坐標})//加載一個遠程頁面win.loadURL('https://blog.csdn.net/qq_33650655/article/details/140353815')
})

運行

 npm start

制作一個遠程界面
成功顯示頁面。
頁面成功運行

4.2 案例2:做一個本地程序(不是遠程鏈接頁面,是自己寫的頁面)

4.2.1 是本地程序,所以創建新的頁面

新建pages目錄,創建頁面,這里就像寫前端一樣了。index.html,index.css
在這里插入圖片描述
index.html里

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>這里是index頁面</title>
</head><body>
<h1>這里是index里的標題
</h1>
</body>
</html>

main.js里引入頁面

const {app, BrowserWindow} = require('electron')app.on('ready', () => {//當app準備好后,執行createWindow創建窗口const win = new BrowserWindow({width: 800,//窗口寬度height: 600,//窗口高度autoHideMenuBar: true,//自動隱藏菜單檔alwaysOnTop: true,//置頂})//引入頁面win.loadFile('./pages/index/index.html')})

運行

npm start

4.2.2 解決內容安全策略

有安全提示
在這里插入圖片描述
在index.html里加入,如下代碼,內容安全策略警告提示消失。

//electron 提供的配置 成功運行
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
//electron 提供的配置2 引入js后也會報錯
<meta http-equiv="Content-Security-Policy" content="default-src none">
//視頻教程里的配置 會報錯
<meta http-equiv="Content-Security-Policy" content="default-src 'self';style-src 'self''unsafe-inline';img-src self'data:;">
//我自己寫的組合的配置更全 加了一個script的限制,有事兒后期再改, 剛試了會報錯,可能哪里沒寫對,先記錄在這里
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self';style-src 'self''unsafe-inline';img-src self'data:;">

安全策略代碼詳解

關于CSP的詳細說明:MDN內容安全策略詳解 、Electron安全策略規范

4.2.3 增加多系統的兼容代碼

兼容mac(完善窗口行為)
electron文檔:
關閉所有窗口時退出應用 (Windows & Linux)
如果沒有窗口打開則打開一個窗口 (macOS)
在main.js里寫入兼容各個系統平臺的代碼

const {app, BrowserWindow} = require('electron')function createWindow(){//當app準備好后,執行createWindow創建窗口const win = new BrowserWindow({width: 800,//窗口寬度height: 600,//窗口高度autoHideMenuBar: true,//自動隱藏菜單檔alwaysOnTop: true,//置頂})win.loadFile('./pages/index/index.html')
}
app.on('ready', () => {createWindow()//兼容核心代碼 1app.on('activate', () => {if (BrowserWindow.getAllWindows().length === 0) createWindow()})})//兼容核心代碼 2
app.on('window-all-closed', () => {if (process.platform !== 'darwin') app.quit()
})

代碼解析
在這里插入圖片描述

下面兩句代碼相等

app.on('ready', () => {// 寫核心代碼
})
// 或者
app.whenReady().then(() => {//寫核心代碼
})

4.2.4 配置自動重啟,保存后自動熱更新

npm i nodemon -D

package.json里重寫start

 "start": "nodemon --exec electron ."

重寫start

這樣保存main.js里的內容,就自動熱更新了。
但是更新index.html里的代碼不能熱更新,要加一個nodemon.json,需要手動添加

{"ignore":["node modules","dist"],"restartable":"r","watch":["*.*"],"ext":"html,js,css"
}

增加nodemon.json,
增加nodemon文件和內容
重啟生效

npm start

4.2.5 編寫頁面程序(寫一個應用程序,可以寫入任意文字到hello.text里)

頁面程序要寫在頁面里,那它和主進程的關系如圖
Electron流程模型圖
每個頁面程序通過渲染和主進程通信,主進程根據需求調用Native Api來實現功能。

實際,每個頁面和主程序通信時,需要建個橋梁來管理它們的通信,preload.js(自己創建),來管理實現通信
在這里插入圖片描述
創建preload.js定義橋梁js
創建preloadjs
在main.js中定義preload.js為橋梁
在main.js里定義橋梁

main.js代碼:

const {app, BrowserWindow} = require('electron')
const path = require('path')function createWindow(){//當app準備好后,執行createWindow創建窗口const win = new BrowserWindow({width: 800,//窗口寬度height: 600,//窗口高度autoHideMenuBar: true,//自動隱藏菜單檔alwaysOnTop: true,//置頂webPreferences:{  //在main.js中定義preload.js為橋梁preload:path.resolve(__dirname,'./preload.js')}})//引入頁面win.loadFile('./pages/index/index.html')win.openDevTools()  //自動打開調試窗口console.log("main.js里的main.js")
}app.on('ready', () => {createWindow()//兼容核心代碼1app.on('activate', () => {if (BrowserWindow.getAllWindows().length === 0) createWindow()})})

創建渲染js
在這里插入圖片描述
定義渲染js
定義渲染js
這是自己整理的,整理了前面45分鐘,再這么整理下去,1000字也不夠用。
下面寫代碼不詳細介紹了。會點前端的能懂一半多代碼。
可以看原來的教程 從45分鐘開始看。視頻教程
直接上代碼。

main.js里的代碼

const {app, BrowserWindow,ipcMain} = require('electron')
const path = require('path')
const fs = require('fs')//寫入文件
function writeFile(_, data) {fs.writeFileSync('D:/hello.txt', data)
}
//讀取文件
function readFile() {const res = fs.readFileSync("D:/hello.txt").toString()return res
}function createWindow() {//當app準備好后,執行createWindow創建窗口const win = new BrowserWindow({width: 800,//窗口寬度height: 600,//窗口高度autoHideMenuBar: true,//自動隱藏菜單檔alwaysOnTop: true,//置頂webPreferences: {  //在main.js中定義preload.js為橋梁preload: path.resolve(__dirname, './preload.js')}})ipcMain.on('file-save', writeFile)ipcMain.handle('file-read', readFile)//引入頁面win.loadFile('./pages/index/index.html')win.openDevTools()  //自動打開調試窗口console.log("main.js里的main.js")
}app.on('ready', () => {createWindow()//兼容核心代碼1app.on('activate', () => {if (BrowserWindow.getAllWindows().length === 0) createWindow()})})

preload.js里的代碼

const {contextBridge, ipcRenderer} = require('electron')
contextBridge.exposeInMainWorld('myAPI', {version: process.version,saveFile: (data) => {ipcRenderer.send('file-save', data)},readFile() {return ipcRenderer.invoke('file-read')}
})

render.js里的代碼

const btn1 = document.getElementById("btn1")
const btn2 = document.getElementById("btn2")
const btn3 = document.getElementById("btn3")
const input = document.getElementById("inp")
btn1.onclick = () => {alert(myAPI.version)
}
btn2.onclick = () => {myAPI.saveFile(input.value)
}
btn3.onclick = async() => {const res = await myAPI.readFile()alert(res)
}

html里的代碼

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'"><title>這里是index頁面</title>
</head><body>
<h1>歡迎學習Electron開發!!!</h1>
<button id="btn1">點我</button>
<hr/>
<input type="text" id="inp"/>
<button id="btn2">D盤寫入hello.txt</button>
<hr>
<button id="btn3">讀取hello.txt的內容</button>
</body><script type="text/javascript" src="./render.js"></script>
</html>

目錄結構

在這里插入圖片描述

備注
1.代碼稍微有點不一樣
2.目錄結構也有變化,功能是一樣的

五、打包

5.1 使用electron-builder打包,打包時要訪問github需要修仙術

1.安裝electron-builder:

npm install electron-builder -D

2.在package.json中進行相關配置,具體配置如下:

備注:json文件不支持注釋,使用時請去掉所有注釋。

打包配置圖

package.json里的代碼

{"name": "video-tools","version": "1.0.0","main": "main.js","scripts": {"start": "electron .","build": "electron-builder"},"build": {"appId": "com.atguigu.video","win": {"icon": "./logo.ico","target": [{"target": "nsis","arch": ["x64"]}]},"nsis": {"oneClick": false,"perMachine": true,"allowToChangeInstallationDirectory": true}},"devDependencies": {"electron": "^30.0.0","electron-builder": "^24.13.3"},"author": "寶碼香車","license": "ISC","description": "A video processing program based on Electron"
}

根據視頻操作未能完成打包,這種方式在打包時 訪問github 多次嘗試后,決定放棄

5.2 使用Electron Forge進行打包(使用這種方式打包的)

Electron中文網也推薦使用這種方式。
Electron Forge是從建項目開始配置 的,因為項目已經寫完了,所以從第五步開始。
Electron Forge 從第五步開始的文檔

5.2.1 使用3條命令,完成打包。

1、運行第1條命令

npm install --save-dev @electron-forge/cli

2、運行第2條命令

npx electron-forge import

這時在packgae.json里會增加一些配置。

在package里增加配置
不用管。

3、直接運行第3條命令

npm run make

打包完成。

5.2.2 打包后的位置,在根項目下的out文件里

打包后的文件,在根項目下的out文件夾里

打包后的文件

可運行程序在 my-electron-app\out\make\squirrel.windows\x64

可運行程序

5.2.3 看運行效果,終于完成了。

完成運行效果

5.2.4 出現的bug

1.安裝一次后再打開會報錯,
再次安裝報錯

2.直接刪除軟件,目錄在 C:\Users\Administrator\AppData\Roaming 刪除my_electron_app這個文件夾。然后用360安全衛士清理垃圾。然后重啟即可。

其他bug
1.軟件有卡死的現象
2.還會自動重啟
3.軟件關閉后會自動重啟
4.在輸入框中輸入內容,寫入后可能會卡死,第二次可能無法輸入,但可以讀取。
5.啟動時有點卡

六、總結

1.后面有的bug可能與Electron Forge配置有關。有時間試試,找個解決方案。
2.也有可能與main.js寫法有關。
3.打包時刪除main.js里的 win.openDevTools() //自動打開調試窗口 否則軟件會自動打開調試窗口。
4. 代碼倉庫位置 https://gitee.com/electron_9/my-electron-app

終于完成,雖然有bug,但能運行起來了。后續找個更好的解決方案。

整理不易點贊關注支持寶碼香車

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45537.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45537.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45537.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Resources.Load返回null

Resources.Load返回null 在unity中Resources.Load從Assets下的任意Resources目錄下讀取資源&#xff0c;比如從Assets\Resources下讀取Cube&#xff08;預制體&#xff09;&#xff0c;當然也可以讀取其他資源 代碼為 GameObject prefab Resources.Load<GameObject>(…

微軟Edge瀏覽器深度解析:性能、安全性與特色功能全面評測

一、引言 自Windows 10操作系統推出以來&#xff0c;微軟Edge瀏覽器作為默認的網頁瀏覽器&#xff0c;憑借其現代化的設計和出色的性能表現&#xff0c;逐漸獲得了用戶的認可。本文旨在對Edge瀏覽器進行深入分析&#xff0c;探討其在多個方面的表現。 二、界面與操作體驗 界面…

在 PostgreSQL 里如何處理數據的存儲優化和數據庫備份的效率平衡?

&#x1f345;關注博主&#x1f397;? 帶你暢游技術世界&#xff0c;不錯過每一次成長機會&#xff01;&#x1f4da;領書&#xff1a;PostgreSQL 入門到精通.pdf 文章目錄 在 PostgreSQL 里如何處理數據的存儲優化和數據庫備份的效率平衡&#xff1f;一、數據存儲優化&#x…

HTML表格表單及框架標簽

一.表格標簽 1.<table></table> 創建表格 2.<caption></caption> 表格的標題 3.<tr></tr>Table Row&#xff08;表格行&#xff09; 4.<td></td>Table Data&#xff08;表格數據&#xff09;其中有屬性rowspan"2&quo…

Linux操作系統——數據庫

數據庫 sun solaris gnu 1、分類&#xff1a; 大型 中型 小型 ORACLE MYSQL/MSSQL SQLITE DBII powdb 關系型數據庫 2、名詞&#xff1a; DB 數據庫 select update database DBMS 數據…

Go中的defer看似很簡單,實則一點都不難

Golang 中的 Defer 在Go語言中&#xff0c;defer語句用于將一個函數調用推遲到外圍函數返回之后執行。它常用于確保某些操作在函數結束時一定會執行&#xff0c;例如資源釋放、文件關閉等。 基本語法 defer語句的基本使用方法如下&#xff1a; func main() {defer fmt.Prin…

距離變換 Distance Transformation

以下為該學習地址的學習筆記&#xff1a;Distance transformation in image - Python OpenCV - GeeksforGeeks 其他學習資料&#xff1a;Morphology - Distance Transform 簡介 距離變換是一種用于計算圖像中每個像素與最近的非零像素之間距離的技術。它通常用于圖像分割和物體…

51單片機5(GPIO簡介)

一、序言&#xff1a;不論學習什么單片機&#xff0c;最簡單的外設莫過于I口的高低電平的操作&#xff0c;接下來&#xff0c;我們將給大家介紹一下如何在創建好的工程模板上面&#xff0c;通過控制51單片機的GPIO來使我們的開發板上的LED來點亮。 二、51單片機GPIO介紹&#…

第三節SHELL腳本中的變量與運算(1.1-1.5)

一,腳本中的變量 1,1什么是變量 在編寫程序是,通常會遇到被操作對象不固定的情況我們需要用一串固定的字符來的表示不固定的值,這就是變量存在的根本意義變量的實現原理就是內存存儲單元的一個符合名稱 1,2 變量的命名規則 變量的名稱中只能包含數字,大小寫字母以及下劃線 …

PySide在Qt Designer中使用QTableView 顯示表格數據

在 PySide6 中&#xff0c;可以使用 Qt Model View 架構中的 QTableView 部件來顯示和編輯表格數據。 1、創建ui文件 在Qt Designer中新建QMainWindow&#xff0c;命名為csvShow.ui。QMainWindow上有兩個部件&#xff1a;tableview和btn_exit。 2、使用pyuic工具將ui文件轉換為…

Kafka(四) Consumer消費者

一&#xff0c;基礎知識 1&#xff0c;消費者與消費組 每個消費者都有對應的消費組&#xff0c;不同消費組之間互不影響。 Partition的消息只能被一個消費組中的一個消費者所消費&#xff0c; 但Partition也可能被再平衡分配給新的消費者。 一個Topic的不同Partition會根據分配…

MySQL集群、Redis集群、RabbitMQ集群

一、MySQL集群 1、集群原理 MySQL-MMM 是 Master-Master Replication Manager for MySQL&#xff08;mysql 主主復制管理器&#xff09;的簡稱。腳本&#xff09;。MMM 基于 MySQL Replication 做的擴展架構&#xff0c;主要用來監控 mysql 主主復制并做失敗轉移。其原理是將真…

環境變量在Gradle中的妙用:構建自動化的秘訣

環境變量在Gradle中的妙用&#xff1a;構建自動化的秘訣 在構建自動化的過程中&#xff0c;環境變量扮演著至關重要的角色。它們允許開發者根據不同的運行環境&#xff08;如開發、測試和生產環境&#xff09;來調整配置&#xff0c;而無需修改代碼。Gradle&#xff0c;作為一…

基于Faster R-CNN的安全帽目標檢測

基于Faster R-CNN的安全帽目標檢測項目通常旨在解決工作場所&#xff0c;特別是建筑工地的安全監管問題。這類項目使用計算機視覺技術&#xff0c;特別是深度學習中的Faster R-CNN算法&#xff0c;來自動檢測工人是否正確佩戴了安全帽&#xff0c;從而確保遵守安全規定并減少事…

實驗一:圖像信號的數字化

目錄 一、實驗目的 二、實驗原理 三、實驗內容 四、源程序及結果 源程序&#xff08;python&#xff09;&#xff1a; 結果&#xff1a; 五、結果分析 一、實驗目的 通過本實驗了解圖像的數字化過程&#xff0c;了解數字圖像的數據矩陣表示法。掌握取樣&#xff08;象素個…

用Python爬蟲能實現什么?得到什么?

Python爬蟲是一種強大的工具&#xff0c;可以用來自動化地從互聯網上抓取數據和信息。使用Python實現爬蟲可以達成多種目的&#xff0c;包括但不限于以下幾個方面&#xff1a; 數據收集&#xff1a; 網頁內容抓取&#xff1a;可以抓取網頁上的文本、圖片、視頻等內容。搜索引擎…

Linux 網絡配置與連接

一、網絡配置 1.1 ifconfig 網卡配置查詢 ifconfig #查看所有啟動的網絡接口信息 ifconfig 指定的網卡 #查看指定網絡接口信息 1.2 修改網絡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33 #ens33網絡配置文…

【電源拓撲】反激拓撲

目錄 工作模式 固定頻率 CCM連續電流模式 DCM不連續電流模式 可變頻率 CRM電流臨界模式 反激電源CRM工作模式為什么要跳頻 反激電源應用場景 為什么反激電源功率做不大 電感電流爬升 反激變壓器的限制條件 精通反激電源設計的關鍵-反激電源變壓器設計 反激電源變壓…

MySQL 事務與鎖

事務ACID特性 原子性&#xff1a;事務要么同時成功&#xff0c;要么同時失敗&#xff0c;事務的原子性通過undo log日志保證 一致性&#xff1a;業務代碼要拋出報錯&#xff0c;讓數據庫回滾 隔離性&#xff1a;事務并發執行時&#xff0c;他們內部操作不能互相干擾 持久性&…

Python 讀取esxi上所有主機的設備信息

&#xff08;主要是為了統計所有虛擬機的設備名稱和所屬主機&#xff09; 代碼&#xff1a; from pyVim import connect from pyVmomi import vim import ssldef get_vm_devices(vm):devices []try:if vm.config is not None and hasattr(vm.config, hardware) and hasattr(v…