Electron:preload文件配置

概述

preloadelectron的预加载机制,可以理解为在electron创建时将nodejs`环境加载到渲染进程中使用。

程序的进程是相互独立的,electron中渲染进程和主进程的协同工作一般采用IPC进程通信或者在渲染进程中集成node环境,还有早期比较低效的remote模块方式使用node环境。除非保证渲染进程的JavaScript都是可信安全的,否则不推荐在渲染进程集成node环境。

使用preload的目的是在electron中不开启node环境集成情况下使用node的模块,避免不安全的JavaScript代码随意使用node环境。

preload的工作是在创建窗体时预加载需要node模块到渲染进程,然后以API方式暴露给渲染进程调用,preload共享渲染进程的windowdocument对象,因此preload可以轻松操作DOM,而渲染进程不共享preloadglobal对象。

非preload的方式

preload的方式的时候需要在主进程中打开window时,设置一些属性

webPreferences: {
  nodeIntegration: true, // 是否允许web端使用node
  contextIsolation: false, // 是否允许自定义preload脚本
}

渲染进程中,直接使用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',
  • 优点:可以在渲染进程直接使用nodejs和electron能力
  • 缺点:安全性降低,并且渲染进程不能单独调试

preload的方式

preload的方式是在打开窗口前先预加载一段脚本,不需要修改webPreferences中的nodeIntegration和contextIsolation属性,主进程中,打开窗口时添加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),
});

渲染进程中,通过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);
}
  • 优点:安全性高,渲染进程项目可以单独调试部分功能
  • 缺点:所有渲染进程想使用的能力,都需要通过preload脚本注入

实际开发中建议使用preload的方式,尽量将需要nodejselectron能力的抽离到主进程中,渲染进程通过ipc调用主进程封装好的能力

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容