热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaScript事情道理(十):襯着引擎和優化機能的技能

到目前為止,在我們之前的“JavaScript事變道理”系列文章中,我們一向關注JavaScript作為一種言語,其功用,它如安在瀏覽器中實行,怎樣優化等等。然則,當您構建Web運

到目前為止,在我們之前的“Javascript事變道理”系列文章中,我們一向關注Javascript作為一種言語,其功用,它如安在瀏覽器中實行,怎樣優化等等。

然則,當您構建Web運用程序時,您不只是編寫自力運轉的自力Javascript代碼。您編寫的Javascript與環境舉行交互。相識這類環境,它是怎樣事變的以及它的構成是什麼,將使您能夠構建更好的運用程序,並對運用程序宣布后能夠湧現的潛伏題目做好充分準備。
《Javascript事情道理(十):襯着引擎和優化機能的技能》

那末,讓我們看看瀏覽器的主要組件是什麼:

  • 用戶界面:這包括地址欄,退卻和行進按鈕,書籤菜單等。實質上,這是瀏覽器顯現的每一個部份,除了您看到網頁自身的窗口。
  • 瀏覽器引擎:它處置懲罰用戶界面和襯着引擎之間的交互
  • 襯着引擎:它擔任顯現網頁。襯着引擎剖析HTML和CSS,並在屏幕上顯現剖析的內容。
  • 收集:這些是收集挪用,比方XHR請求,經由歷程對差別平台運用差別的完成來完成,這些平台位於自力於平台的接口以後。在本系列的前一篇文章中,我們更細緻地議論了收集層。
  • UI後端:用於繪製中心小部件,如複選框和窗口。這個後端公開了一個不是平台特定的通用接口。它運用下面的操作系統UI要領。
  • Javascript引擎:我們在該系列的前一篇文章中細緻引見了這一點。基本上,這是Javascript實行的處所。
  • 數據持久性:您的運用能夠須要在當地存儲一切數據。支撐的存儲機制範例包括localStorage,indexDB,WebSQL和FileSystem。

在這篇文章中,我們將關注襯着引擎,因為它處置懲罰HTML和CSS的剖析和可視化,這是大多數Javascript運用程序不停與之交互的東西。

襯着引擎的概述

襯着引擎的主要職責是在瀏覽器屏幕上顯現請求的頁面。

襯着引擎能夠顯現HTML和XML文檔和圖象。假如您運用分外的插件,引擎還能夠顯現差別範例的文檔,如PDF。

襯着引擎

與Javascript引擎相似,差別的瀏覽器也運用差別的襯着引擎。這些是一些盛行的:

  • Gecko – 火狐
  • WebKit – Safari
  • Blink – Chrome,Opera(從15版最先)

襯着的歷程

襯着引擎從收集層吸收所請求文檔的內容。
《Javascript事情道理(十):襯着引擎和優化機能的技能》

構建DOM樹
襯着引擎的第一步是剖析HTML文檔並將剖析的元素轉換為DOM樹中的現實DOM節點。

設想一下你有以下的筆墨輸入:







Hello, friend!



Smiley face


這個HTML的DOM樹以下所示:
《Javascript事情道理(十):襯着引擎和優化機能的技能》
基本上,每一個元素都被示意為一切其子元素的父節點子元素直接包括在它的內部。

構建CSSOM樹

CSSOM指的是CSS對象模子。當瀏覽器構建頁面的DOM時,它在援用外部theme.css CSS款式表的head部份碰到link標記。估計它能夠須要該資本來顯現頁面,它馬上發出請求。假定theme.css文件包括以下內容:

body {
font-size: 16px;
}
p {
font-weight: bold;
}
span {
color: red;
}
p span {
display: none;
}
img {
float: right;
}

與HTML一樣,引擎須要將CSS轉換為瀏覽器能夠運用的東西 – CSSOM。 以下是CSSOM樹的表面:
《Javascript事情道理(十):襯着引擎和優化機能的技能》

你想曉得為何CSSOM有一個樹構造?當盤算頁面上任何對象的末了一組款式時,瀏覽器從適用於該節點的最平常劃定規矩最先(比方,假如它是body元素的子元素,則運用一切body款式),然後遞歸地細化經由歷程運用更詳細的劃定規矩來盤算款式。

讓我們來看看我們給出的詳細例子。包括在body元素中的span標籤中的任何文本的字體大小為16像素,而且具有赤色。這些款式是從body元素繼承而來的。假如span元素是p元素的子元素,則因為正在運用更詳細的款式,因而不會顯現其內容。

