Electron(01)

Electron

Electron是什么

electron可以使用前端技術開發桌面應用,跨平臺性,開發一套應用,可以打包到三個平臺。

electron結合Chromium(谷歌內核)和 Node.js 和Native Api

當使用 Electron 時,很重要的一點是要理解 Electron 不是一個 Web 瀏覽器。 它允許您使用熟悉的 Web 技術構建功能豐富的桌面應用程序

官網:簡介 | Electron


Electron廣泛應用

使用Electron框架開發的知名軟件。

Visual Studio Code、GithubDesktop、Postman、DockerDesktop...


Electron進程模型

主進程(main.js)。運行在node環境

一個應用只會有一個主進程,負責應用的生命周期、展示原生窗口、執行特殊操作和管理渲染進程。

渲染進程(render.js ),運行在瀏覽器環境

一個應用可以有多個渲染進程,渲染器進程負責展示圖形內容。


快速上手

環境安裝

node環境(v20.13.1)、npm環境(10.5.2)

測試安裝是否成功,按下【win+R】鍵,輸入cmd,打開cmd窗口

輸入:node -v // 顯示node.js版本

? npm -v // 顯示npm版本

npm config set registry https://registry.npmmirror.com/
 npm i electron -D

main.js

main 文件是 Electron 應用的入口。 這個文件控制 主程序 (main process),它運行在 Node.js 環境里,負責控制您應用的生命周期、顯示原生界面、執行特殊操作并管理渲染器進程 (renderer processes)

const { app, BrowserWindow, ipcMain, Notification, Menu } = require('electron/main')
const path = require('node: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
}
const createWindow = () => {const win = new BrowserWindow({width: 1000,height: 800,icon: path.join(__dirname, 'favicon.ico'),title: '簡單網頁',webPreferences: {preload: path.join(__dirname, 'preload.js')}})ipcMain.on('file-save', writeFile)ipcMain.handle('file-read', readFile)//自定義菜單項let menuTemp = [{label: '文件',submenu: [{label: '打開文件',click() {console.log('打開一個具體的文件')}},{ label: '打開文件夾' },{label: '關于',role: 'about'}]},{ label: '編輯' }]//生成自定義菜單let menu = Menu.buildFromTemplate(menuTemp)Menu.setApplicationMenu(menu)win.loadFile('index.html')// 創建并顯示通知const notification = new Notification({title: '主進程通知',body: '恭喜你,學會了求雨之術,風來~雨來~'}).show();// 確保在窗口創建后調用 openDevTools//win.webContents.on('did-finish-load', () => {//  win.webContents.openDevTools();//});// 定時發送時間給渲染進程(每1秒)setInterval(() => {if (win && !win.isDestroyed()) {win.webContents.send('main-time', new Date().toLocaleTimeString());}}, 1000);
}
app.whenReady().then(createWindow)

index.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';" />
</head><body><div id="time">當前時間:加載中...</div><div class="hint">注意:輸入內容,可以保存到d:/hello.txt,點擊讀取,可以讀取該文件內容</div><input id="input" type="text"><button id="btn2">向D盤輸入hello.txt</button><br><br><hr><button id="btn3">讀取D盤hello.txt</button><script type="text/javascript" src="./render.js"></script>
</body></html>

render.js

const timeElement = document.getElementById('time');
const btn2 = document.getElementById('btn2');
const btn3 = document.getElementById('btn3');
const input = document.getElementById('input');btn2.onclick = () => {myAPI.saveFile(input.value)
}btn3.onclick = async () => {let data = await myAPI.readFile()alert(data)
}// 監聽主進程發送的時間消息
myAPI.onMainTime((time) => {timeElement.textContent = `當前時間:${time}`;
});

preload.js

preload.js執行時機:預加載腳本在渲染器加載網頁之前注入

預加載腳本preload.js(中間人),它在渲染進程運行(瀏覽器環境),人家也能訪問一部分的node api。

const { contextBridge, ipcRenderer } = require('electron')contextBridge.exposeInMainWorld('myAPI', {saveFile: (data) => {ipcRenderer.send('file-save', data)},readFile: () => {return ipcRenderer.invoke('file-read')},// 監聽主進程發送的時間消息onMainTime: (callback) => {ipcRenderer.on('main-time', (event, time) => callback(time))}
})

