【Electron入門】進程環境和隔離

目錄

一、主進程和渲染進程

1、主進程(main)

2、渲染進程(renderer)

二、預加載腳本

三、沙盒化

為單個進程禁用沙盒

全局啟用沙盒

四、環境訪問權限控制:contextIsolation和nodeIntegration

1、contextIsolation

🌰啟用contextIsolation:true時(默認推薦做法)

🌰不啟用contextIsolation:false時

2、nodeIntegration

🌰 如果啟用nodeIntegration: true(不推薦)

🌰如果不啟用,我們應該如何借助Node.js的功能呢?


Electron可以簡單理解為一個桌面應用程序的“殼”,內里還是遵循瀏覽器的行為,加載網頁進行渲染(可以是本地、也可以是遠程網頁

一、主進程和渲染進程

Electron的架構其實類似現代瀏覽器,為了管理應用程序窗口中不同的頁面,每個標簽頁在自己的進程中渲染,?從而限制了一個網頁上的有誤或惡意代碼可能導致的對整個應用程序造成的傷害。

在Electron中,我們可控制的兩類進程為:主進程渲染進程

1、主進程(main)

1?? 運行環境:node.js,具有?require?模塊和使用所有 Node.js API

2?? 職責:

  • 窗口管理:創建 / 銷毀窗口實例BrowserWindow,其相當于一個小的EventEmitter,窗口將在單獨的渲染器進程中加載一個網頁。窗口中的webContents 代表的是 渲染進程 內部的網頁內容(Web 頁面),可以執行向渲染進程通信、網頁內容生命周期監聽、訪問/控制devtools
// main.js
const { BrowserWindow } = require('electron')const win = new BrowserWindow({ width: 800, height: 1500 })
win.loadURL('https://github.com')const contents = win.webContents
console.log(contents)
  • 應用程序的生命周期:監聽app生命周期、做相應處理
// quitting the app when no windows are open on non-macOS platforms
app.on('window-all-closed', () => {if (process.platform !== 'darwin') app.quit()
})
  • 調用api與操作系統交互:Electron 有著多種控制原生桌面功能的模塊,例如菜單、對話框以及托盤圖標。下面舉個例子🌰,創建應用菜單
const { app, Menu, BrowserWindow } = require('electron');app.whenReady().then(() => {const win = new BrowserWindow({width: 800,height: 600,webPreferences: {nodeIntegration: true}});win.loadURL('https://example.com');// 創建菜單templateconst menuTemplate = [{label: '文件',submenu: [{ label: '打開文件', click: () => console.log('打開文件') },{ type: 'separator' }, // 分割線{ label: '退出', role: 'quit' }]},{label: '編輯',submenu: [{ label: '撤銷', role: 'undo' },{ label: '重做', role: 'redo' },{ type: 'separator' },{ label: '剪切', role: 'cut' },{ label: '復制', role: 'copy' },{ label: '粘貼', role: 'paste' }]}];// 設置應用菜單const menu = Menu.buildFromTemplate(menuTemplate); //從模版設置菜單實例Menu.setApplicationMenu(menu);  // 放入應用菜單
});

2、渲染進程(renderer)

1?? 運行環境:渲染器負責?渲染?網頁內容。 所以實際上,運行于渲染器進程中的代碼是須遵照網頁web標準的。?

二、預加載腳本

由于主進程和渲染進程的運行環境完全不同,且默認情況下,二者無權直接訪問互相之間的環境。

所以出現了預加載腳本preload.js作為環境橋梁,它包含了那些執行于渲染器進程中,且先于網頁內容開始加載的代碼,與瀏覽器共享一個全局window接口?。 這些腳本雖運行于渲染器的環境中,卻因能訪問 Node.js API 而擁有了更多的權限。

preload.js可以部分暴露一些api給對方進程、可以作為通信中轉站等等。

三、沙盒化

當 Electron 中的渲染進程被沙盒化時,它們的行為與常規 Chrome 渲染器一樣。 一個沙盒化的渲染器不會有一個 Node.js 環境。

附屬于沙盒化的渲染進程的 preload 腳本中仍可使用一部分以 Polyfill 形式實現的 Node.js API。

為單個進程禁用沙盒

app.whenReady().then(() => {const win = new BrowserWindow({webPreferences: {sandbox: false}})win.loadURL('https://google.com')
})

全局啟用沙盒

app.enableSandbox :注意,此 API 必須在應用的?ready?事件之前調用

app.enableSandbox()
app.whenReady().then(() => }// 因為調用了app.enableSandbox(),所以任何sandbox:false的調用都會被覆蓋。const win = new BrowserWindow()win.loadURL('https://google.com')
})