別的請注意,上面的樹不是完全的CSSOM樹,只顯現了我們決定在款式表中重寫的款式。每一個瀏覽器都供應了一組默許的款式,也稱為“user agent styles” – 這是我們在沒有明白供應任何款式時看到的。我們的款式簡樸地掩蓋這些默許值。

構建襯着樹

HTML中的可視指令與CSSOM樹中的款式數據連繫在一起用於豎立襯着樹。

你能夠會問什麼是襯着樹?這是依據它們在屏幕上顯現的遞次構建的視覺元素樹。它是HTML和響應的CSS的可視化示意。此樹的目標是為了以準確的遞次繪製內容。

Webkit中,襯着樹中的每一個節點都被稱為的襯着器或襯着對象。

這就是上述DOM和CSSOM樹的襯着器樹的表面:
《Javascript事情道理(十):襯着引擎和優化機能的技能》

為了構建襯着樹,瀏覽器大抵以下:

  • 從DOM樹的根最先,它遍歷每一個可見節點。某些節點不可見(比方,劇本標記,元標記等),而且因為它們未反映在顯現的輸出中而被疏忽。一些節點經由歷程CSS隱蔽,而且也從襯着樹中省略。比方,span節點 – 在上面的例子中,它並不存在於襯着樹中,因為我們有一個明白的劃定規矩來設置display:none屬性。
  • 關於每一個可見節點,瀏覽器找到恰當的CSSOM劃定規矩並運用它們。
  • 它發出帶有內容及其盤算款式的可見節點

你能夠在這裏看看RenderObject的源代碼(在WebKit中):https://github.com/WebKit/web…

我們來看看這個類的一些中心內容:

class RenderObject : public CachedImageClient {
// Repaint the entire object. Called when, e.g., the color of a border changes, or when a border
// style changes.
Node* node() const { ... }
RenderStyle* style; // the computed style
const RenderStyle& style() const;
...
}

每一個襯着器代表一個矩形地區,一般對應於一個節點的CSS框。它包括多少信息,比方寬度,高度和位置。

襯着樹的規劃

當襯着器被豎立並增加到樹中時,它沒有位置和大小。盤算這些值稱為規劃。

HTML運用基於流程的規劃模子,這意味着大部份時候內它能夠經由歷程一次通報盤算多少。坐標系相干於根襯着器。運用頂部和左邊坐標。

規劃是一個遞歸歷程 – 它從根顯現器最先,它對應於HTML文檔的元素。規劃經由歷程部份或全部襯着器條理構造遞歸地繼承遞歸,為須要它的每一個襯着器盤算多少信息。

根襯着器的位置是0,0,而且其尺寸具有瀏覽器窗口(也稱為視口)的可見部份的尺寸。

最先規劃歷程意味着給每一個節點確實的坐標,它應當湧現在屏幕上。

繪製襯着樹

在此階段中,遍歷襯着器樹並挪用襯着器的paint()要領以在屏幕上顯現內容。

繪畫能夠是全局或增量式(與規劃相似):

  • 全局 – 全部樹被從新繪製。
  • 增量 – 只要一些襯着器以不影響全部樹的體式格局舉行變動。襯着器使其矩形在屏幕上無效。這會致使操作系統將其視為須要重繪和天生繪畫事宜的地區。操作系統經由歷程將幾個地區合併為一個智能體式格局來完成。

平常來說,相識繪畫是一個漸進的歷程是很主要的。為了更好的用戶體驗,襯着引擎會嘗試儘快在屏幕上顯現內容。它不會比及一切的HTML被剖析,才最先構建和安排襯着樹。內容的部份內容將被剖析並顯現,而該歷程繼承堅持來自收集的其他內容項目。

處置懲罰劇本和款式表的遞次

當剖析器抵達標記時,劇本將被馬上剖析並實行。文檔剖析停息,直到劇本實行終了。這意味着該歷程是同步的。

假如劇本是外部的,那末它起首必需從收集中獵取(也是同步的)。一切剖析都邑住手,直到抓取完成。

HTML5增加了一個選項,將劇本標記為異步,以便它能夠被其他線程剖析和實行。

優化襯着機能

