Electron团队提供remote模块给开发者,

主要目的是为了简化渲染进程和主进程互访的难度,

这个目的却是达到了。

但也带来了很多问题,

归纳起来主要分为以下四点:

第一:它很慢

通过remote模块可以访问主进程的对象、类型、方法,

但这些操作都是跨进程的,

跨进程操作性能上的损耗可能是进程内操作的几百倍甚至上千倍。

假设你在渲染进程通过remote模块创建了一个BrowserWindow对象,

不但你创建这个对象的过程很慢,

后面你使用这个对象的过程也很慢。

小到更新这个对象的属性,

大到使用这个对象的方法,

都是跨进程的,

这种累积性的性能损耗,

可想而知影响有多大。

第二:它会制造混乱

假设我们在渲染进程中通过remote模块使用了主进程的某个对象,

此对象在某个时刻会触发一个事件(BrowserWindow对象中就有很多这样的事件),

事件处理程序是在渲染进程中注册的,

当事件发生时,实际上是主进程的原始对象先接到这个事件,

再异步的通知渲染进程要执行事件处理程序,

此时可能已经错过了很多事情,

类似event.preventDefault()这样的操作可能毫无意义。

在一个业务复杂的应用中这类错误非常难排查。

第三:它会制造假象

我们在渲染进程中通过remote模块使用了主进程的某个对象,

得到的是这个对象的映射,是一个代理对象,

它看起来像是真正的对象,但实际上不是。

首先这个对象原型链上的属性不会被映射到渲染进程的代理对象上。

其次类似NaN、Infinity这样的值不会被正确的映射给渲染进程,

如果一个主进程方法返回一个NaN值

那么渲染进程通过remote模块访问这个方法将会得到undefined。

第四:它存在安全问题

因为remote模块底层还是通过IPC管道与主进程通信的,

那么假设你的应用需要加载第三方网页,

即使你让这些网页运行在安全沙箱内,

恶意代码仍可能通过原型污染攻击来模拟remote模块的远程消息

以获取访问主进程模块的权力,逃离沙箱的控制。

反思

remote模块并非一无是处

Electron进程间通讯确实非常复杂,

不但增加了开发人员的劳动,还增加了开发人员的心智负担

没有remote模块开发人员该怎么办呢

要么就实现自己的进程间通信工具(我就做过一个跨进程的消息总线)

要么就强行引入remote模块

实际上remote模块并非被干掉了

而是从核心模块变成了可供开发者选择的模块

决策权交给了开发者

但开发者再使用remote模块时,一定要考虑上面提到的那四个问题

不然你的应用程序可能会存在不稳定的现象。

Electron团队为什么要干掉remote模块的更多相关文章

  1. 团队-爬虫豆瓣top250项目-模块开发过程

    项目托管平台地址:https://github.com/gengwenhao/GetTop250.git 开发模块功能: "get_info()单个页面的爬取"功能,开发时间:15 ...

  2. Forward团队-爬虫豆瓣top250项目-模块开发过程

    项目托管平台地址:https://github.com/xyhcq/top250 开发模块功能: 爬虫对信息的处理部分 开发时间:5天的下午空余时间(每天大约1小时,边学模块的使用边开发) 实现了:爬 ...

  3. Forward团队-爬虫豆瓣top250项目-模块测试过程

    我所做的模块不需要测试,但在后续其他人编写代码的时候,我需要对网页源码进行进一步的规范,然后指导别人在网页源码中的标签用法.

  4. 团队-爬虫豆瓣top250项目-模块测试过程

    模块测试: 项目托管平台地址:https://github.com/gengwenhao/GetTop250.git 模块测试:"获取250排名的全部电影信息"功能,测试方法:手动 ...

  5. 如何点击穿透Electron不规则窗体的透明区域

    实现一个不规则窗体 这里我们实现一个圆形窗体,实现其他形状的窗体与这个方法类似. 首先,把窗口的高度(height)和宽度(width)值修改为相同的值,使窗口成为一个正方形. 其次,把窗口的透明属性 ...

  6. electron获取不到remote

    electron获取不到remote 问题 // 渲染进程 let remote = require('electron').remote console.log(remote) // undefin ...

  7. Electron安装过程深入解析(读完此文解决Electron应用无法启动,无法打包的问题)

    1. 安装Electron依赖包 开发者往往通过npm install(或 yarn add)指令完成为Node.js工程安装依赖包的工作, 安装Electron也不例外,下面是npm和yarn的安装 ...

  8. 【Electron Playground】Electron 窗口问题汇总

    作者:Kurosaki 本节旨在汇总在开发Electron 窗口可能遇到的问题,做一个汇总,后续遇到问题会持续更新. 1. 窗口闪烁问题. const { BrowserWindow } = requ ...

  9. 自己实现一个Electron跨进程消息组件

    我们知道开发Electron应用,难免要涉及到跨进程通信,以前Electron内置了remote模块,极大的简化了跨进程通信的开发工作,但这也带来了很多问题,具体的细节请参与我之前写的文章: http ...

随机推荐

  1. 最大公约数and最小公倍数(Java版)

    1.最大公约数and最小公倍数 import java.util.Scanner; public class MultipleAndDivisor { public static void main( ...

  2. ts 学习笔记-基础篇

    目录 基础 原始数据类型 布尔值 数字 字符串 空值 Null 和 Undefined 任意值 类型推论 联合类型 接口 数组 函数 类型断言 申明文件 什么是申明文件 三斜线指令 第三方声明文件 内 ...

  3. 看视频学SignalR—在微软虚拟学院学习SignalR

    SignalR把实时Web功能变得异常简单. 如果您希望在几个小时内对SignalR有一个直观的了解,观看微软虚拟学院(MVA)的视频教学Lighting Up Real-Time Web Commu ...

  4. 机器学习 - k-means聚类

    k-means简介 k-means是无监督学习下的一种聚类算法,简单说就是不需要数据标签,仅靠特征值就可以将数据分为指定的几类.k-means算法的核心就是通过计算每个数据点与k个质心(或重心)之间的 ...

  5. 关于Asp.Net MVC html.renderaction传递参数

    View视图 @{html.renderaction("控制器方法名","控制器名称",new{params1="参数值"})} Contr ...

  6. 利用共享内存实现比NCCL更快的集合通信

    作者:曹彬 | 旷视 MegEngine 架构师 简介 从 2080Ti 这一代显卡开始,所有的民用游戏卡都取消了 P2P copy,导致训练速度显著的变慢.针对这种情况下的单机多卡训练,MegEng ...

  7. Java架构师-十项全能学习笔记(1)

    Java架构师-十项全能学习笔记(1) @Configuration @EnableStateMachine public class OrderStateMachineConfig extends ...

  8. Android太太太太太卷了,累了

    我们聊到互联网行业的时候,一个不可避免的话题就是"内卷",而在程序员这个群体中,Android,绝对是卷得最厉害的. 毕竟前几年Android兴起的时候,入门门槛低,培训机构培养了 ...

  9. python 将Mnist数据集转为jpg,并按比例/标签拆分为多个子数据集

    现有条件:Mnist数据集,下载地址:跳转 下载后的四个.gz文件解压后放到同一个文件夹下,如:/raw Step 1:将Mnist数据集转为jpg图片(代码来自这篇博客) 1 import os 2 ...

  10. Greenplum数仓监控解决方案(开源版本)

    Greenplum监控解决方案 基于Prometheus+Grafana+greenplum_exporter+node_exporter实现 关联图 一.基本概念 1.Prometheus ​ Pr ...