cef
文章平均质量分 88
~怎么回事啊~
这个作者很懒,什么都没留下…
展开
-
chrome窗口
这个窗口是gpu进程创建的,作为一个子窗口嵌入到父窗口 Chrome_WidgetWin_1 中,chrome在使用gpu渲染时,网页的渲染最后会在GPU中渲染,即 Intermediate D3D Window 窗口。所以,我们需要一个假的 HWND,其窗口类为Chrome_RenderWidgetHostHWND 作为可访问性树的根每个选项卡。默认容器窗口是包含网页的整个窗口WebContents 等。// 用于匹配 Chrome 窗口的窗口类的前缀。浏览器将其重新设置为其窗口的子窗口。原创 2023-10-07 10:53:16 · 3065 阅读 · 0 评论 -
Chrome-mojo The Service Manager & Services
概述是一个组件,像 Chromium 这样的大型应用程序可以使用它来支持跨平台、多进程、面向服务、连字符形容词负载的体系结构。本文档介绍了如何将嵌入到应用程序中,以及如何定义和注册服务以供其管理。如果您只想阅读有关定义服务和使用公共服务 API 的内容,请跳至主要部分。原创 2023-04-20 11:15:42 · 526 阅读 · 1 评论 -
chromium 绑定中的对象管理
123原创 2022-09-13 10:29:34 · 273 阅读 · 0 评论 -
Chromium Threading and Task
123原创 2022-07-12 17:00:03 · 756 阅读 · 0 评论 -
qt集成cef的项目:qcefview
git地址:首先克隆仓库QCefViewgit clone https://github.com/CefView/QCefView.git然后进入QCefView文件夹,执行 git submodule update --init --recursive这样可以拉下来子仓库克隆CefViewCore原创 2022-05-08 22:57:30 · 1413 阅读 · 0 评论 -
qt集成cef QWidget
因为我的项目是基于qt的来做的,而qt的运行时库是MDd类型的,因此cef3编译的时候也应该遵循这个运行时库的编译方式 我在网上也看到了不少介绍创建cef项目的办法,不过个人觉得好多都是只讲过程,不讲原理,其实使用这个库很简单,我直- 说debug模式,release照搬。首先拷贝exe执行所需资源文件和运行时库(Resources目录下的除include文件夹、Debug目录下所有动态库),然后拷贝连接器的静态库(out/Debug/lib目录下的静态库、Debug目录下的所有静态库) ..原创 2022-03-05 21:38:53 · 1569 阅读 · 2 评论 -
qt集成cef在windows和mac下编译
cef下载cef:下载地址https://cef-builds.spotifycdn.com/index.html选择了87版本+32位cmake生成vs工程文件设置源码路径:D:/demo/cef+qtdemo/cef_binary_87.1.14+ga29e9a3+chromium-87.0.4280.141_windows32设置编译结果路径:D:/demo/cef+qtdemo/cef_binary_87.1.14+ga29e9a3+chromium-87.0.4..原创 2021-08-17 10:18:27 · 1437 阅读 · 8 评论 -
28-WebComponent:像搭积木一样构建Web应用
123原创 2021-04-21 11:39:15 · 145 阅读 · 0 评论 -
27-渐进式网页应用(PWA):它究竟解决了Web应用的哪些问题
1. 什么是 PWAPWA,全称是 Progressive Web App,翻译过来就是渐进式网页应用。根据字面意思,它就是“渐进式 +Web 应用”。对于 Web 应用很好理解了,就是目前我们普通的 Web 页面,所以 PWA 所支持的首先是一个 Web 页面。至于“渐进式”,就需要从下面两个方面来理解。 站在 Web 应用开发者来说,PWA 提供了一个渐进式的过渡方案,让普通站点逐步过渡到 Web 应用。采取渐进式可以降低站点改造的代价,使得站点逐步支持各项新技术,而不是一步到位。原创 2021-04-21 11:36:27 · 491 阅读 · 0 评论 -
26-虚拟DOM:虚拟DOM和实际的DOM有何不同?
虚拟 DOM 是最近非常火的技术,两大著名前端框架 React 和 Vue 都使用了虚拟 DOM,所以我觉得非常有必要结合浏览器的工作机制对虚拟 DOM 进行一次分析。当然了,React 和 Vue 框架本身所蕴含的知识点非常多,而且也不是我们专栏的重点,所以在这里我们还是把重心聚焦在虚拟 DOM 上。 在本文我们会先聊聊 DOM 的一些缺陷,然后在此基础上介绍虚拟 DOM 是如何解决这些缺陷的,最后再站在双缓存浏览器缓存和MVC的视角来聊聊虚拟 DOM。理解了这些会让你对目前的...原创 2021-04-21 11:33:09 · 279 阅读 · 0 评论 -
25-页面性能:如何系统地优化页面?
在前面几篇文章中,我们分析了页面加载和 DOM 生成,讨论了 JavaScript 和 CSS 是如何影响到 DOM 生成的,还结合渲染流水线来讲解了分层和合成机制,同时在这些文章里面,我们还穿插说明了很多优化页面性能的最佳实践策略。通过这些知识点的学习,相信你已经知道渲染引擎是怎么绘制出帧的,不过之前我们介绍的内容比较零碎、比较散,那么今天我们就来将这些内容系统性地串起来。 那么怎么才能把这些知识点串起来呢?我的思路是从如何系统优化页面速度的角度来切入。 这里我们所谈论的页面优...原创 2021-04-21 11:23:46 · 231 阅读 · 0 评论 -
24-分层和合成机制:为什么CSS动画比JavaScript高效?
在上一篇文章中我们分析了 CSS 和 JavaScript 是如何影响到 DOM 树生成的,今天我们继续沿着渲染流水线向下分析,来聊聊 DOM 树之后所发生的事情。 在前面《05 | 渲染流程(上):HTML、CSS 和 JavaScript 文件,是如何变成页面的?》文章中,我们介绍过 DOM 树生成之后,还要经历布局、分层、绘制、合成、显示等阶段后才能显示出漂亮的页面。 本文我们主要讲解渲染引擎的分层和合成机制,因为分层和合成机制代表了浏览器最为先进的合成技术,Chrome 团队...原创 2021-04-21 11:17:32 · 216 阅读 · 1 评论 -
23-渲染流水线:CSS如何影响首次加载时的白屏时间?
在上一篇文章中我们详细介绍了 DOM 的生成过程,并结合具体例子分析了 JavaScript 是如何阻塞 DOM 生成的。那本文我们就继续深入聊聊渲染流水线中的 CSS。因为 CSS 是页面中非常重要的资源,它决定了页面最终显示出来的效果,并影响着用户对整个网站的第一体验。所以,搞清楚浏览器中的 CSS 是怎么工作的很有必要,只要理解了 CSS 是如何工作的,你才能更加深刻地理解如何取优化页面。 本文我们先站在渲染流水线的视角来介绍 CSS 是如何工作的,然后通过 CSS 的工作流程来...原创 2021-04-21 11:03:15 · 175 阅读 · 0 评论 -
22-DOM树:JavaScript是如何影响DOM树构建的?
在上一篇文章中,我们通过开发者工具中的网络面板,介绍了网络请求过程的几种性能指标以及对页面加载的影响。而在渲染流水线中,后面的步骤都直接或者间接地依赖于 DOM 结构,所以本文我们就继续沿着网络数据流路径来介绍 DOM 树是怎么生成的。然后再基于 DOM 树的解析流程介绍两块内容:第一个是在解析过程中遇到 JavaScript 脚本,DOM 解析器是如何处理的?第二个是 DOM 解析器是如何处理跨站点资源的?什么是 DOM从网络传给渲染引擎的 HTML 文件字节流是无法直接被渲染引擎理解的,所以原创 2021-04-21 10:39:44 · 313 阅读 · 0 评论 -
21-Chrome开发者工具:利用网络面板做性能分析
浏览器中的页面循环系统”模块我们已经介绍完了,循环系统是页面的基础,理解了循环系统能让我们从本质上更好地理解页面的工作方式,加深我们对一些前端概念的理解。 接下来我们就要进入新的模块了,也就是“浏览器中的页面”模块,正如专栏简介中所言,页面是浏览器的核心,浏览器中的所有功能点都是服务于页面的,而 Chrome 开发者工具又是工程师调试页面的核心工具,所以在这个模块的开篇,我想先带你来深入了解下 Chrome 开发者工具。 Chrome 开发者工具(简称 DevTools)是一组...原创 2021-04-21 10:13:17 · 1298 阅读 · 0 评论 -
20-asyncawait:使用同步的方式去写异步代码
在上一篇文章中,我们介绍了怎么使用 Promise 来实现回调操作,使用 Promise 能很好地解决回调地狱的问题,但是这种方式充满了 Promise 的 then() 方法,如果处理流程比较复杂的话,那么整段代码将充斥着 then,语义化不明显,代码不能很好地表示执行流程。 比如下面这样一个实际的使用场景:我先请求极客邦的内容,等返回信息之后,我再请求极客邦的另外一个资源。下面代码展示的是使用 fetch 来实现这样的需求,fetch 被定义在 window 对象中,可以用它来发起对远程资源的请原创 2021-04-20 14:35:36 · 286 阅读 · 0 评论 -
19-Promise:使用Promise,告别回调函数
在上一篇文章中我们聊到了微任务是如何工作的,并介绍了 MutationObserver 是如何利用微任务来权衡性能和效率的。今天我们就接着来聊聊微任务的另外一个应用Promise,DOM/BOM API 中新加入的 API 大多数都是建立在 Promise 上的,而且新的前端框架也使用了大量的 Promise。可以这么说,Promise 已经成为现代前端的 “水” 和 “电”,很是关键,所以深入学习 Promise 势在必行。 不过,Promise 的知识点有那么多,而我们只有一篇文...原创 2021-04-20 14:30:25 · 354 阅读 · 0 评论 -
18-宏任务和微任务:不是所有任务都是⼀个待遇
在前面的几篇文章中,我们介绍了消息队列,并结合消息队列介绍了两种典型的 WebAPI ——setTimeout和XMLHttpRequest,通过这两个 WebAPI 我们搞清楚了浏览器的消息循环系统是怎么工作的。不过随着浏览器的应用领域越来越广泛,消息队列中这种粗时间颗粒度的任务已经不能胜任部分领域的需求,所以又出现了一种新的技术——微任务。微任务可以在实施姓名和效率之间做一个有效的权衡。 从目前的情况来看,微任务已经被广泛地应用,基于微任务的技术有 MutationObs...原创 2021-04-20 13:24:50 · 210 阅读 · 0 评论 -
17-WebAPI:XMLHttpRequest是怎么实现的
在上一篇文章中我们介绍了 setTimeout 是如何结合渲染进程的循环系统工作的,那本篇文章我们就继续介绍另外一种类型的 WebAPI —— XMLHttpRequest。 自从网页中引入了 JavaScript,我们就可以操作 DOM 树中任意一个节点,例如隐藏 / 显示节点、改变颜色、获得或改变文本内容、为元素添加事件响应函数等等,几乎可以 “为所欲为” 了。 不过在 XMLHttpRequest 出现之前,如果服务器数据有更新,依然需要重新刷新整个页面。而 XMLHttpRe...原创 2021-04-20 13:07:59 · 277 阅读 · 0 评论 -
16 WebAPI:setTimeout 是如何实现的?
在上一篇文章中我们介绍了页面中的事件和消息队列,知道了浏览器页面是由消息队列和事件循环系统来驱动的。 那在接下来的两篇文章中,我会通过setTimeout和XMLHttpRequest这两个 WebAPI 来介绍事件循环的应用。这两个 WebAPI 是两种不同类型的应用,比较典型,并且在 JavaScript 中的使用频率非常高。你可能觉得它们太简单、太基础,但有时候恰恰是基础简单的东西才最重要,了解它们是如何工作的会有助于你写出更加高效的前端代码。 本篇文章主要介绍的是...原创 2021-04-20 12:46:29 · 300 阅读 · 0 评论 -
15-消息队列和事件循环:页面是怎么“活”起来的?
前面我们讲到了每个渲染进程都有一个主线程,并且主线程非常繁忙,既要处理DOM,又要计算样式,还要处理布局,同时还需要处理JavaScript任务以及各种输入事件。要让这么多不同类型的任务在主线程中有条不紊地执行,这就需要一个系统来统筹调度这些任务,这个统筹调度系统就是我们今天要讲的消息队列和事件循环系统。 在写这篇文章之前,我翻阅了大量的资料,却发现没有一篇文章能把消息循环系统给讲清楚的,所以我决定用一篇文章来专门介绍页面的事件循环系统。事件循环非常底层且非常重要,学会它能让你理解页面...原创 2021-04-20 11:32:06 · 252 阅读 · 0 评论 -
14-编译器和解释器:V8是如何执行一段JavaScript代码的
站在 JavaScript 引擎 V8 的视角,来分析 JavaScript 代码是如何被执行的。前端工具和框架的自身更新速度非常块,而且还不断有新的出现。要想追赶上前端工具和框架的更新速度,你就需要抓住那些本质的知识,然后才能更加轻松地理解这些上层应用。比如我们接下来要介绍的 V8 执行机制,能帮助你从底层了解 JavaScript,也能帮助你深入理解语言转换器 Babel、语法检查工具 ESLint、前端框架 Vue 和 React 的一些底层实现机制。因此,了解 V8 的编译流程能让你对语言以及相原创 2021-04-20 11:10:02 · 310 阅读 · 0 评论 -
13-垃圾回收:垃圾数据是如何自动回收的?
在上一篇文章中,我们提到了 JavaScript 中的数据是如何存储的,并通过例子分析了原始数据类型是存储在栈空间中的,引用类型的数据是存储在堆空间中的。通过这种分配方式,我们解决了数据的内存分配的问题。 不过有些数据被使用之后,可能就不再需要了,我们把这种数据称为垃圾数据。如果这些垃圾数据一直保存在内存中,那么内存会越用越多,所以我们需要对这些垃圾数据进行回收,以释放有限的内存空间。不同语言的垃圾回收策略 通常情况下,垃圾数据回收分为手动回收和自动回收两种策略。 如 ...原创 2021-04-20 10:48:58 · 1142 阅读 · 0 评论 -
12-栈空间和堆空间:数据是如何存储的
对于前端开发者来说,JavaScript 的内存机制是一个不被经常提及的概念 ,因此很容易被忽视。特别是一些非计算机专业的同学,对内存机制可能没有非常清晰的认识,甚至有些同学根本就不知道 JavaScript 的内存机制是什么但是如果你想成为行业专家,并打造高性能前端应用,那么你就必须要搞清楚JavaScript 的内存机制了。其实,要搞清楚 JavaScript 的内存机制并不是一件很困难的事,在接下来的三篇文章(数据在内存中的存放、JavaScript 处理垃圾回收以及 V8 执行代码)中,我们原创 2021-04-20 10:04:10 · 561 阅读 · 2 评论 -
11-this:从JavaScript执行上下文的视角讲清楚
在上篇文章中,我们讲了词法作用域、作用域链以及闭包,并在最后思考题中留了下面这样一段代码var bar = { myName:"time.geekbang.com", printName: function () { console.log(myName) } }function foo() { let myName = " 极客时间 " return bar.printName}let myName = " 极客邦 "let _原创 2021-04-19 22:09:34 · 212 阅读 · 0 评论 -
10-作用域链和闭包:代码中出现相同的变量,JavaScript引擎如何选择
理解作用域链是理解闭包的基础,而闭包在 JavaScript 中几乎无处不在,同时作用域和作用域链还是所有编程语言的基础。所以,如果你想学透一门语言,作用域和作用域链一定是绕不开的那今天我们就来聊聊什么是作用域链,并通过作用域链再来讲讲什么是闭包。首先我们来看下面这段代码:function bar() { console.log(myName)}function foo() { var myName = " 极客邦 " bar()}var myName = "原创 2021-04-18 23:30:45 · 216 阅读 · 0 评论 -
09-JavaScript执行机制:块级作用域——var缺陷以及为什么要引入let和const?
由于 JavaScript 存在变量提升这种特性,从而导致了很多与直觉不符的代码,这也是 JavaScript 的一个重要设计缺陷。分析为什么在 JavaScript 中会存在变量提升,以及变量提升所带来的问题 介绍如何通过块级作用域并配合 let 和 const 关键字来修复这种缺陷作用域(scope)作用域是指在程序中定义变量的区域,该位置决定了变量的生命周期。通俗地理解,作用域就是变量与函数的可访问范围,即作用域控制着变量和函数的可见性和生命周期。在 ES6 之前,ES 的作用域只原创 2021-04-18 21:50:27 · 253 阅读 · 0 评论 -
08-调用栈:为什么JavaScript代码会出现栈溢出
在上篇文章中,我们讲到了,当一段代码被执行时,JavaScript引擎先会对其进行编译,并创建执行上下文。但是并没有明确说明到底什么样的代码才算符合规范那么接下来我们就来明确下,哪些情况下代码才算是“一段”代码,才会在执行之前就进行编译并创建执行上下文。一般说来,有这么三种情况当JavaScript执行全局代码的时候,会编译全局代码并创建全局执行上下文,而且在整个页面的生存周期内,全局执行上下文只有一份。 当调用一个函数的时候,函数体内的代码会被编译,并创建函数执行上下文,一般情况下,函数执行结束原创 2021-04-18 21:27:37 · 341 阅读 · 1 评论 -
07-变量提升:JavaScript代码是按顺序执行的吗
讲解完宏观视角下的浏览器后,从这篇文章开始,我们就进入下一个新的模块了,这里我会对JavaScript执行原理做深入介绍。今天在该模块的第一篇文章,我们主要讲解执行上下文相关的内容。那为什么先讲执行上下文呢?它这么重要吗?可以这么说,只有理解了JavaScrip的执行上下文,你才能更好地理解JavaScript语言本身,比如变量提升、作用域和闭包等。不仅如此,理解执行上下文和调用栈的概念还能助你成为一名更合格的前端开发者。不过由于我们专栏不是专门讲JavaScript语言的,所以我并不会对JavaS原创 2021-04-18 20:38:22 · 284 阅读 · 0 评论 -
06-渲染流程(下):HTML、CSS和JavaScript是如何变成页面的
在上篇文章中,我们介绍了渲染流水线中的DOM生成、样式计算和布局三个阶段,那今天我们接着讲解渲染流水线后面的阶段。这里还是先简单回顾下上节前三个阶段的主要内容:在HTML页面内容被提交给渲染引擎之后,渲染引擎首先将HTML解析为浏览器可以理解的DOM;然后根据CSS样式表,计算出DOM树所有节点的样式;接着又计算每个元素的几何坐标位置,并将这些信息保存在布局树中#分层现在我们有了布局树,而且每个元素的具体位置信息都计算出来了,那么接下来是不是就要开始着手绘制页面了?答案依然是否定的。因为原创 2021-04-18 17:42:59 · 139 阅读 · 0 评论 -
05-渲染流程(上):HTML、CSS和JavaScript是如何变成页面的
在上一篇文章中我们介绍了导航相关的流程,那导航被提交后又会怎么样呢?就进入了渲染阶段。这个阶段很重要,了解其相关流程能让你“看透”页面是如何工作的,有了这些知识,你可以解决一系列相关的问题,比如能熟练使用开发者工具,因为能够理解开发者工具里面大部分项目的含义,能优化页面卡顿问题,使用JavaScript优化动画流程,通过优化样式表来防止强制同步布局,等等。既然它的功能这么强大,那么今天,我们就来好好聊聊渲染流程。通常,我们编写好HTML、CSS、JavaScript等文件,经过浏览器就会显示出漂亮的原创 2021-04-18 17:14:06 · 160 阅读 · 0 评论 -
04-导航流程:从输入URL到页面展示,这中间发生了什么?
“在浏览器里,从输入 URL 到页面展示,这中间发生了什么? ”这是一道经典的面试题,能比较全面地考察应聘者知识的掌握程度,其中涉及到了网络、操作系统、Web 等一系列的知识。下图是“从输入 URL 到页面展示完整流程示意图”:从图中可以看出,整个过程需要各个进程之间的配合,所以在开始正式流程之前,我们还是先来快速回顾下浏览器进程、渲染进程和网络进程的主要职责。浏览器进程主要负责用户交互、子进程管理和文件储存等功能。 网络进程是面向渲染进程和浏览器进程等提供网络下载功能。 渲染进程的主要原创 2021-04-18 16:46:06 · 211 阅读 · 0 评论 -
03-HTTP请求流程:为什么很多站点第二次打开速度会很快
一个 TCP 连接过程包括了建立连接、传输数据和断开连接三个阶段。而 HTTP 协议,正是建立在 TCP 连接基础之上的。HTTP 是一种允许浏览器向服务器获取资源的协议,是 Web 的基础,通常由浏览器发起请求,用来获取不同类型的文件,例如 HTML 文件、CSS 文件、JavaScript 文件、图片、视频等。此外,HTTP 也是浏览器使用最广的协议,所以要想学好浏览器,就要先深入了解 HTTP。不知道你是否有过下面这些疑问:1.为什么通常在第一次访问一个站点时,打开速度很慢,当再次访问这个原创 2021-04-18 11:09:18 · 560 阅读 · 0 评论 -
02-TCP协议:如何保证页面文件能被完整送达浏览器
https://blog.csdn.net/qq_41887214/article/details/108871016?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog原创 2021-04-18 10:08:11 · 294 阅读 · 0 评论 -
01-Chrome架构:仅仅打开了1个页面,为什么有4个进程
在开始之前,我们一起看下,Chrome打开一个页面需要启动多少进程?你可以点击Chrome浏览器右上角的“选项”菜单,选择“更多工具”子菜单,点击“任务管理器”,这将打开Chrome的任务管理器的窗口,如下图和Windows任务管理器一样,Chrome任务管理器也是用来展示运行中Chrome使用的进程信息的。从图中可以看到,Chrome启动了4个进程,你也许会好奇,只是打开了1个页面,为什么要启动这么多进程呢?在解答这个问题之前,我们需要了解一下进程的概念,不过由于好多人容易把进程和线程的概念混原创 2021-04-18 09:58:10 · 460 阅读 · 0 评论 -
chromium VideoCapture
翻译:https://www.chromium.org/developers/design-documents/video-capture总览 有多个组件允许在Chrome中进行视频捕获Browser端类 支持所有MediaStream用例的通用Render基础结构 本地<video>回放和/或Jingle / WebRtc PeerConnection实现。 在最高级别,视频和音频捕获都被抽象为MediaStream。通过使用适当的参数包调用Ge...原创 2020-08-28 21:39:58 · 517 阅读 · 0 评论 -
cef常用类
CefBrowser 用于表示浏览器窗口的类。 在browser进程中使用时除非在注释中另有说明,否则可以在任何线程上调用此类的方法。 在renderer进程中使用时,此类的方法只能在主线程上调用。 CefBrowser是浏览器窗口类,相当于浏览器的外壳框架窗口,包含向前、向后、加载、获取内部frame的等方法。调用CefBrowserHost的静态方法创建一个CefBrowser对象,表示一个网页窗口。// Class used to represent a br...原创 2020-07-15 19:36:16 · 1644 阅读 · 0 评论 -
Chrome中的GPU加速合成
原文链接:https://www.chromium.org/developers/design-documents/gpu-accelerated-compositing-in-chrome简介:为什么要进行硬件合成? 传统上,Web浏览器完全依靠CPU来呈现网页内容。如今,即使是最小的设备,功能强大的GPU也已成为不可或缺的一部分,人们的注意力已转移到寻找更有效地使用此基础硬件以实现更好的性能和节能的方法。使用GPU合成网页内容可以大大提高速度。硬件合成的好处有以下三种:在涉...原创 2020-07-15 12:49:57 · 2947 阅读 · 0 评论 -
Chrome中的线程与任务
原文链接:https://chromium.googlesource.com/chromium/src/+/master/docs/threading_and_tasks.md Chrome具有多进程体系结构,并且每个进程都是高度多线程的。 在本文档中,我们将介绍每个进程共享的基本线程系统。 主要目标是使主线程(在浏览器进程中也称为“ UI”线程)和IO线程(用于处理IPC的每个进程的线程)保持响应。 这意味着将任何阻塞的I / O或其他昂贵的操作卸载到其他线程。 我们的方...原创 2020-07-14 21:10:47 · 2044 阅读 · 0 评论 -
How Blink works
How Blink works原文链接:https://docs.google.com/document/d/1aitSOucL0VHZa9Z2vbRJSyAIsAz24kX8LFByQ5xQnUg/edit Blink是Web平台的渲染引擎。 简单地说,Blink实现了所有在浏览器选项卡中呈现的内容:实施网络平台的规范(例如HTML标准),包括DOM,CSS和Web IDL嵌入V8并运行JavaScript从基础网络堆栈请求资源建立DOM树计算样式和布局嵌入Chrome合成器并...原创 2020-07-14 18:12:48 · 316 阅读 · 0 评论