Electron架构揭秘

标签: electron 架构 揭秘 | 发表时间:2020-10-28 15:06 | 作者:童欧巴
出处:https://juejin.im/frontend

「观感度:」

「口味:麻辣爆肚」

「烹饪时间:10min」

本文已收录在前端食堂同名仓库Github github.com/Geekhyt,欢迎光临食堂,如果觉得酒菜还算可口,赏个 Star 对食堂老板来说是莫大的鼓励。

彩蛋

昨晚搬砖回家看到 Peter 发了条朋友圈,腾讯云游戏平台 START 公测发布,他在用 MAC 打 LOL。我紧随其后体验了一波,毕竟 LOL 是我们这代人的青春,工作后很少有时间玩,用上 MAC 后,之前的游戏本也放在箱底很久了。

选个 EZ 浪一浪~(天赋都没来得及换)

20 分钟轻松拿下首胜(毕竟 s2 老玩家了,匹配局常规操作),综合体验还是很不错的,家用网速下基本感觉不到延迟,除了窗口模式下调整视角时鼠标有点难受之外。(想要体验的同学记得先把触发角关了)

云游戏平台这种“云”模式彻底解放了“跨平台”的想象力,随着 5G 的到来,它有没有可能是未来解决跨平台的最佳方案呢?对我们前端工程师来说,等待我们的又会是什么新的挑战呢?欢迎同学们留言一起探讨~

书归正传,最近手头在做 Electron 的项目,Electron 为了实现跨平台做了很多努力。(刚好可以与云游戏平台这种模式形成对比。)下面我们来一起看一看。

浏览器架构演进

我们先从浏览器架构演进开始说起,日益复杂的业务需求不断 push 着浏览器架构不断的演进和迭代。

拿我们最喜欢的 Chrome 举例,从 2007 年以前的单进程架构到现在的多进程架构,浏览器因为架构的调整, 变得更加稳定、更加流畅、更加安全。目前你能看到的最新的 Chrome 浏览器应该包括如下进程:

  • 1 个浏览器(Browser)主进程
  • 1 个 GPU 进程
  • 1 个网络(NetWork)进程
  • 多个渲染进程 (运行在沙箱模式下)
  • 多个插件进程

不过,软件工程没有银弹。浏览器的架构体系也随着调整变得更加复杂, 也会有更高的资源占用。

如何寻求一种在资源占用和复杂架构体系之间的平衡便成为了一个难题。

「小孩子才做选择,鱼和熊掌我都要!」

Chrome 团队在 2016 年使用“面向服务的架构”(Services Oriented Architecture,简称 SOA)的思想设计了新的 Chrome 架构。

Chrome 团队将模块重构成独立的服务 ( Service),服务运行在独立的进程中,想要访问的话必须使用定义好的接口,通过 IPC 来进行通信。这样的架构无疑更加内聚、松耦合、易于维护和扩展。

Chromium 架构

ChromiumChrome 的开源版,也是一个浏览器。

  • 主进程的 RenderProcessHost 和 渲染进程的 RenderProcess 专门处理 IPC 事件。
  • 渲染进程的 RenderView: 我们的页面就是在这里基于 Webkit 排版展示出来的。
  • ResourceDispatcher 处理资源请求,当页面需要请求资源时,通过 ResourceDispatcher,创建一个请求 ID 转发到 IPC,在 Browser 进程中处理然后返回。

Electron 架构

  • 在各个进程中暴露了 Native API (Main Native API、Renderer Native API)
  • 引入 Node.js

这样,在 Electron 中就可以使用 ChromiumNode.js 做好玩的事情了!

不过在此之前,还有一个难点需要解决:如何将 Node.jsChromiums 整合?

Node.js 事件循环基于 libuv,但 Chromium 基于 message_pump

解决这个问题的的主要思路有两种:

  • 1.将 Chromium 集成到 Node.js:用 libuv 实现 message_pump
  • 2.将 Node.js 集成到 Chromium

第一种方案, NW.js 就是这么做的。 Electron 前期也是这样尝试的,结果发现在渲染进程里实现比较容易,但是在主进程里却很麻烦,因为各个系统的 GUI 实现都不同, MacNSRunLoopLinuxglib,不仅工程量十分浩大,而且一些边界情况处理起来也十分棘手。

后来作者另辟蹊径,再次进行尝试,用一个小间隔的定时器轮询 GUI 事件,发现 GUI 响应的非常慢, CPU 也爆表。

直到后来 libuv 引入了 backend_fd 的概念,相当于 libuv 轮询事件的文件描述符,这样就可以通过轮询 backend_fd 来得到 libuv 的一个新事件了。也就是第二种思路,将 Node.js 集成到 Chromium

如果你想了解更多,也可以去看看下面作者的这个知乎回答~

小结

Node.js 集成到 Chromium 中的原理:

Electron 起了一个新的安全线程去轮询 backend_fd,当 Node.js 有一个新的事件后,通过 PostTask 转发到 Chromium 的事件循环中,这样就实现了 Electron 的事件融合。

参考

  • 《浏览器工作原理与实践》 李兵
  • 《Electron开发实战》 邓耀龙

❤️爱心三连击

1.如果你觉得食堂酒菜还合胃口,就点个赞支持下吧,你的 「赞」是我最大的动力。

