Electron:preload文件配置

概述

preloadelectron的預(yù)加載機(jī)制,可以理解為在electron創(chuàng)建時(shí)將nodejs`環(huán)境加載到渲染進(jìn)程中使用。

程序的進(jìn)程是相互獨(dú)立的,electron中渲染進(jìn)程和主進(jìn)程的協(xié)同工作一般采用IPC進(jìn)程通信或者在渲染進(jìn)程中集成node環(huán)境,還有早期比較低效的remote模塊方式使用node環(huán)境。除非保證渲染進(jìn)程的JavaScript都是可信安全的,否則不推薦在渲染進(jìn)程集成node環(huán)境。

使用preload的目的是在electron中不開啟node環(huán)境集成情況下使用node的模塊,避免不安全的JavaScript代碼隨意使用node環(huán)境。

preload的工作是在創(chuàng)建窗體時(shí)預(yù)加載需要node模塊到渲染進(jìn)程,然后以API方式暴露給渲染進(jìn)程調(diào)用,preload共享渲染進(jìn)程的window、document對(duì)象,因此preload可以輕松操作DOM,而渲染進(jìn)程不共享preloadglobal對(duì)象。

非preload的方式

preload的方式的時(shí)候需要在主進(jìn)程中打開window時(shí),設(shè)置一些屬性

webPreferences: {
  nodeIntegration: true, // 是否允許web端使用node
  contextIsolation: false, // 是否允許自定義preload腳本
}

渲染進(jìn)程中,直接使用electron,并修改webpack target屬性

'use strict';

import { ipcRenderer } from 'electron';

// channel
const channel = 'ipc-to-index';

/**
 * ipc to index
 */
export function ipcToIndex(){
  ipcRenderer.send (channel);
}
target: 'electron17.1-renderer',
  • 優(yōu)點(diǎn):可以在渲染進(jìn)程直接使用nodejs和electron能力
  • 缺點(diǎn):安全性降低,并且渲染進(jìn)程不能單獨(dú)調(diào)試

preload的方式

preload的方式是在打開窗口前先預(yù)加載一段腳本,不需要修改webPreferences中的nodeIntegration和contextIsolation屬性,主進(jìn)程中,打開窗口時(shí)添加preload腳本

webPreferences: {
  preload: path.join(__dirname, 'preload.js')
}

preload.js

// preload.js

const { contextBridge, ipcRenderer} = require('electron');
const fs = require('fs'); 

contextBridge.exposeInMainWorld('fsApi', {
  writeFile: (filename, text, callback) => {
    fs.writeFile(filename, text, callback);
  },
  readFile: (filename, encode,  callback) => {
    fs.readFile(filename, encode, callback);
  },
  unlink: (filename, callback) => {
    fs.unlink(filename, callback);
  }
});

contextBridge.exposeInMainWorld('ipcRendererApi', {
  send: (channel, args) => ipcRenderer.send(channel, args),
  once: (channel, listener) => ipcRenderer.once(channel, listener),
  on: (channel, listener) => ipcRenderer.on(channel, listener),
});

渲染進(jìn)程中,通過window.xxx使用注入的能力

'use strict';
 
// import { ipcRenderer } from 'electron';
 
// channel
const channel = 'ipc-to-index';
 
/**
 * ipc to index
 */
export function ipcToIndex(){
  window.ipcRendererApi.send('close', args);
}
  • 優(yōu)點(diǎn):安全性高,渲染進(jìn)程項(xiàng)目可以單獨(dú)調(diào)試部分功能
  • 缺點(diǎn):所有渲染進(jìn)程想使用的能力,都需要通過preload腳本注入

實(shí)際開發(fā)中建議使用preload的方式,盡量將需要nodejselectron能力的抽離到主進(jìn)程中,渲染進(jìn)程通過ipc調(diào)用主進(jìn)程封裝好的能力

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 Google Play應(yīng)用市場(chǎng)對(duì)于應(yīng)用的targetSdkVersion有了更為嚴(yán)格的要求。從 2018 年...
    申國(guó)駿閱讀 66,250評(píng)論 15 98
  • """1.個(gè)性化消息: 將用戶的姓名存到一個(gè)變量中,并向該用戶顯示一條消息。顯示的消息應(yīng)非常簡(jiǎn)單,如“Hello ...
    她即我命閱讀 5,910評(píng)論 0 6
  • 我們都是軟弱的人,所以才會(huì)說謊。我們都是膽小的人,所以才要武裝。我們都是一群笨蛋,所以才會(huì)互相傷害。
    所羅門的偽證_dc0a閱讀 3,961評(píng)論 1 3
  • 為了讓我有一個(gè)更快速、更精彩、更輝煌的成長(zhǎng),我將開始這段刻骨銘心的自我蛻變之旅!從今天開始,我將每天堅(jiān)持閱...
    李薇帆閱讀 2,282評(píng)論 1 4
  • 似乎最近一直都在路上,每次出來走的時(shí)候感受都會(huì)很不一樣。 1、感恩一直遇到好心人,很幸運(yùn)。在路上總是...
    時(shí)間里的花Lily閱讀 1,792評(píng)論 1 3

友情鏈接更多精彩內(nèi)容