四、環境訪問權限控制:contextIsolation和nodeIntegration

在創建一個browserWindow實例的時候,會配置webPreferences中的字段。

其中有兩個字段與渲染進程的訪問權限密切相關:contextIsolation 和 nodeIntegration

1、contextIsolation
  • 控制 window 對象是否在獨立的 JavaScript 上下文中運行。
  • 默認值:true
  • 如果為true,代表渲染進程在獨立的js上下文中。因此preload.js、第三方庫都不能直接修改渲染進程中的window全局對象;如果為false,preload.js可以直接通過修改window屬性傳遞值

那么不同設置下,如何借助預加載腳本讓主進程與渲染進程通信呢?

🌰啟用contextIsolation:true時(默認推薦做法)

main.js

const { BrowserWindow } = require('electron');
const win = new BrowserWindow({webPreferences: {contextIsolation: true,  // 開啟上下文隔離preload: 'preload.js'}
});

preload.js:利用exposeInMainWorld將屬性掛在window對象中

const { contextBridge } = require('electron');contextBridge.exposeInMainWorld('myAPI', {sayHello: () => console.log('Hello!')
});

renderer.js

console.log(window.myAPI.sayHello()); // ? "Hello!"
🌰不啟用contextIsolation:false時

preload.js:可直接篡改window對象

window.myApi= {sayHello: () => console.log('Hello!')
};

2、nodeIntegration
  • 控制是否可以在渲染進程中直接使用Node.js API(如fs、path、require等語法和api)
  • 默認值:false,無法直接使用node環境
🌰 如果啟用nodeIntegration: true(不推薦)

渲染進程中的js文件

// 渲染進程 index.html
<script>const fs = require('fs');fs.writeFileSync('test.txt', 'Hello, Electron!');
</script>
🌰如果不啟用,我們應該如何借助Node.js的功能呢?

通過【 預加載腳本】執行ipcRenderer通信,發送至主進程處理

?preload.js

// preload.js
const { contextBridge, ipcRenderer } = require('electron');contextBridge.exposeInMainWorld('electronAPI', {sendTitle: (title) => ipcRenderer.send('set-title', title),readFile : (filePath) => ipcRenderer.invoke('read-file', filePath)
});

main.js的利用ipcMain接受處理函數

const { app, BrowserWindow, ipcMain } = require('electron/main')
const path = require('node:path')
const fs = require('fs').promises;function createWindow () {const mainWindow = new BrowserWindow({webPreferences: {preload: path.join(__dirname, 'preload.js')}})// send 'sendTitle'方法的接收器ipcMain.on('set-title', (event, title) => {//通過event.sender獲取網頁內容對象const webContents = event.sender// fromWebContents解析const win = BrowserWindow.fromWebContents(webContents)win.setTitle(title)})// invoke 'readFile'方法的處理器ipcMain.handle('read-file', async (_, filePath) => {try {const data = await fs.readFile(filePath, 'utf-8');return { success: true, data };} catch (error) {return { success: false, error: error.message };}});mainWindow.loadFile('index.html')
}app.whenReady().then(() => {createWindow()app.on('activate', function () {if (BrowserWindow.getAllWindows().length === 0) createWindow()})
})app.on('window-all-closed', function () {if (process.platform !== 'darwin') app.quit()
})

??注意:send + on和invoke + handle兩種通信方法的區別

?send + on單向通信,單向發送->單邊處理

invoke + handle雙向通信,發送者發送信息 -> 接收者理后可return一個返回值 -> 發送者接收到返回值的Promise對象,可針對返回值再處理

🌟推薦實踐:

啟用 sandbox: true(沙箱模式)進一步增強安全性

const win = new BrowserWindow({webPreferences: {contextIsolation: true, (默認,無需特別設置)nodeIntegration: false,(默認,無需特別設置)preload: 'preload.js',sandbox: true}
});

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

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

相關文章

如何看待 Kaiming He 最新提出的 Fractal Generative Models ?

何愷明團隊提出的分形生成模型(Fractal Generative Models) 引發了廣泛關注,其核心思想是通過遞歸調用生成模型模塊構建自相似結構,類似數學中的分形概念(如雪花結構),從而高效生成高分辨率數據(如圖像)。 Fractal Generative Models即分形生成模型,是一種新型的生成…

Debian系統終端輸入ifconfig報錯

報錯 bash: ifconfig: command not found 原因 Debian 上默認不安裝 ifconfig 軟件包。這是因為 ifconfig 已被棄用&#xff0c;取而代之的是新的 ip 命令。該 ip 命令現在負責修改或顯示路由、網絡設備、接口和隧道 如果仍然想使用舊的 ifconfig 命令&#xff0c;則必須顯式…

【NLP 27、文本分類任務 —— 傳統機器學習算法】

不要抓著枯葉哭泣&#xff0c;你要等待初春的新芽 —— 25.1.23 一、文本分類任務 定義&#xff1a;預先設定好一個文本類別集合&#xff0c;對于一篇文本&#xff0c;預測其所屬的類別 例如&#xff1a; 情感分析&#xff1a; 這家飯店太難吃了 —> 正類 …

Lumoz Chain正式上線:AI 時代的新算力破局者

新的敘事和技術突破永遠是推動行業前行的核心動力。當下&#xff0c;AI Agent無疑是最炙手可熱的賽道之一。 當加密世界將目光投向AI領域時&#xff0c;大多數項目仍停留在以AI為工具或應用場景的層面&#xff0c;試圖通過集成AI模型或優化鏈上功能來吸引用戶。然而&#xff0c…

Python - Python連接數據庫

Python的標準數據庫接口為&#xff1a;Python DB-API&#xff0c;Python DB-API為開發人員提供了數據庫應用編程接口。 PyMySQL 是在 Python3.x 版本中用于連接 MySQL 服務器的一個實現庫&#xff0c;Python2中則使用mysqldb。 PyMySQL 遵循 Python 數據庫 API v2.0 規范&…

面試八股文--數據庫基礎知識總結(1)

1、數據庫的定義 數據庫&#xff08;DataBase&#xff0c;DB&#xff09;簡單來說就是數據的集合數據庫管理系統&#xff08;Database Management System&#xff0c;DBMS&#xff09;是一種操縱和管理數據庫的大型軟件&#xff0c;通常用于建立、使用和維護數據庫。數據庫系統…

關于在java項目部署過程MySQL拒絕連接的分析和解決方法

前言 在最近一次部署項目一次項目部署過程中&#xff0c;由于沒有對MySQL數據庫的部分權限和遠程連接進行授權&#xff0c;導致了在執行項目功能API時&#xff0c;出現MySQL連接異常或MySQL拒絕連接的問題。 問題 以下是部分報錯截圖&#xff1a; 分析 根據日志提示&#xf…

PhotoLine綠色版 v25.00:全能型圖像處理軟件的深度解析

在圖像處理領域,PhotoLine以其強大的功能和緊湊的體積,贏得了國內外眾多用戶的喜愛。本文將為大家全面解析PhotoLine綠色版 v25.00的各項功能,幫助大家更好地了解這款全能型的圖像處理軟件。 一、迷你體積,強大功能 PhotoLine被譽為迷你版的Photoshop,其體積雖小,但功能卻…

阿里重磅模型深夜開源;DeepSeek宣布開源DeepGEMM;微軟開源多模態AI Agent基礎模型Magma...|網易數智日報

阿里重磅模型深夜開源&#xff1a;表現超越Sora、Pika&#xff0c;消費級顯卡就能跑 2月26日&#xff0c;25日深夜阿里云視頻生成大模型萬相2.1&#xff08;Wan&#xff09;正式宣布開源&#xff0c;此次開源采用Apache2.0協議&#xff0c;14B和1.3B兩個參數規格的全部推理代碼…

002 Java操作kafka客戶端

Java操作kafka客戶端 文章目錄 Java操作kafka客戶端3.Java操作kafka客戶端1.引入依賴2. Kafka服務配置3、生產者&#xff08;Producer&#xff09;實現1. 基礎配置與發送消息2. 關鍵配置說明 4.消費者&#xff08;Consumer&#xff09;實現1. 基礎配置與消費消息2. 關鍵配置說明…

【SRC實戰】信息泄露導致越權會員功能

01 — 漏洞證明 1、VIP功能 2、SVIP功能 3、點擊任意用戶發起私聊&#xff0c;發現userId純數字可遍歷 4、返回包泄露身高范圍height&#xff0c;星座constellation&#xff0c;屬相zodiac&#xff0c;戀愛目標purpose&#xff0c;教育程度degree&#xff0c;成功越權VIP功能 …

游戲引擎學習第125天

倉庫:https://gitee.com/mrxiao_com/2d_game_3 回顧并為今天的內容做準備。 昨天&#xff0c;當我們離開時&#xff0c;工作隊列已經完成了基本的功能。這個隊列雖然簡單&#xff0c;但它能夠執行任務&#xff0c;并且我們已經為各種操作編寫了測試。字符串也能夠正常推送到隊…

藍橋杯 Java B 組之記憶化搜索(滑雪問題、斐波那契數列)

Day 5&#xff1a;記憶化搜索&#xff08;滑雪問題、斐波那契數列&#xff09; &#x1f4d6; 一、記憶化搜索簡介 記憶化搜索&#xff08;Memoization&#xff09; 是一種優化遞歸的方法&#xff0c;它利用 哈希表&#xff08;HashMap&#xff09;或數組 存儲已經計算過的結果…

反爬蟲策略

反爬蟲策略是網站用于防止自動化程序&#xff08;爬蟲&#xff09;惡意抓取數據的核心手段&#xff0c;其設計需兼顧有效性、用戶體驗和合法性。 一、 基礎檢測與攔截 User-Agent檢測&#xff1a;驗證請求頭中的User-Agent&#xff0c;攔截非常見或已知爬蟲標識。IP頻率限制&…

Java 實現快速排序算法:一條快速通道,分而治之

大家好&#xff0c;今天我們來聊聊快速排序&#xff08;QuickSort&#xff09;算法&#xff0c;這個經典的排序算法被廣泛應用于各種需要高效排序的場景。作為一種分治法&#xff08;Divide and Conquer&#xff09;算法&#xff0c;快速排序的效率在平均情況下非常高&#xff…

深入解析 Spring 中的 BeanDefinition 和 BeanDefinitionRegistry

在 Spring 框架中&#xff0c;BeanDefinition 和 BeanDefinitionRegistry 是兩個非常重要的概念&#xff0c;它們共同構成了 Spring IoC 容器的核心機制。本文將詳細介紹這兩個組件的作用、實現以及它們之間的關系。 一、BeanDefinition&#xff1a;Bean 的配置描述 1.1 什么…

《OpenCV》——光流估計

什么是光流估計&#xff1f; 光流估計的前提&#xff1f; 基本假設 亮度恒定假設&#xff1a;目標像素點的亮度在相鄰幀之間保持不變。這是光流計算的基礎假設&#xff0c;基于此可以建立數學方程來求解光流。時間連續或運動平滑假設&#xff1a;相鄰幀之間的時間間隔足夠小&a…

信息系統的安全防護

文章目錄 引言**1. 物理安全****2. 網絡安全****3. 數據安全****4. 身份認證與訪問控制****5. 應用安全****6. 日志與監控****7. 人員與管理制度****8. 其他安全措施****9. 安全防護框架**引言 從技術、管理和人員三個方面綜合考慮,構建多層次、多維度的安全防護體系。 信息…

如何進行OceanBase 運維工具的部署和表性能優化

本文來自OceanBase 用戶的實踐分享 隨著OceanBase數據庫應用的日益深入&#xff0c;數據量不斷攀升&#xff0c;單個表中存儲數百萬乃至數千萬條數據的情況變得愈發普遍。因此&#xff0c;部署專門的運維工具、實施針對性的表性能優化策略&#xff0c;以及加強指標監測工作&…