ipc進程通信

remote模塊

Electron 官方已經明確表示,remote?模塊是一個遺留的 API,不建議在新項目中使用。 他們鼓勵開發者遷移到 Context Bridge。

remote?模塊安全風險:?正如之前提到的,remote?模塊允許渲染進程直接訪問主進程的幾乎所有對象,這帶來了嚴重的安全風險。 惡意代碼可能會利用?remote?模塊來執行任意代碼,甚至控制整個應用程序。

替代方案: Context Bridge (結合?ipcRenderer?和?ipcMain) 提供了更安全、更可控的進程間通信方式。


[渲染進程]調用[主進程] 無返回

需求:比如在頁面上向d盤的文件寫內容

主進程 ipcMain.on,寫在app.whenReady().then()中

ipcMain.on('file-save', writeFile)function writeFile(_, data) {fs.writeFileSync('D:/hello.txt', data)
}

ipcRender.send?通過預加載腳本暴露了一個單行的 saveFile函數。

const { contextBridge, ipcRenderer } = require('electron')contextBridge.exposeInMainWorld('myAPI', {saveFile: (data) => {ipcRenderer.send('file-save', data)}})

最后在渲染器進程,也就是HTML頁面就可以使用暴露出來的saveFile方法了

const btn2 = document.getElementById('btn2');
const input = document.getElementById('input');btn2.onclick = ()=> {myAPI.saveFile(input.value)
}

[渲染進程]調用[主進程] 有返回

雙向 IPC 的一個常見應用是從渲染器進程碼調用代主進程模塊并等待結果,更適合請求-響應模式

需求:在頁面上讀取d盤的文件內容,點擊按鈕彈出d盤hello.txt文件內容

主進程 ipcMain.handle,寫在app.whenReady().then()中

ipcMain.handle('file-read', readFile)function readFile() {const res = fs.readFileSync('D:/hello.txt').toString();return res
}

ipcRender.invoke 通過預加載腳本暴露了一個單行的 readFile函數。

const { contextBridge, ipcRenderer } = require('electron')contextBridge.exposeInMainWorld('myAPI', {readFile: () => {return ipcRenderer.invoke('file-read')}})

最后在渲染器進程,也就是HTML頁面就可以使用暴露出來的readFile方法了

const btn3 = document.getElementById('btn3');
btn3.onclick = async () => {let data = await myAPI.readFile()alert(data)
}

[主進程]調用[渲染進程]

需求:頁面顯示當前時間,每1秒更新一次,來自主進程定時推送

主進程:webContents.send? 發送消息

    // 定時發送時間給渲染進程(每1秒)setInterval(() => {if (win && !win.isDestroyed()) {win.webContents.send('main-time', new Date().toLocaleTimeString());}}, 1000);

ipcRenderer.on?預加載腳本監聽主進程消息,暴露出onMainTime函數給渲染進程

callback本質是渲染進程向預加載腳本“注冊”的一個“數據接收器”,讓預加載腳本能把主進程的數據“交給”渲染進程處理。

const { contextBridge, ipcRenderer } = require('electron')contextBridge.exposeInMainWorld('myAPI', {// 監聽主進程發送的時間消息onMainTime: (callback) => {ipcRenderer.on('main-time', (event, time) => callback(time))}
})

渲染進程

渲染進程調用onMainTime時傳遞了一個callback

const timeElement = document.getElementById('time');//監聽主進程發送的時間消息
myAPI.onMainTime((time) => {timeElement.textContent = `當前時間:${time}`;
});

打包應用

electron-builder

需要梯子

安裝打包工具

npm install electron-builder -D

打包應用 electron-builder(做很多自定義的東西)

愉快執行:npm run build,安裝包在dist目錄,74MB,安裝后包含node和chromiun

npm run build

electron-forge

安裝打包工具

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

執行打包

npm run make