假如您想優化您的運用,那末您須要關注五個主要方面。這些是您能夠掌握的地區:

  • Javascript – 在之前的文章中,我們引見了編寫優化代碼的主題,這些代碼不會阻撓UI,內存效率高等等。當觸及襯着時,我們須要斟酌Javascript代碼與DOM元素之間的交互體式格局這一頁。Javascript能夠在UI中豎立大批變動,尤其是在SPA中。
  • 款式盤算 – 這是肯定哪一個CSS劃定規矩適用於基於婚配選擇器的元素的歷程。一旦定義了劃定規矩,就會運用這些劃定規矩,並盤算每一個元素的終究款式。
  • 規劃 – 一旦瀏覽器曉得哪些劃定規矩適用於元素,就能夠最先盤算後者佔用的空間以及它在瀏覽器屏幕上的位置。 Web的規劃模子定義了一個元素能夠會影響其他元素。比方,的寬度會影響其子元素的寬度等等。這一切都意味着規劃歷程是盤算密集型的。該畫圖是在多個條理完成的。
  • Paint – 這是現實像素被添補的位置。該歷程包括繪製文本,色彩,圖象,邊框,暗影等 – 每一個元素的每一個視覺部份。
  • 合成 – 因為頁面部份被劃分為多個圖層,因而須要依據準確的遞次將其繪製到屏幕上,以便頁面顯現準確。這異常主要,特別是關於堆疊元素。

優化您的Javascript

Javascript常常觸發瀏覽器中的視覺變化。當豎立一個SPA時更是如此。

以下是關於Javascript能夠優化哪些部份以改良襯着的一些提醒:

  • 為視覺更新防備setTimeout或setInterval。這些將在框架中的某個點挪用回調,末了能夠會發作。我們想要做的就是在畫面最先時觸發視覺變化,不要錯過它。
  • 如前所述,將長時候運轉的Javascript盤算移至Web Workers。
  • 運用微使命在多個框架中引入DOM變動。這是為了防備使命須要接見DOM,Web Worker不能接見這些使命。這基本上意味着你將一個大使命分解成更小的使命,並依據使命的性子在requestAnimationFrame,setTimeout,setInterval中運轉它們。

優化你的CSS

經由歷程增加和刪除元素,變動屬性等來修正DOM將使瀏覽器從新盤算元素款式,而且在許多狀況下還會全部頁面的規劃或最少部份規劃。

要優化襯着,請斟酌以下幾點:

  • 削減選擇器的複雜性。選擇器的複雜度能夠比盤算元素款式所需的時候多50%,而構建款式自身的其他事變則須要花費凌駕50%的時候。
  • 削減style盤算必需發作的元素數目。實質上,直接對幾個元素舉行款式變動,而不是使全部頁面失效。

優化規劃

瀏覽器的規劃從新盤算能夠異常沉重。斟酌以下優化:

  • 只管削減規劃的數目。當您變動款式時,瀏覽器會搜檢是不是有任何變動請求從新盤算規劃。對屬性(如寬度,高度,左邊,頂部以及一般與多少相干的屬性)的變動須要規劃。所以,只管防備轉變它們。
  • 只管在較早的規劃模子上運用Flexbox。它運轉速率更快,可為您的運用程序製造龐大的機能上風。
  • 防備強迫同步規劃。須要記着的是,在Javascript運轉時,前一幀中的一切舊規劃值都是已知的,可供您查詢。假如你接見box.offsetHeight它不會是一個題目。然則,假如您在接見該框之前變動了框的款式(比方,經由歷程向元素動態增加一些CSS類),瀏覽器必需先運用款式變動並運轉規劃。這能夠異常耗時且消耗資本,因而請只管防備。

優化paint

這一般是一切使命中運轉時候最長的,因而只管防備這類狀況異常主要。以下是我們能夠做的事變:

  • 變動除變更或不透明度之外的任何屬性都邑觸發繪畫。鄭重運用它。
  • 假如觸發layout,則還會觸發paint,因為變動多少圖形會致使元素的視覺變動。
  • 經由歷程圖層提拔和動畫編排來削減繪畫地區。

推荐阅读
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文介绍了解决IE678伪类不兼容问题的方法,包括少用CSS3和HTML5独有的属性,使用CSS hacker,使用last-child清除浮动、批量添加标签、去掉list item最后一个的border-right等技巧。同时还介绍了使用after清除浮动时加上IE独有属性zoom:1的处理方法。另外,本文还提到可以使用jQuery代替批量添加标签的功能,以及使用负边距和CSS2选择器element+element去掉list item最后一个的border-right的方法。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • position属性absolute与relative的区别和用法详解
    本文详细解读了CSS中的position属性absolute和relative的区别和用法。通过解释绝对定位和相对定位的含义,以及配合TOP、RIGHT、BOTTOM、LEFT进行定位的方式,说明了它们的特性和能够实现的效果。同时指出了在网页居中时使用Absolute可能会出错的原因,即以浏览器左上角为原始点进行定位,不会随着分辨率的变化而变化位置。最后总结了一些使用这两个属性的技巧。 ... [详细]
author-avatar
hadley朱_469
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有