feat: 浏览器渲染原理

This commit is contained in:
杭城小刘
2024-02-06 00:30:11 +08:00
parent a329691f8a
commit 0013537cfe
54 changed files with 916 additions and 41 deletions

View File

@@ -29,11 +29,11 @@ GUI 架构过程化绘制drawLine、drawRect-> 面向对象抽象时代
3天时间写了个 PC 端应用程序。先看看结果吧
![Todo1](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2020-05-04-TodoApp1.png)
![Todo1](./../assets/2020-05-04-TodoApp1.png)
![Todo1](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2020-05-04-TodoApp2.png)
![Todo1](./../assets/2020-05-04-TodoApp2.png)
![Todo1](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2020-05-04-TodoApp3.png)
![Todo1](./../assets/2020-05-04-TodoApp3.png)
@@ -58,7 +58,7 @@ npm install && npm start
```
简单介绍下 Demo 工程,工程目录如下所示
![工程目录](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2020-04-21-electron-packagejson.png)
![工程目录](./../assets/2020-04-21-electron-packagejson.png)
在终端执行 `npm start` 执行的是 package.json 中的 `scripts` 节点下的 start 命令,也就是 `Electron .``.` 代表执行 main.js 中的逻辑。
@@ -159,7 +159,7 @@ Electron 分为**渲染进程和主进程**。和 Native 中的概念不一样
单进程浏览器指的是浏览器的所有功能模块都是运行在同一个进程里的这些模块包括网络、插件、Javascript 运行环境、渲染引擎和页面等。如此复杂的功能都在一个进程内运行,所以导致浏览器出现不稳定、不安全、不流畅等问题。
![单进程浏览器架构示意图](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2020-05-07-BrowserSingleThread.png)
![单进程浏览器架构示意图](./../assets/2020-05-07-BrowserSingleThread.png)
早在2007年之前市面上的浏览器都是单进程架构。
@@ -194,7 +194,7 @@ Electron 分为**渲染进程和主进程**。和 Native 中的概念不一样
#### 1.2 早期多进程架构浏览器
![早期 Chrome 进程架构图](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2020-05-07-ChromEarlyArch.png)
![早期 Chrome 进程架构图](./../assets/2020-05-07-ChromEarlyArch.png)
上图2008年 Chrome 发布时的进程架构图。可以看出 Chrome 的页面是运行在单独的渲染进程中,同时页面的插件也是运行在单独的插件进行中的,进程之间通过 IPC 进行通信。
@@ -218,7 +218,7 @@ Electron 分为**渲染进程和主进程**。和 Native 中的概念不一样
Chrome 团队不断发展,目前架构有了较新变化,最新 Chrome 架构图如下所示
![最新 Chrome 进程架构图](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2020-05-07-ChromeMordernArch.png)
![最新 Chrome 进程架构图](./../assets/2020-05-07-ChromeMordernArch.png)
最新 Chrome 浏览器包括1个网络进程、1个浏览器进程、1个 GPU 进程、多个渲染进程、多个插件进程。
@@ -247,7 +247,7 @@ Chrome 团队一直在寻求新的弹性方案,既可以解决资源占用较
Chrome 最终把 UI、数据库、文件、设备、网络等模块重构为基础服务。下图是 “Chrome 面向服务的架构”的进程模型图
![Chrome ”面向服务架构“的进程模型图](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2020-05-08-ChromeMltipleProcessArch.png)
![Chrome ”面向服务架构“的进程模型图](./../assets/2020-05-08-ChromeMltipleProcessArch.png)
@@ -257,7 +257,7 @@ Chrome 最终把 UI、数据库、文件、设备、网络等模块重构为基
Chrome 提供灵活的弹性架构在强大性能设备上会以多进程的方式运行基础服务但是在设备资源受限的情况下Chrome 会将很多服务整合到一个进程中,从而节省内存占用。
![Chrome弹性架构](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2020-05-08-FlexiableChromeMltipleProcessArch.png)
![Chrome弹性架构](./../assets/2020-05-08-FlexiableChromeMltipleProcessArch.png)
#### 1.5 小实验
@@ -273,7 +273,7 @@ Chrome 提供灵活的弹性架构,在强大性能设备上会以多进程的
实验现象:
![Chrome 进程仪表](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2020-05-08-ChromeProcessInspector.png)
![Chrome 进程仪表](./../assets/2020-05-08-ChromeProcessInspector.png)
实验结论:
@@ -310,7 +310,7 @@ Chrome 的默认策略是,每个标签对应一个渲染进程。但是如果
![Chromium 架构](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2020-05-03-ChromiumArch.png)
![Chromium 架构](./../assets/2020-05-03-ChromiumArch.png)
@@ -331,7 +331,7 @@ Chrome 的默认策略是,每个标签对应一个渲染进程。但是如果
### 2. Electron 架构
![](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2020-05-03-ElectronArch.png)
![](./../assets/2020-05-03-ElectronArch.png)
@@ -353,7 +353,7 @@ Electron 架构和 Chromium 架构类似也是具有1个主进程和多个渲
![Node.js与Chromium通信](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2020-05-03-ChromiumCommunicateWithNode.png)
![Node.js与Chromium通信](./../assets/2020-05-03-ChromiumCommunicateWithNode.png)
上图描述了 Node.js 如何融入到 Chromium 中。描述下原理
@@ -380,7 +380,7 @@ Electron 架构和 Chromium 架构类似也是具有1个主进程和多个渲
工程采用 Electron + Vue 技术,下面截图 Vue-devtools 很方便查看 Vue 组件层级等 Vue 相关的调试
![渲染进程调试](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2020-05-04-ElectronVue.png)
![渲染进程调试](./../assets/2020-05-04-ElectronVue.png)
### 2. 主进程调试方式
@@ -395,10 +395,10 @@ Electron 架构和 Chromium 架构类似也是具有1个主进程和多个渲
```
- 然后打开浏览器,在地址栏输入 `chrome://inspect`
- 点击 `configure`,在弹出的面板中填写需要调试的端口信息
- ![chrome inspect](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2020-04-21-electronChromeInspect.png)
- ![chrome inspect](./../assets/2020-04-21-electronChromeInspect.png)
- 重新开启服务 `npm start`,在 chrome inspect 面板的 `Target` 节点中选择需要调试的页面
- 在面板中可以看到主进程执行的 `main.js`。可以加断点进行调试
![chrome inspect](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2020-04-21-Electron-MainProcessInspect.png)
![chrome inspect](./../assets/2020-04-21-Electron-MainProcessInspect.png)
方法二:利用 VS Code 调试 Electron 主进程。
@@ -428,7 +428,7 @@ Electron 架构和 Chromium 架构类似也是具有1个主进程和多个渲
- 在调试模点击绿色小三角,会运行程序,可以添加断点信息。整体界面如下所示。可以单步调试、可以暂停、鼠标移上去可以看到对象的各种信息。
![VS Code 调试功能](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2020-04-21-electromDebugInVSCode.png)
![VS Code 调试功能](./../assets/2020-04-21-electromDebugInVSCode.png)
@@ -438,7 +438,7 @@ Electron 的渲染进程中的代码改变了,使用 Command + R 可以刷新
Webpack 有一个 api: `watch-run`,可以针对代码文件检测,有变化则 Restart
![main Process reload](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2020-05-04-ElectronMainProcessHotReload.png)
![main Process reload](./../assets/2020-05-04-ElectronMainProcessHotReload.png)
@@ -527,7 +527,7 @@ Electron 官方给出了解决方案 Squirrel基于 Squirrel 框架完成的
9. Electron 多窗口与单窗口应用区别
![用途](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2020-05-03-ElectronUsage.png)
![用途](./../assets/2020-05-03-ElectronUsage.png)
10. 知道 Electron 开发原理,所以大部分时间是在写前端代码。所以根据团队技术沉淀、选择对应的前端框架,比如 Vue、React、Angular。
@@ -535,7 +535,7 @@ Electron 官方给出了解决方案 Squirrel基于 Squirrel 框架完成的
12. Electron 和 Web 开发相比,各自有侧重点
![ElectronAndWeb](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2020-05-04-ElectronAndWeb.png)
![ElectronAndWeb](./../assets/2020-05-04-ElectronAndWeb.png)
13. 有些人开发 Electron 应用可能不喜欢 [electron-vue](https://github.com/SimulatedGREG/electron-vue) 这样的工具,喜欢自己自定义。假如自己利用 Vue 或者 React 开发的,开发过网页的同学都会习惯使用 Vue-devtools、React-devtools。所以在选用 Vue 或 React 后,习惯使用强大的 Vue-devtools、React-devtools 来查看 State、Action、Redux、Vuex、组件层级树等。
@@ -591,13 +591,13 @@ node --cpu-prof --heap-prof -e "require('request)”“
### 1. 构建
![构建](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2020-05-04-ElectronBuild.png)
![构建](./../assets/2020-05-04-ElectronBuild.png)
### 2. 工程解耦
![工程解耦](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2020-05-04-ElectronCode.png)
![工程解耦](./../assets/2020-05-04-ElectronCode.png)
@@ -605,7 +605,7 @@ node --cpu-prof --heap-prof -e "require('request)”“
Electron 提供的 crash 信息进行包装。
![crash 分析](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2020-05-04-ElectronCrash.png)
![crash 分析](./../assets/2020-05-04-ElectronCrash.png)
```js
import { BrowserWindow, app, dialog} from 'Electron';