執行成功后,默認輸出目錄為out/make,里面會生成平臺對應的分發文件,例如:

  • Windowsout/make/squirrel.windows/x64/my-app-1.0.0 Setup.exe(安裝包)、my-app-1.0.0-full.nupkg(更新包)。
  • macOSout/make/dmg/my-app-1.0.0.dmg(磁盤鏡像)、out/make/zip/my-app-1.0.0.zip(壓縮包)。
  • Linuxout/make/deb/x64/my-app_1.0.0_amd64.deb(Debian包)、out/make/rpm/x64/my-app-1.0.0-1.x86_64.rpm(RPM包)。

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

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

相關文章

Kafka 攔截器深度剖析:原理、配置與實踐

引言 在構建高可用、可擴展的消息系統時&#xff0c;Kafka以其卓越的性能和穩定性成為眾多企業的首選。而Kafka攔截器作為Kafka生態中強大且靈活的功能組件&#xff0c;能夠在消息的生產和消費過程中實現自定義邏輯的注入&#xff0c;為消息處理流程帶來極大的擴展性和可控性。…

Flutter 與原生技術(Objective-C/Swift,java)的關系

在 iOS 開發中&#xff0c;Flutter 與原生技術&#xff08;Objective-C/Swift&#xff09;的關系 一、技術定位與核心差異 Flutter 語言&#xff1a;使用Dart 語言開發&#xff0c;通過 AOT&#xff08;提前編譯&#xff09;將代碼轉換為原生 ARM 指令&#xff0c;無需依賴 iOS…

最新期刊影響因子,基本包含全部期刊

原文鏈接&#xff1a;2024年期刊最新影響因子&#xff08;IF&#xff09; 2024年期刊最新影響因子&#xff08;IF&#xff09; BioinfoR生信筆記 &#xff0c;注于分享生物信息學相關知識和R語言繪圖教程。

java 設計模式_行為型_14策略模式

14.策略模式 策略模式作為一種軟件設計模式&#xff0c;指對象有某個行為&#xff0c;但是在不同的場景中&#xff0c;該行為有不同的實現算法。 策略模式把這些算法&#xff0c;都抽取出來&#xff0c;組成一個一個的類&#xff0c;可以任意的替換&#xff0c;大大降低了代碼…

【AI Study】第四天,Pandas(9)- 進階主題

文章概要 本文詳細介紹 Pandas 的進階主題&#xff0c;包括&#xff1a; 自定義函數高級索引數據導出實際應用示例 自定義函數 函數應用 # 基本函數應用 def calculate_bonus(salary, performance):"""計算獎金Args:salary (float): 基本工資performance (…

Boost dlib opencv vs2022 C++ 源碼安裝集成配置

?在進行人臉檢測開發時候出現 E1696: 無法打開源文件 "dlib/image_processing/frontal_face_detector.h 解決方案 1, 下載boost 需要:https://www.boost.org/ 或github git clone --recursive https://gitee.com/luozhonghua/boost.git 記住一定要完整版源碼…

rest_framework permission_classes 無效的解決方法

寫了一個特別簡單的view&#xff1a; csrf_exempt login_required() authentication_classes([TokenAuthentication]) permission_classes([IsAdminUser, IsAuthenticated]) def department_management_view(request):if request.method POST:department_name request.POST.…

Windows 體系對比 + 嵌入式開發全流程拆解

一、操作系統層級對比&#xff1a;Windows 家族 vs Linux 家族 角色Windows 體系Linux 體系本質核心內核Windows NT KernelLinux Kernel操作系統引擎&#xff08;管理CPU/內存/硬件&#xff09;完整操作系統Windows 11 Home/ProUbuntu / Debian / CentOS內核 界面 軟件 驅動…

C# 實現 gRPC高級通信框架簡單實現

1. 前言 gRPC&#xff08;Google Remote Procedure Call&#xff09;是一個高性能、開源和通用的RPC框架&#xff0c;由Google主導開發。它支持多種編程語言&#xff0c;并廣泛用于構建分布式應用程序和服務。gRPC基于HTTP/2協議&#xff0c;支持雙向流、請求-響應和多請求-多…

將項目推到Github

前提條件 需要安裝GIT需要注冊GitHub賬號 步驟 首先我們需要登錄我們的GITHUB賬號&#xff0c;然后點擊新建存儲庫 然后起一個名字&#xff0c;設置一些私有公開即可 創建完成之后&#xff0c;這里有可以遠程推送的命令 后面就直接輸出命令即可 之后推送即可 git push orig…

