Electron[5] 渲染進程和主進程

1 進程

Electron里頭的進程分為渲染進程和主進程。簡單理解:

  1. main.js就是主進程
  2. 每個頁面就是渲染進程
  3. 一個Electron應用僅有一個主進程,可以有多個渲染進程
    上面的這些概念很重要,不展開細講。

2 進程職責

主進程是用來實現應用的基礎功能,包括跟底層的系統交互等。渲染進程是用來實現具體每個頁面的功能。
那么當渲染進程需要跟系統底層進行交互的時候,怎么處理呢?目前有兩種方式:

  1. 在渲染進程里頭直接引用支持跟底層進行交互的包,然后直接實現跟底層的交互(十分不推薦)
  2. 渲染進程將事件委托給主進程,讓主進程來完成。(推薦)
  3. 事件委托是通過事件監聽和觸發來實現的。

3 渲染進程與Native API

雖然上面說了,不建議渲染進程直接調用Native API,但是還是要說下,渲染進程如何實現直接調用底層API。

之所以不建議渲染進程直接調用Native API是因為,渲染進程調用原生能力,其實是從主進程同步過來的,那么在應用的使用過程,就要不斷的實現主進程和渲染進程之間的原生能力載體的狀態同步,這個同步是十分耗費宿主機資源的。

3.1保存文件

下面的案例是講解下如何通過渲染進程直接調用原生API。

3.1.1 渲染進程頁面

先用h5畫出包含有一個文本框和用來保存的按鈕。
源碼如下:

<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>electron從入門到精通</title>
</head>
<body> <button type="button" id="saveBtn">保存文件</button><textarea id="textArea" style="position:absolute;top:60px;bottom:0;left:0;right:0;"></textarea>
<script src="./test.js"></script>
</body>
</html>

然后test.js的源碼如下:

const { dialog } = require('@electron/remote')
//引入fs模塊
var fs = require('fs')
//獲取文本框的dom 
var textAreaDom = document.querySelector('#textArea')
var saveBtn = document.getElementById('saveBtn')// 文件保存路徑,第一保存后,就緩存起來
var currentPath = null
saveBtn.addEventListener('click',function(){if (currentPath) {writeFile(currentPath)} else {// 調用native api實現文件保存dialog.showSaveDialog({properties:['showOverwriteConfirmation']}).then(({canceled,filePath})=>{if (!canceled) {writeFile(filePath)currentPath = filePath}})}})
function writeFile(path,){fs.writeFileSync(path, textAreaDom.value)}

到這邊要停下來下,緩一緩捋一捋。
首先,我們需要在渲染進程里頭引用node的包,fs包,其次,還用到了remote的依賴包。因此還需要做如下操作:

  • 安裝@electron/remote,版本:2.0.12
npm install @electron/remote@2.0.12
  • 調整渲染進程窗口的創建配置。創建窗口是在main.js里實現的,下面直接附上整個main.js的文件:
		// main.jsconst { app, BrowserWindow} = require('electron')const path = require('path')// *************************1.引入remote模塊******************************const remote = require("@electron/remote/main");remote.initialize();function createWindow () {const mainWindow = new BrowserWindow({width: 800,height: 600,webPreferences:{//  渲染進程 開啟node模塊,使得JS中可以使用node的modelnodeIntegration:true,// 開啟 remote 模塊enableBlinkFeatures:true,// 控制上下文隔離contextIsolation:false,//由于安全問題,remote模塊默認關閉enableRemoteModule: true,//開啟remote模塊//關閉web權限檢查,允許跨域webSecurity: false,}})mainWindow.loadFile('./src/index.html')// 默認打開調試工具mainWindow.webContents.openDevTools()// ********2.啟用remote模塊,渲染進程就可以使用主程序模塊********************remote.enable(mainWindow.webContents);  }app.whenReady().then(() => {createWindow()app.on('activate', () => {if (BrowserWindow.getAllWindows().length === 0) {createWindow()}})})app.on('window-all-closed', () => {if (process.platform !== 'darwin') {app.quit()}})

至此,源碼分享就結束了。

4 源碼解釋

4.1 test.js和Electron的原生能力

上面主要麻煩的就是test.js里頭的dialog的使用。這個調用的是原生能力的彈窗,其實像原生能力的使用,不知道都覺得很麻煩,但是,如果知道了,就不難,下面附上原生能力的工具字典:
app | Electron

4.2 remote模塊

不同版本的Electron使用的remote是不一樣的,main.js里頭關于remote的配置,以及渲染進程里頭的remote的引用都是跟版本掛鉤了,大家如果一意孤行還要用使用不推薦的方式來使用原生能力的話,那么配置就按照上面的來做即可了。

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

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

相關文章

【小沐學Python】Python實現TTS文本轉語音(speech、pyttsx3、百度AI)

文章目錄 1、簡介2、Windows語音2.1 簡介2.2 安裝2.3 代碼 3、pyttsx33.1 簡介3.2 安裝3.3 代碼 4、ggts4.1 簡介4.2 安裝4.3 代碼 5、SAPI6、SpeechLib7、百度AI8、百度飛槳結語 1、簡介 TTS(Text To Speech) 譯為從文本到語音&#xff0c;TTS是人工智能AI的一個模組&#xf…

K8S學習指南(6)-k8s核心概念label和label selector

文章目錄 前言Label是什么&#xff1f;示例 Label Selector是什么&#xff1f;示例 Label的使用場景Label Selector的類型Label和Label Selector的高級應用使用Label Selector選擇Service的后端Pod使用Label Selector進行滾動更新 總結 前言 Kubernetes是一個強大的容器編排平…

Python從入門到精通

一、Python基礎語法 1、字面量 掌握字面量的含義了解常見的字面量類型基于print語句完成各類字面量的輸出 什么是字面量&#xff1f; 字面量&#xff1a;在代碼中&#xff0c;被寫下來的的固定的值&#xff0c;稱之為字面量 常用的值類型 Python中常用的有6種值&#xff…

MyBatis 四大核心組件之 ResultSetHandler 源碼解析

&#x1f680; 作者主頁&#xff1a; 有來技術 &#x1f525; 開源項目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 倉庫主頁&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 歡迎點贊…

MyBatis動態SQL(Dynamic SQL)

Mybatis框架的動態SQL技術是一種根據特定條件動態拼裝SQL語句的功能&#xff0c;它存在的意義是為了解決拼接SQL語句字符串時的痛點問題。 實際開發中可以通過以下幾種標簽進行動態SQL拼接。 1 if標簽 根據test屬性所對應的表達式計算結果決定標簽中的內容是否拼接到sql中。 …

基于SpringBoot+JSP+Mysql寵物領養網站+協同過濾算法推薦寵物(Java畢業設計)

大家好&#xff0c;我是DeBug&#xff0c;很高興你能來閱讀&#xff01;作為一名熱愛編程的程序員&#xff0c;我希望通過這些教學筆記與大家分享我的編程經驗和知識。在這里&#xff0c;我將會結合實際項目經驗&#xff0c;分享編程技巧、最佳實踐以及解決問題的方法。無論你是…

《C++新經典設計模式》之第15章 適配器模式

《C新經典設計模式》之第15章 適配器模式 適配器模式.cpp 適配器模式.cpp #include <iostream> #include <vector> #include <string> #include <fstream> #include <memory> using namespace std;// 解決兩個類之間的兼容性問題 // 轉換接口調…

ffmpeg6.0之ffprobe.c源碼分析二-核心功能源碼分析

本篇我們繼續分析: 1、ffprobe -show_packets 參數的處理流程;2、ffprobe -show_frames 參數的處理流程;3、ffprobe -show_streams 參數的處理流程;4、ffprobe -show_format 參數的處理流程; 因為前面的文章已經回顧了這些命令的使用,以及作用。本文就不在贅述,以免篇幅…

《妙趣橫生的算法》(C語言實現)- 第5章 數學趣題(一)

《妙趣橫生的算法》&#xff08;C語言實現&#xff09;-第5章 數學趣題&#xff08;一&#xff09; 提示&#xff1a;這里可以添加系列文章的所有文章的目錄&#xff0c;目錄需要自己手動添加 例如&#xff1a;第一章 Python 機器學習入門之pandas的使用 提示&#xff1a;寫完文…

“新華三杯”第十屆成都信息工程大學ACM程序設計競賽(同步賽)L. 怎么走啊(最短路+二分 分段函數)

題目 登錄—專業IT筆試面試備考平臺_牛客網 思路來源 衡陽師范學院ac代碼、pj學弟 題解 大致可以證明&#xff0c;在w從1e5減小到1的過程中&#xff0c; 之前某條反向邊沒有用到&#xff0c;現在需要用到反向邊&#xff0c;也就是正向邊用到的變少了 這樣的變化有sqrt個&a…

分層網絡模型(OSI、TCP/IP)及對應的網絡協議

OSI七層網絡模型 OSI&#xff08;Open System Interconnect&#xff09;&#xff0c;即開放式系統互連參考模型&#xff0c; 一般都叫OSI參考模型&#xff0c;是ISO組織于1985年研究的網絡互連模型。OSI是分層的體系結構&#xff0c;每一層是一個模塊&#xff0c;用于完成某種功…

服務器GPU占用,kill -9 PID 用不了,解決辦法

PID&#xff08;progress ID 進程ID&#xff09; 上圖為占用情況&#xff0c;使用下面的指令都不管用 kill -9 PID kill -15 PID # 加入sudo 還是不行 # 等等網上的 chatgpt 提供的其他辦法&#xff0c;一圈試了下來還是不管用最后解決辦法 首先用下面的指令查看進程的樹結構…

【Hexo】自動在中英文之間添加空格

本文首發于 ??慕雪的寒舍 如題&#xff0c;中英文添加空格是比較規范的寫法&#xff0c; 但是我個人實在是懶&#xff0c;每次都要這么弄太累了。想找找hexo有沒有對應的插件&#xff0c;還是有的 npm install hexo-filter-auto-spacing --save安裝了之后&#xff0c;在hexo的…

〖大前端 - 基礎入門三大核心之JS篇?〗- 面向對象之對象的方法、遍歷、深淺克隆

說明&#xff1a;該文屬于 大前端全棧架構白寶書專欄&#xff0c;目前階段免費&#xff0c;如需要項目實戰或者是體系化資源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩編程&#xff0c;十余年工作經驗, 從事過全棧研發、產品經理等工作&#xff0c;目前在公司…

iOS使用CoreText完成txt閱讀器

CoreText是一個高效處理字符和字形轉換和進行文字排版的框架&#xff0c;API基于C語言。 常見的CoreText類介紹 &#xff08;1&#xff09;、CFAttributedStringRef 屬性字符串&#xff0c;用于存儲需要繪制的文字字符和字符屬性 &#xff08;2&#xff09;、CTFramesetterR…

【原創】錄剪視頻的折騰之路

制作視頻的起因 本人為IT男&#xff0c;IT發展快&#xff0c;需要學習的東西又多。往往為了一個技術小問題&#xff0c;花好幾天時間學習&#xff0c;接下來十來分鐘把事情做完。下次遇到這個同樣的問題的時候&#xff0c;可能是幾個月后&#xff0c;甚至是幾年以后了。這些技…

微信小程序頁面跳轉方法

文章目錄 前言方式一&#xff1a;wx.navigateTo方式二&#xff1a;wx.redirectTo方式三&#xff1a;wx.reLaunch方式四&#xff1a;wx.switchTab方式五&#xff1a;wxml中navigator標簽跳轉頁面回退 前言 微信小程序頁面跳轉的各種方法總結&#xff0c;備查。 方式一&#xff…

汽車連接器

汽車連接器 電子元器件百科 文章目錄 汽車連接器前言一、汽車連接器是什么二、汽車連接器的類別三、汽車連接器的應用實例四、汽車連接器的作用原理總結前言 汽車連接器通常需要具備防水、防塵、耐高溫等特性,以適應汽車惡劣的工作環境。它們的設計和連接方式也各不相同,以適…

JVM 內存分析工具 Memory Analyzer Tool(MAT)的深度講解

目錄 一. 前言 二. MAT 使用場景及主要解決問題 三. MAT 基礎概念 3.1. Heap Dump 3.2. Shallow Heap 3.3. Retained Set 3.4. Retained Heap 3.5. Dominator Tree 3.6. OQL 3.7. references 四. MAT 功能概述 4.1. 內存分布 4.2. 對象間依賴 4.3. 對象狀態 4.4…

鴻蒙前端開發-構建第一個ArkTS應用(Stage模型)

創建ArkTS工程 若首次打開DevEco Studio&#xff0c;請點擊Create Project創建工程。如果已經打開了一個工程&#xff0c;請在菜單欄選擇File > New > Create Project來創建一個新工程。 選擇Application應用開發&#xff08;本文以應用開發為例&#xff0c;Atomic Serv…