Electron团队为什么要干掉remote模块
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模块的更多相关文章
- 团队-爬虫豆瓣top250项目-模块开发过程
项目托管平台地址:https://github.com/gengwenhao/GetTop250.git 开发模块功能: "get_info()单个页面的爬取"功能,开发时间:15 ...
- Forward团队-爬虫豆瓣top250项目-模块开发过程
项目托管平台地址:https://github.com/xyhcq/top250 开发模块功能: 爬虫对信息的处理部分 开发时间:5天的下午空余时间(每天大约1小时,边学模块的使用边开发) 实现了:爬 ...
- Forward团队-爬虫豆瓣top250项目-模块测试过程
我所做的模块不需要测试,但在后续其他人编写代码的时候,我需要对网页源码进行进一步的规范,然后指导别人在网页源码中的标签用法.
- 团队-爬虫豆瓣top250项目-模块测试过程
模块测试: 项目托管平台地址:https://github.com/gengwenhao/GetTop250.git 模块测试:"获取250排名的全部电影信息"功能,测试方法:手动 ...
- 如何点击穿透Electron不规则窗体的透明区域
实现一个不规则窗体 这里我们实现一个圆形窗体,实现其他形状的窗体与这个方法类似. 首先,把窗口的高度(height)和宽度(width)值修改为相同的值,使窗口成为一个正方形. 其次,把窗口的透明属性 ...
- electron获取不到remote
electron获取不到remote 问题 // 渲染进程 let remote = require('electron').remote console.log(remote) // undefin ...
- Electron安装过程深入解析(读完此文解决Electron应用无法启动,无法打包的问题)
1. 安装Electron依赖包 开发者往往通过npm install(或 yarn add)指令完成为Node.js工程安装依赖包的工作, 安装Electron也不例外,下面是npm和yarn的安装 ...
- 【Electron Playground】Electron 窗口问题汇总
作者:Kurosaki 本节旨在汇总在开发Electron 窗口可能遇到的问题,做一个汇总,后续遇到问题会持续更新. 1. 窗口闪烁问题. const { BrowserWindow } = requ ...
- 自己实现一个Electron跨进程消息组件
我们知道开发Electron应用,难免要涉及到跨进程通信,以前Electron内置了remote模块,极大的简化了跨进程通信的开发工作,但这也带来了很多问题,具体的细节请参与我之前写的文章: http ...
随机推荐
- python中进程详解
1:pdb调试:基于命令行的调试工具,非常类似gnu和gdb调试,以下是常用的调试命令: 可以python -m pdb xxx.py(你的py文件名)进入命令行调试模式 命令 简写命令 作用 bea ...
- phpmyadmin error:#2002 - 服务器没有响应 (或者本地 MySQL 服务器的套接字没有正确配置)
1. 将 "phpMyAdmin/libraries"文件夹下的config.default.php文件中的$cfg['Servers'][$i]['host'] = 'local ...
- Android中的一些小细节
在代码中获取到的padding .margin.getWidth.event.getX.context.getResources().getDimensionPixelSize(R.dimen.key ...
- Java流程控制03——选择结构
选择结构 if单语句结构 我们很多时候要去判断一个东西是否可行,然后我们才去执行,这样一个过程我们用if语句来表示 语法 if(布尔表达式){ //如果布尔表达式结果为true将执行的语句 } if ...
- Top10 应用都在用的Android最新知识
相信各位对Jetpack并不陌生,自从 Google 在 2018 年推出 Jetpack 之后,它就成为了 Android 未来发展的指向标. 作为一名安卓工程师,我们以前会经常吐槽Android碎 ...
- 自动化可用到的Java读取Excel文件指定的行列数据
前言 在做接口自动化的时候,通常会遇到数据取用及存放的问题,一般有三种方式可选择 1.数据库存取 2.表格存取 3.项目配置文件存取 这里仅展示下第二种方式表格取数据的 示例 import org.a ...
- UNIX环境高级编程APUE练习3.2-不用fcntl实现dup2的功能
1 题面 编写与dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理. 2 基本思路 不能用fcntl,能够返回一个文件描述符的只有open和dup.而open会创建一个新的文件表 ...
- Linux进程间通信方式--信号,管道,消息队列,信号量,共享内存
1.概述 通信方法 无法介于内核态与用户态的原因 管道(不包括命名管道) 局限于父子进程间的通信. 消息队列 在硬.软中断中无法无阻塞地接收数据. 信号量 无法介于内核态和用户态使用. 内存共享 需要 ...
- 精简ABP的模块依赖
ABP的模块非常方便我们扩展自己的或使用ABP提供的模块功能,对于ABP自身提供的模块间的依赖关系想一探究竟,并且试着把不必要的模块拆掉,找到那部分核心模块.本次使用的是AspNetBoilerpla ...
- 11-SpringCloud Hystrix
Hystrix简介 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败. 服务雪崩 多个微服务之间调用的时候,假设微服务A调用微服务B和微服务 ...