K8S 專欄 —— namespace和Label篇

文章目錄 namespace創建namespacenamespace使用默認namespaceLabel添加Label查詢Labelnamespace 命名空間是一種用于在 kubernetes 集群中劃分資源的虛擬化手段,每個資源都屬于一個命名空間,使得多個團隊或應用可以在同一個集群中獨立運行,避免資源沖突。 創建namespace y…

44.第二階段x64游戲實戰-封包-分析掉落物列表id存放位置

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 本次游戲沒法給 內容參考于&#xff1a;微塵網絡安全 上一個內容&#xff1a;43.第二階段x64游戲實戰-封包-代碼實現獲取包裹物品 之前的內容找到了掉落物的…

匯編語言期末快速過手筆記

一、計算機系統組成 計算機系統組成&#xff1a;由硬件系統和軟件系統組成 硬件系統&#xff1a;CPU、存儲器、輸入/輸出設備等物理部件軟件系統&#xff1a;操作系統、各種語言、系統軟件和應用軟件 匯編語言分類 屬于低級語言&#xff08;直接面向硬件&#xff09;與高級語言…

C++相比于C語言增加了哪些概念?

C相比于C語言增加了哪些概念&#xff1f; 作者將狼才鯨創建日期2025-06-17 CSDN閱讀地址&#xff1a;C相比于C語言增加了哪些概念&#xff1f;Gitee源碼目錄&#xff1a;qemu/demo_代碼示例/02_C_Class 目標受眾&#xff1a;熟悉C語言&#xff0c;對C完全不了解&#xff0c;但…

HarmonyOS5 分布式測試:斷網情況支付場景異常恢復驗證

以下是針對HarmonyOS 5分布式事務在斷網支付場景下的異常恢復驗證全流程方案&#xff0c;綜合關鍵技術與測試策略&#xff1a; 一、核心事務機制驗證 ?兩階段提交&#xff08;2PC&#xff09;協議? 模擬支付流程中網絡中斷&#xff0c;驗證事務協調者能否正確處理預提交與回滾…

【狂飆AGI】第5課:前沿技術-文生圖(系列1)

目錄 &#xff08;一&#xff09;繪畫本質&#xff08;二&#xff09;國內外AI轉繪展&#xff08;三&#xff09;創作思路&#xff08;四&#xff09;美學理論&#xff08;1&#xff09;不可能美學&#xff08;2&#xff09;趨無限美學&#xff08;3&#xff09;反物理美學&…

發那科A06B-6290-H124 伺服驅動器

?FANUC A06B-6290-H124 伺服驅動器核心性能解析? ?一、核心控制能力? ?多模式精密控制? 位置控制?&#xff1a;支持高精度旋轉角度/直線位移調節&#xff08;分辨率達脈沖級&#xff09;&#xff0c;適用于數控機床定位&#xff08;誤差0.01mm級&#xff09;和機器人軌…

Spring Boot 項目啟動優化

Spring Boot 項目啟動優化是一個非常重要的話題&#xff0c;尤其是在微服務和云原生環境下&#xff0c;快速啟動意味著更快的部署、更高效的彈性伸縮和更好的開發體驗。 下面我將從分析診斷、優化策略和終極方案三個層面&#xff0c;為你提供一個全面、可操作的優化指南。 一、…

「爬取豆瓣Top250電影的中文名稱」數據采集、網絡爬蟲

- 第 108 篇 - Date: 2025 - 06 - 16 Author: 鄭龍浩&#xff08;仟墨&#xff09; 文章目錄 **任務&#xff1a;爬取豆瓣Tap250電影的中文名稱****代碼****實現效果** 任務&#xff1a;爬取豆瓣Tap250電影的中文名稱 代碼 # 豆瓣前Tap 250 import requests from bs4 import…

MySQL 多表查詢、事務

1.多表查詢的分類 1.1 內連接 在 MySQL 中&#xff0c;內連接&#xff08;INNER JOIN&#xff09;返回的是兩個表中滿足連接條件的記錄的交集。這個“交集”不是指整個表&#xff0c;而是指符合連接條件的行組合&#xff0c;也就是A表和B表中滿足我們使用on指定條件的記錄。圖…