【Electron】Electron入門實現

Electron 學習筆記

Electron 是一個開源框架,允許開發者使用網頁技術(HTML、CSS 和 JavaScript)來構建跨平臺的桌面應用程序。它由 GitHub 開發并維護,最初是為了支持開發 Atom 編輯器。Electron 結合了 Chromium(用于呈現網頁內容)和 Node.js(用于與操作系統交互),因此開發者可以利用大量現有的網頁開發技術和工具來構建桌面應用。

Electron 的主要特點有:

  1. 跨平臺支持Electron 應用可以運行在 WindowsmacOSLinux 系統上。
  2. 使用網頁技術:開發者可以使用熟悉的 HTMLCSSJavaScript 來創建應用程序的用戶界面。
  3. 與操作系統交互:通過 Node.jsElectron 應用可以與底層操作系統進行交互,執行文件系統操作、網絡請求等。
  4. 自動更新Electron 提供了自動更新的功能,可以輕松地發布和分發應用的更新版本。
  5. 打包和發布Electron 提供工具將應用程序打包成獨立的可執行文件,以便于分發。

0.前提條件

在使用 Electron 進行開發之前,需要安裝 node.js,使用如下命令進行檢查。

node -v
npm -v

在這里插入圖片描述

注意 因為 ElectronNode.js 嵌入到其二進制文件中,因此應用運行時的 Node.js 版本與你系統中運行的 Node.js 版本無關。

1.Electron 應用程序的創建

1.1 使用腳手架

Electron 應用程序遵循與其他 Node.js 項目相同的結構,首先創建一個文件夾并初始化 npm 包。

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

在這里插入圖片描述

npm init 初始化命令會設置項目的相關值,生成一個 package.json 的配置文件,但在 electron.js 項目中有以下兩點需要注意:

  1. entry point 是項目的入口文件,這個文件必須存在。
  2. authordescription 可以任意設置,但對于 electron 應用的打包來說,是必填項。

因此,實際的 package.json 應該是如下的內容:

{"name": "my-electron-app","version": "1.0.0","description": "this is a electron demo.","main": "main.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"author": "euansu","license": "ISC"
}

然后,使用如下命令,將 electron 包安裝到應用的開發依賴中。

npm install --save-dev electron
# 過程中安裝 electron 可能會失敗,執行如下兩行命令
npm install -g cnpm --registry=https://registry.npmmirror.com
cnpm install --save-dev electron

1.2 運行主進程

Electron 配置了入口文件,這個文件控制了主進程,,它運行在一個完整的 Node.js 環境中,負責控制您應用的生命周期,顯示原生界面,執行特殊操作并管理渲染器進程。

這里首先是創建入口文件,內容如下所示:

// 引入electron應用和瀏覽器窗口
const { app, BrowserWindow } = require('electron');// 創建瀏覽器窗口
const createWindow = () => {// 瀏覽器窗口實例const mainWindow = new BrowserWindow({width: 600,height: 400,title: 'EuanSu的第一個Electron應用',autoHideMenuBar: true});// 加載頁面// mainWindow.loadURL('http://www.baidu.com')// 加載本地文件mainWindow.loadFile('index.html');
};// 當app準備好的時候,調用創建窗口函數
// 在 Electron 中,只有在 app 模塊的 ready 事件被激發后才能創建瀏覽器窗口。
app.on('ready', () => {createWindow();
});// 當窗口關閉的時候,退出electron應用
app.on('window-all-closed', () => app.quit());

簡單編寫一個 html 文件,內容如下所示:

<h1>Hello electron!</h1>

其次,需要配置 script 操作,如下所示,修改 package.json 文件的 scripts 內容。

"scripts": {"test": "echo \"Error: no test specified\" && exit 1","start": "electron ."
},

配置完成后,在終端環境,執行 npm start 啟動 electron 應用。

npm start

在這里插入圖片描述

出現一個應用程序的窗口,內容如下所示:

在這里插入圖片描述

1.3 管理窗口的聲明周期

應用程序的窗口在不同的操作系統下有不同的行為,Electron 將在 app 中實現這些行為的責任交給開發者來實現,也即開發者可以使用 進程 全局的 platform 屬性來專門為某些操作系統運行代碼。