2.关注公众号前端食堂, 「吃好每一顿饭!」

3.点赞、评论、转发 === 催更!

相关 [electron 架构 揭秘] 推荐:

Electron架构揭秘

- - 掘金前端
本文已收录在前端食堂同名仓库Github. github.com/Geekhyt,欢迎光临食堂,如果觉得酒菜还算可口,赏个 Star 对食堂老板来说是莫大的鼓励. 昨晚搬砖回家看到 Peter 发了条朋友圈,腾讯云游戏平台 START 公测发布,他在用 MAC 打 LOL. 我紧随其后体验了一波,毕竟 LOL 是我们这代人的青春,工作后很少有时间玩,用上 MAC 后,之前的游戏本也放在箱底很久了.

【译】使用 AngularJS 和 Electron 构建桌面应用

- - SegmentFault 最新的文章
原文: Creating Desktop Applications With AngularJS and GitHub Electron. GitHub 的 Electron 框架(以前叫做 Atom Shell)允许你使用 HTML, CSS 和 JavaScript 编写跨平台的桌面应用.

Electron+Vue开发跨平台桌面应用

- - SegmentFault 最新的文章
虽然B/S是目前开发的主流,但是C/S仍然有很大的市场需求. 受限于浏览器的沙盒限制,网页应用无法满足某些场景下的使用需求,而桌面应用可以读写本地文件、调用更多系统资源,再加上Web开发的低成本、高效率的优势,这种跨平台方式越来越受到开发者的喜爱. Electron是一个基于Chromium和 Node.js,使用 HTML、CSS和JavaScript来构建跨平台应用的跨平台开发框架,兼容 Mac、Windows 和 Linux.

# 从零搭建Electron应用 的一系列简单的 Demo

- - 掘金前端
Electron 是一个优秀的跨平台桌面应用程序开源库,目前接触 Electron 的开发者也越来越多. 但是笔者发现,目前社区里缺少对初学者足够友好的入门教程来帮助初学者用 Electron 搭建一个完整的开发框架. 为了解决这个问题,笔者将结合平时的一些 Electron 开发经验,渐近式的带领读者从零开始搭建一个完整的 Electron 应用.

Uber 四年时间增长近 40 倍,背后架构揭秘

- - 博客 - 伯乐在线
据报道,Uber 仅在过去4年的时间里,业务就激增了 38 倍. Uber 首席系统架构师 Matt Ranney 在一个非常有趣和详细的访谈《可扩展的 Uber 实时市场平台》中告诉我们 Uber 软件是如何工作的. 本次访谈中没有涉及你可能感兴趣的峰时定价(Surge pricing,译注:当Uber 平台上的车辆无法满足大量需求时,将提升费率来确保乘客的用车需求).

初探Electron,从入门到实践 - 葡萄城技术团队博客 - OSCHINA

- -
在开始之前,我想您一定会有这样的困惑:标题里的Electron 是什么. 许多伟大的公司使用Electron框架的原因又是什么. 带着这些问题和疑惑,通过本文的介绍,可助您全面地认识Electron这门新兴的技术,迅速找到其入门途径,并理解Electron为何被称为当下开发桌面App的最佳选择. (为何称之为“跨平台桌面浏览器”).

揭秘谷歌网络架构英雄:传承施乐PARC理念(zz)

- - 银河里的星星
从某种意义上讲,谷歌就是施乐PARC研究中心的当代继承人,只是在PARC理念基础上迈出了更远步伐. 谷歌所制定的管理措施,能够使该公司在完成技术开发后迅速投入使用.   北京时间8月9日消息,美国知名IT杂志《连线》网络版周三刊登长篇深度文章,披露了谷歌网络服务基础架构的幕后负责人及相关故事,并指出从某种意义上讲,谷歌就是施乐PARC研究中心的当代继承人.

2017双11技术揭秘—阿里巴巴数据库技术架构演进

- - IT瘾-geek
摘要: 每年电商双11大促对阿里技术人都是一次大考,对阿里数据库团队更是如此. 经过9年的发展,双11单日交易额从2009年的0.5亿一路攀升到2017年的1682亿,秒级交易创建峰值达到了32.5万笔/秒. 支撑这一切业务指标的背后,是底层技术体系的一次次迭代升级. 每年电商双11大促对阿里技术人都是一次大考,对阿里数据库团队更是如此.

火山引擎 DataLeap:揭秘字节跳动数据血缘架构演进之路

- - 掘金 架构
更多技术交流、求职机会,欢迎关注 字节跳动数据平台微信公众号,回复【1】进入官方交流群. DataLeap 是火山引擎数智平台 VeDI 旗下的大数据研发治理套件产品,帮助用户快速完成数据集成、开发、运维、治理、资产、安全等全套数据中台建设,降低工作成本和数据维护成本、挖掘数据价值、为企业决策提供数据支撑.

架构

- - IT瘾-dev
网关:Nginx、Kong、Zuul. 缓存:Redis、MemCached、OsCache、EhCache. 搜索:ElasticSearch、Solr. 熔断:Hystrix、resilience4j. 负载均衡:DNS、F5、LVS、Nginx、OpenResty、HAproxy. 注册中心:Eureka、Zookeeper、Redis、Etcd、Consul.