1.3.1 關閉所有窗口時退出應用(Windows & Linux

WindowsLinux 操作系統上,關閉所有窗口通常會完全退出一個應用程序。

使用 app.on 監聽當前是否處于 window-all-closed(所有窗口被關閉)場景,如果用戶不是在 macOS 上運行程序,則調用 app.quit()

app.on('window-all-closed', () => {if (process.platform !== 'darwin') app.quit()
})
1.3.2 如果沒有窗口打開則打開一個窗口(macOS

LinuxWindows 應用在沒有窗口打開的場景,認為應用是退出狀態。macOS應用通常在沒有打開任何窗口的情況下也繼續運行,并且在沒有窗口可用的情況下激活應用時會打開新的窗口。

為了實現這一特性,監聽 app 模塊的 activate 事件,如果沒有任何應用窗口是打開的,則調用 createWindow() 方法。

// app.whenReady() 等同于 app.on('ready',()=>{})
app.whenReady().then(() => {createWindow()app.on('activate', () => {if (BrowserWindow.getAllWindows().length === 0) createWindow()})
})

1.4 通過預加載腳本從渲染器訪問 Node.js

實現將 Node.jsElectron 的版本號以及以來信息輸出到 Electron 應用上。

這里以 Chromium 多進程架構做示范,當 Electron 應用主進程處于 read 狀態,應該做的是頁面的展示,而不是獲取 Node.js 以及相關的依賴信息,創建一個子進程,獲取對應的依賴信息,當主進程處于 ready 狀態,只需要考慮頁面的加載即可。

創建一個名為 preload.js(預加載)JavaScript 文件,內容如下:


window.addEventListener('DOMContentLoaded', () => {const replaceText = (selector, text) => {const element = document.getElementById(selector)if (element) element.innerText = text}for (const dependency of ['chrome', 'node', 'electron']) {replaceText(`${dependency}-version`, process.versions[dependency])}
})

如上代碼訪問 Node.jsprocess.version 對象,并運行一個基本的 replaceText 輔助函數將版本號插入到 HTML 文件中。

main.js 文件中使用 BrowserWindow 構造器加載 preload.js 文件。

const { app, BrowserWindow } = require('electron')
// 在你文件頂部導入 Node.js 的 path 模塊
const path = require('node:path')// 修改已有的 createWindow() 方法
const createWindow = () => {const mainWindow = new BrowserWindow({width: 800,height: 600,webPreferences: {preload: path.join(__dirname, 'preload.js')}})mainWindow.loadFile('index.html')
}
// ...

以上代碼有兩個 Node.js 的相關內容:

  • __dirname 字符串指向當前正在執行腳本的路徑,也即當前目錄。
  • path.join 將多個路徑連接在一起,創建一個符合不同操作系統的路徑字符串。

創建 index.html,內容如下:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP --><meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'"><title>Hello World!</title></head><body><h1>Hello World!</h1>We are using Node.js <span id="node-version"></span>,Chromium <span id="chrome-version"></span>,and Electron <span id="electron-version"></span>.</body>
</html>

啟動 Electron 應用。

npm start

出現一個如下所示的窗口內容:

在這里插入圖片描述

2.打包并分發 Electron 應用程序

  1. electron-builder 添加到應用的開發依賴中,

    cnpm install --save-dev electron-builder
    
  2. 修改 package.json 項目配置文件,主要修改的內容如下所示:

      
    // 增加build配置
    "build": {"appId": "com.euansu.electron_example", // 應用程序的唯一標識符"productName": "electron_example", // 應用名稱"directories": {"output": "release" //打包輸出的目錄},"win": {"target": [{"target": "nsis", // 指定使用nsis作為安裝程序格式"arch": ["x64" // 生成 64 位按轉包]}]},"nsis":{"oneClick": false, // 安裝程序顯示安裝向導界面"allowToChangeInstallationDirectory": true // 允許用戶選擇安裝目錄}}
    
  3. 執行如下腳本,打包 Electron 應用。

    npm run build
    

    在這里插入圖片描述

    打包完成后,在 release 目錄下能找到輸出的程序。

    在這里插入圖片描述

  4. 安裝測試。

    在這里插入圖片描述

    安裝完成后能夠正常運行。

    在這里插入圖片描述

3.參考鏈接

[1] Electron 快速入門 https://www.electronjs.org/zh/docs/latest/tutorial/quick-start

[2] BrowserWindow官方文檔 https://www.electronjs.org/zh/docs/latest/api/browser-window

[3] Electron 流程模型 https://www.electronjs.org/zh/docs/latest/tutorial/process-model

[4] electron-build 官方文檔 https://www.electron.build/

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

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

相關文章

密碼學及其應用 —— 對稱加密技術

1. 對稱加密、流加密和塊加密 1.1 對稱加密 對稱加密&#xff08;也稱為密鑰加密&#xff09;是一種加密方式&#xff0c;其中加密和解密使用相同的密鑰。這種加密方法基于二進制層面的操作&#xff0c;如XOR&#xff08;異或&#xff09;、SHIFT&#xff08;位移&#xff09;…

Redis Stream Redisson Stream

目錄 一、Redis Stream1.1 場景1&#xff1a;多個客戶端可以同時接收到消息1.1.1 XADD - 向stream添加Entry&#xff08;發消息 &#xff09;1.1.2 XREAD - 從stream中讀取Entry&#xff08;收消息&#xff09;1.1.3 XRANGE - 從stream指定區間讀取Entry&#xff08;收消息&…

【DevExpress】WPF DevExpressMVVM 24.1版本開發指南

DevExpressMVVM WPF 環境安裝 前言重要Bug&#xff08;必看&#xff09;環境安裝控件目錄Theme 主題LoginWindow 登陸窗口INavigationService 導航服務DockLayout Dock類型的畫面布局TreeView 樹狀列表注意引用類型的時候ImageSource是PresentationCore程序集的博主找了好久&am…

[筆記] keytool 導入服務器證書和證書私鑰

背景 我當前手頭已有一個服務器證書和對應的私鑰&#xff0c;現在需要轉換為 Java KeyStore 格式使用&#xff0c;找了一大圈才發現 keytool 無法直接導入服務器證書和私鑰&#xff0c;當然證書可以直接導入&#xff0c;但是私鑰是無法直接導入。找了一大圈發現可以先將服務器…

LeetCode題解:1669. 合并兩個鏈表,JavaScript,詳細注釋

原題鏈接&#xff1a; https://leetcode.cn/problems/merge-in-between-linked-lists/ 解題思路&#xff1a; 注意該題傳入的a和b是鏈表的索引&#xff0c;而不是節點的值先遍歷list1&#xff0c;找到a-1和b1節點將a-1的next指向list2的頭節點在將list2的尾節點的next指向b1節…

Navicat 外網連接 mysql (1、通過SSH方式內網訪問 2、對外開放3306端口)

1、通過SSH方式內網訪問 直接常規方式使用IP、賬號密碼連接&#xff0c;失敗 SSH方式&#xff1a; 常規 選項卡中&#xff1a;localhost錄入數據庫賬號密碼 SSH 選項卡中&#xff1a;勾選使用SSH&#xff0c;輸入服務器IP、賬號、密碼 如果出現該錯誤&#xff0c;可能是服務器…

計算機網絡重點名詞解釋整理

名詞解釋 GPTVersion 一、網絡協議 網絡協議 數據交換的規則 組成&#xff1a;語義、語法、定時 二、DHCP DHCP 動態規劃主機配置協議 作用&#xff1a;讓計算機自動獲取IP地址 特點&#xff1a;即插即用&#xff0c;不需要手動設置 三、信號的基本調制方法以及定義 …

Windows下activemq開啟jmx

1.activemq版本信息 activemq&#xff1a;apache-activemq-5.18.4 2.Windows下activemq開啟jmx 1.進入activemq conf目錄&#xff0c;備份activemq.xml文件 2.編輯activemq.xml文件&#xff0c;在broker節點增加useJmx"true" <broker xmlns"http://active…

C++循環隊列 自定義queue

原理解析 看main部分的注釋&#xff0c;對照著函數&#xff0c;應該能看懂。 #include <iostream> class Queue {public:static constexpr int MAX_SIZE 5;int items[MAX_SIZE];int front, rear;Queue() : front(-1), rear(-1) {}void enqueue(int value) {if ((rear …

理解 Vue.js 中的 immediate: true

理解 Vue.js 中的 immediate: true 在使用 Vue.js 時&#xff0c;監聽器 (watchers) 是一種非常重要的工具&#xff0c;它允許我們觀察和響應數據的變化。在定義監聽器時&#xff0c;我們通常會在組件的 watch 選項中添加相關配置。immediate: true 是其中的一個配置選項。本文…

無線通訊幾種常規天線類別簡介

天線對于無線模塊來說至關重要&#xff0c;合適的天線可以優化通信網絡&#xff0c;增加其通信的范圍和可靠性。天線的選型對最后的模塊通信影響很大&#xff0c;不合適的天線會導致通信質量下降。針對不同的市場應用&#xff0c;天線的材質、安置方式、性能也大不一樣。下面簡…

近期計算機領域的熱點技術

隨著科技的飛速發展&#xff0c;計算機領域的新技術、新趨勢層出不窮。本文將探討近期計算機領域的幾個熱點技術趨勢&#xff0c;并對它們進行簡要的分析和展望。 一、人工智能與機器學習 人工智能&#xff08;AI&#xff09;和機器學習&#xff08;ML&#xff09;是近年來計算…

基于Vue 3.x與TypeScript的PPTIST本地部署與無公網IP遠程演示文稿

文章目錄 前言1. 本地安裝PPTist2. PPTist 使用介紹3. 安裝Cpolar內網穿透4. 配置公網地址5. 配置固定公網地址 前言 本文主要介紹如何在Windows系統環境本地部署開源在線演示文稿應用PPTist&#xff0c;并結合cpolar內網穿透工具實現隨時隨地遠程訪問與使用該項目。 PPTist …

[gpt胡說八道篇] 使用Docker快速啟動Doris

Docker 是一種輕量級的虛擬化技術&#xff0c;我們可以利用 Docker 快速的在本地啟動一個 Doris 的實例&#xff0c;方便進行開發和測試。下面我們來看一下如何操作。 1. 拉取 Docker 鏡像 首先&#xff0c;我們需要從 Docker Hub 上拉取 Doris 的鏡像。打開終端&#xff0c;輸…

Qt Qvariant

QVariant 是 Qt 框架中的一個非常強大的類&#xff0c;它用于存儲各種不同類型的數據&#xff0c;并提供了一種統一的方式來處理這些數據。QVariant 可以存儲大多數基本數據類型&#xff0c;如整數、浮點數、字符串、日期時間等&#xff0c;以及更復雜的數據類型&#xff0c;如…

ChatGPT的原理可以通俗易懂地介紹

ChatGPT的原理可以通俗易懂地介紹如下&#xff1a; 基礎架構&#xff1a; ChatGPT基于OpenAI的GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型&#xff0c;尤其是GPT-3的架構進行構建。GPT模型是一種基于Transformer架構的預訓練語言模型&#xff0c;特別…

基于STM32的智能水質監測系統

目錄 引言環境準備智能水質監測系統基礎代碼實現&#xff1a;實現智能水質監測系統 4.1 數據采集模塊4.2 數據處理與分析4.3 控制系統實現4.4 用戶界面與數據可視化應用場景&#xff1a;水質管理與優化問題解決方案與優化收尾與總結 1. 引言 智能水質監測系統通過使用STM32嵌…

RISC-V知識總結 —— 向量(擴展)指令集

資源1:晏明 - RISC-V向量擴展指令架構及LLVM自動向量化支持 - 202112118 - 第13屆開源開發工具大會&#xff08;OSDTConf2021&#xff09;_嗶哩嗶哩_bilibili資源2:張先軼 - 基于RISC-V向量指令集優化基礎計算軟件生態【第12屆開源開發工具大會&#xff08;OSDT2020&#xff09…

設計模式(實際項目)-狀態機模式

需求背景&#xff1a;存在狀態流轉的預約單 一.數據庫設計 CREATE TABLE appointment (id bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 主鍵id,appoint_type int(11) NOT NULL COMMENT 預約類型(0:線下查房...),appoint_user_id bigint(20) NOT NULL COMMENT 預約人…

研導智能科技——AI輔助科研產品開發

人工智能&#xff08;AI&#xff09;技術的飛速發展為科研領域帶來了革命性的變化。本公司致力于開發基于人工智能的科研輔助產品&#xff0c;旨在通過智能化手段提高科研人員的工作效率和研究質量。目前&#xff0c;我們成功開發了研導學術平臺&#xff08;www.zhiyanxueshu.c…