前端性能優(yōu)化-更多流行優(yōu)化技術(shù)

一孩饼、拯救移動(dòng)端圖標(biāo) —— SVG

常見(jiàn)的字體方案經(jīng)歷了三種:PNG亲铡、Iconfont才写、SVG。

(一)PNG

先說(shuō)說(shuō)PNG奖蔓,是比較早的方案了赞草。PNG 屬于一種圖片格式,顏色豐富吆鹤、邊緣平滑厨疙,而且還支持透明度,所以最早被設(shè)計(jì)師作為 Icon 輸出的格式疑务,從而沿用到前端代碼中沾凄;但這種圖片icon也存在很大的缺陷:
1、尺寸問(wèn)題知允,必須關(guān)注圖片的寬高撒蟀、比例,以免導(dǎo)致失真温鸽、變形保屯。
2、請(qǐng)求數(shù)量和體積問(wèn)題嗤朴,多個(gè)圖片Icon需要通過(guò)雪碧圖等技術(shù)來(lái)規(guī)避請(qǐng)求數(shù)量,而雪碧圖的應(yīng)用還需要關(guān)心icon的定位虫溜。
3雹姊、靈活性,比較難以使用CSS3中的一些屬性衡楞,效果不佳吱雏。比如:hover敦姻、陰影、transform歧杏、filter镰惦。

(二)Iconfont

Iconfont 是將圖標(biāo)制作成為了字體,從而利用上了字體的諸多優(yōu)點(diǎn)犬绒,基本上能夠規(guī)避 PNG 大部分缺點(diǎn):
1旺入、請(qǐng)求數(shù)量,只需要考慮字體文件的加載即可凯力。
2茵瘾、矢量圖形足夠靈活,像字體能夠使用的 CSS 屬性皆可使用咐鹤,從而不必關(guān)心寬高拗秘、比例等問(wèn)題(只需設(shè)置字體大小即可)。

Iconfont 也存在一個(gè)致命問(wèn)題:Icon 是單色的祈惶,或者僅能使用 CSS3 變色雕旨。
Iconfont 背后原理是怎樣的呢?
1捧请、將Icon制作成字體文件
2凡涩、字符是如何被計(jì)算機(jī)渲染的?通過(guò) i 標(biāo)簽(比較常見(jiàn))血久,并設(shè)置 class 來(lái)添加偽元素突照,而偽元素的值為字體文件中的字形編碼,瀏覽器通過(guò)字形編碼找到字符并渲染出來(lái)的氧吐。

字符是如何被計(jì)算機(jī)渲染的讹蘑?
絕大多數(shù)的字體都包含一個(gè)或多個(gè)Charmap,它的作用是就是把一個(gè)字符從它的字符編碼印射到字形索引筑舅。
一般一個(gè)字符的渲染過(guò)程是這樣的:
1座慰、加載字體文件
2、確定要輸出的字體大小
3翠拣、輸入這個(gè)字符的編碼值
4版仔、根據(jù)字體文件中的 Charmap,把編碼值轉(zhuǎn)換成字形索引(就是這個(gè)字符對(duì)應(yīng)字體文件中的第幾個(gè)形狀)
5误墓、根據(jù)索引從字體中加載這個(gè)字形
6蛮粮、將這個(gè)字形渲染成位圖,有可能進(jìn)行加粗谜慌、傾斜等變換然想。

(三)SVG

SVG 的優(yōu)點(diǎn):
1、作為普通的頁(yè)面元素欣范,更具語(yǔ)義化
2变泄、矢量圖形令哟,足夠靈活
3、保持圖片能力妨蛹,支持彩色圖標(biāo)
4屏富、節(jié)省體積(Iconfont 往往需要一整套字體)

二、最新的布局方案——Grid & Flex

布局經(jīng)歷了幾種方案:table布局蛙卤、傳統(tǒng)布局(float狠半、position、display表窘、盒模型)典予、flex布局、grid布局乐严。
table布局已經(jīng)徹底淘汰了瘤袖,傳統(tǒng)布局PC端還有一些使用,尤其是CSS響應(yīng)式昂验;相較于最新的Grid捂敌、Flex來(lái)說(shuō),兼容性最好既琴,但是效率最低占婉,開(kāi)發(fā)起來(lái)比較麻煩。
當(dāng)下用的最多的是flex布局和grid布局甫恩。
flex布局移動(dòng)端用的特別多逆济,學(xué)習(xí)成本低,開(kāi)發(fā)效率高磺箕,兼容性也還不錯(cuò)奖慌,它依據(jù)某個(gè)軸布局,可以看做是一維布局松靡。
grid布局在水平垂直兩個(gè)方向上同時(shí)控制简僧,可以稱(chēng)之為二維布局。Grid布局非常強(qiáng)大雕欺,但概念也最多岛马,學(xué)習(xí)成本高一些,兼容性不如flex屠列。

(一)flex布局

(1)核心概念
flex 容器(Flex Container)
它是所有flex項(xiàng)的直接父元素啦逆。
我們把一個(gè)元素的display屬性值改為 flex 或者 inline-flex后,這個(gè)元素就會(huì)成為flex容器笛洛,而容器中的直接子元素就會(huì)變?yōu)?flex元素夏志。
flex容器會(huì)有一些屬性,通過(guò)它可以控制flex元素的大小撞蜂、順序盲镶、對(duì)齊以及間隔。

1蝌诡、flex-direction
flex容器最典型的特征就是擁有水平和垂直方向兩個(gè)軸溉贿,它決定了flex容器的主軸是哪個(gè)方向(與主軸相對(duì)的是交叉軸),也就是flex項(xiàng)的排列方向浦旱。
2宇色、flex-wrap
決定flex項(xiàng)是否換行,默認(rèn)是不換行的颁湖,當(dāng)容器小于flex項(xiàng)所需要的面積時(shí)宣蠕,flex項(xiàng)會(huì)等比例縮小。
3甥捺、flex-flow
上面兩個(gè)屬性的簡(jiǎn)寫(xiě)方式抢蚀。
4、justify-content
決定flex項(xiàng)目在主軸上的對(duì)齊方式镰禾。
5皿曲、align-items
決定flex項(xiàng)目在交叉軸上的對(duì)其方式。
6吴侦、align-content
控制“多條主軸”的 flex 項(xiàng)目在交叉軸的對(duì)齊屋休。所謂“多條主軸”是指存在換行。

flex 項(xiàng)(Flex Item)
它是flex容器的直接子元素备韧,也有一些屬性可以控制flex項(xiàng):

1劫樟、order
定義flex項(xiàng)在排列時(shí)的順序,數(shù)值越小優(yōu)先級(jí)越高织堂。
2叠艳、flex-grow
決定了flex項(xiàng)寬度或者高度的增長(zhǎng)系數(shù),它指定了flex容器中剩余空間的多少應(yīng)該分配給項(xiàng)目捧挺,所謂剩余的空間是指flex容器的大小減去所有flex項(xiàng)的大小加起來(lái)的大小虑绵。如果所有的兄弟項(xiàng)目都有相同的flex-grow系數(shù),那么所有的項(xiàng)目將獲得相同的剩余空間闽烙,否則將根據(jù)不同的flex-grow系數(shù)定義的比例進(jìn)行分配翅睛。
3、flex-shrink
決定了flex容器空間不足時(shí)黑竞,flex項(xiàng)目的縮小系數(shù)捕发,與flex-grow相對(duì)。
4很魂、flex-basis
決定了主軸方向上的初始大小扎酷,也就是主軸空間。
有以下幾點(diǎn)需要注意:
單獨(dú)使用 flex-basis遏匆,其實(shí)是定義了最小寬度法挨,當(dāng)內(nèi)容撐大時(shí)谁榜,flex項(xiàng)目也變大。
單獨(dú)使用width凡纳,正常使用窃植。
兩者同時(shí)使用,會(huì)采用較大的寬度荐糜,并且內(nèi)容會(huì)溢出巷怜。(不設(shè)置break-all)
5、flex
屬性2暴氏、3延塑、4的簡(jiǎn)寫(xiě)方式。
6答渔、align-self
決定了flex項(xiàng)目在交叉軸上的排列方向关带,覆蓋flex容器中設(shè)置的align-items。

(二)grid布局

(1)grid 布局的核心概念
1沼撕、網(wǎng)格容器(Grid Container)豫缨,它是所有網(wǎng)格項(xiàng)的直接父元素
2、網(wǎng)格項(xiàng)(Grid Item)端朵,它是網(wǎng)格容器的直接子元素
3好芭、網(wǎng)格線(xiàn)(Grid Line),是組成網(wǎng)格結(jié)構(gòu)的分隔線(xiàn)冲呢,分為水平方向和垂直方向
4舍败、網(wǎng)格單元(Grid cell),由網(wǎng)格線(xiàn)將網(wǎng)格容器切分而成
5敬拓、網(wǎng)格軌跡(Grid track)邻薯,可以簡(jiǎn)單理解為網(wǎng)個(gè)容器的行和列
6、網(wǎng)格區(qū)域(Grid area)乘凸,由網(wǎng)格單元組成的塊

Grid布局主要有兩種元素厕诡,即網(wǎng)格容器和網(wǎng)格項(xiàng),因此就有作用于這兩種元素上的屬性营勤。

(2)網(wǎng)格容器屬性
1灵嫌、display:grid | inline-grid
grid 中的容器元素都是塊級(jí)元素,而inline-grid中的容器元素是行內(nèi)元素葛作。

2寿羞、grid-template-columns 和 grid-template-rows
它們分別用來(lái)定義網(wǎng)格的行和列,它們的取值用來(lái)定義網(wǎng)格的大小赂蠢,而之間的間隔表示網(wǎng)格線(xiàn)绪穆,網(wǎng)格線(xiàn)可以使用中括號(hào)進(jìn)行命名。例如:grid-template-columns: [firstline] 40px [secondline] 40px [thirdline] 40px [endline]。
對(duì)于重復(fù)的取值可以用 repeat 函數(shù)簡(jiǎn)寫(xiě)玖院,例如:grid-template-columns: 40px 40px 40px等價(jià)為repeat(3, 40px)菠红。
再來(lái)看看有取值有哪些單位:
傳統(tǒng)單位,例如:px难菌、百分比途乃、auto等等
fr,這是網(wǎng)格特有的單位扔傅,表示行和列中可用空間的一等份。

3烫饼、grid-template-areas猎塞,用來(lái)定義網(wǎng)格區(qū)域。

上述網(wǎng)格容器屬性就是將網(wǎng)格分割成行列杠纵,而行列又可以組成區(qū)域荠耽。劃分好區(qū)域以后,我們就可以利用網(wǎng)格項(xiàng)屬性將區(qū)域分配給網(wǎng)格項(xiàng)比藻。

4铝量、column-gap、row-gap用來(lái)定義行列之間的間隔银亲。
5慢叨、justify-items用來(lái)定義網(wǎng)格單元的水平對(duì)齊方式。
6务蝠、align-items用來(lái)定義網(wǎng)格單元的垂直對(duì)齊方式拍谐。
7、place-items 是上述兩個(gè)屬性的簡(jiǎn)寫(xiě)方式馏段。
8轩拨、justify-content用來(lái)定義容器內(nèi)容的水平排布方式。
9院喜、align-content用來(lái)定義容器內(nèi)容的垂直排布方式亡蓉。
10、place-content是上述兩個(gè)屬性的簡(jiǎn)寫(xiě)方式喷舀。
11砍濒、grid-auto-columns為那些隱式列指明寬度。
12硫麻、grid-auto-rows為那些隱式行指明高度梯影。
13、grid-auto-flow為那些沒(méi)有分配區(qū)域的網(wǎng)格項(xiàng)指明流動(dòng)方式庶香,是按行流動(dòng)還是按列流動(dòng)甲棍。

(3)網(wǎng)格項(xiàng)屬性
1、grid-column-start、grid-column-end感猛、grid-row-start七扰、grid-row-end都是描述網(wǎng)格線(xiàn)的,通過(guò)這四個(gè)屬性可以畫(huà)出一個(gè)區(qū)域陪白,而這個(gè)區(qū)域即分配給了網(wǎng)格項(xiàng)颈走。
2、grid-column咱士、grid-row為上述四個(gè)屬性的簡(jiǎn)寫(xiě)屬性立由。
3、grid-area為上述四個(gè)屬性的進(jìn)一步簡(jiǎn)寫(xiě)形式序厉,同時(shí)其值也可以直接寫(xiě)為區(qū)域名稱(chēng)锐膜。
4、justify-self指明網(wǎng)格項(xiàng)自身的水平對(duì)齊方式弛房。
5道盏、align-self指明網(wǎng)格項(xiàng)自身的垂直對(duì)齊方式。
6文捶、place-self是上述兩個(gè)屬性的簡(jiǎn)寫(xiě)屬性荷逞。

三、優(yōu)化資源加載的順序

1粹排、Preload

<link rel="preload" href="test.jpg">

2种远、Prefetch包括資源預(yù)加載、DNS預(yù)解析顽耳、http預(yù)連接和頁(yè)面預(yù)渲染院促。
資源預(yù)加載:<link rel="prefetch" href="test.css">
DNS預(yù)解析:<link rel="dns-prefetch" >
http預(yù)連接:<link rel="prefetch" > 將建立對(duì)該域名的TCP鏈接
頁(yè)面預(yù)渲染:<link rel="prerender" > 將會(huì)預(yù)先加載鏈接文檔的所有資源
那么Prefetch和Preload有什么區(qū)別呢?
具體來(lái)講斧抱,Preload來(lái)告訴瀏覽器預(yù)先請(qǐng)求當(dāng)前頁(yè)需要的資源常拓,從而提高這些資源的請(qǐng)求優(yōu)先級(jí)。比如辉浦,對(duì)于那些本來(lái)請(qǐng)求優(yōu)先級(jí)較低的關(guān)鍵請(qǐng)求弄抬,我們可以通過(guò)設(shè)置Preload來(lái)提升這些請(qǐng)求的優(yōu)先級(jí)。
Prefetch來(lái)告訴瀏覽器用戶(hù)將來(lái)可能在其他頁(yè)面(非本頁(yè)面)可能使用到的資源宪郊,那么瀏覽器會(huì)在空閑時(shí)掂恕,就去預(yù)先加載這些資源放在http緩存內(nèi),最常見(jiàn)的dns-prefetch弛槐。比如懊亡,當(dāng)我們?cè)跒g覽A頁(yè)面,如果會(huì)通過(guò)A頁(yè)面中的鏈接跳轉(zhuǎn)到B頁(yè)面乎串,而B(niǎo)頁(yè)面中我們有些資源希望盡早提前加載店枣,那么我們就可以在A(yíng)頁(yè)面里添加這些資源Prefetch,那么當(dāng)瀏覽器空閑時(shí),就會(huì)去加載這些資源鸯两。
所以闷旧,對(duì)于那些可能在當(dāng)前頁(yè)面使用到的資源可以利用Preload,而對(duì)一些可能在將來(lái)的某些頁(yè)面中被使用的資源可以利用Prefetch钧唐。如果從加載優(yōu)先級(jí)上看忙灼,Preload會(huì)提升請(qǐng)求優(yōu)先級(jí);而Prefetch會(huì)把資源的優(yōu)先級(jí)放在最低钝侠,當(dāng)瀏覽器空閑時(shí)才去預(yù)加載该园。

資源加載優(yōu)先級(jí)可以放在首屏資源優(yōu)化中,通過(guò)首屏那一幀找出對(duì)應(yīng)的關(guān)鍵請(qǐng)求鏈帅韧,然后調(diào)整這些資源的加載優(yōu)先級(jí)可以提高首屏加載速度里初。

另外,首屏速度也可以基于關(guān)鍵請(qǐng)求鏈做文章弱匪,從Localstorage、緩存等角度著手璧亮。

四萧诫、預(yù)渲染優(yōu)化頁(yè)面首屏

大型單頁(yè)應(yīng)用的性能瓶頸:JS下載 + 解析 + 執(zhí)行
可以通過(guò) SSR 來(lái)優(yōu)化,但存在問(wèn)題:需要犧牲 TTFB 來(lái)補(bǔ)救 First Paint枝嘶,實(shí)現(xiàn)起來(lái)也更加復(fù)雜帘饶。
可以通過(guò)預(yù)渲染來(lái)解決首屏問(wèn)題,Pre-rendering 打包時(shí)提前渲染頁(yè)面群扶,沒(méi)有服務(wù)端參與及刻。

五、通過(guò) windowing 優(yōu)化大型列表的渲染

加載大的列表竞阐、大表單的每一行嚴(yán)重影響性能缴饭,Lazy loading 仍然會(huì)讓 DOM 變得很大。
可以參考 react-window 的做法骆莹,它僅僅渲染大數(shù)據(jù)中的部分?jǐn)?shù)據(jù)(僅僅填滿(mǎn)視窗)的方法颗搂,從而解決一些常見(jiàn)的問(wèn)題:
1、減少初始渲染和數(shù)據(jù)更新時(shí)的節(jié)點(diǎn)數(shù)量幕垦,從而獲得一個(gè)更好的滾動(dòng)體驗(yàn)
2丢氢、減少內(nèi)存占用,從而避免大量DOM節(jié)點(diǎn)引起的內(nèi)存泄露

六先改、使用骨架組件減少布局移動(dòng)(Layout Shift)

骨架組件(Skeleton/Placeholder)的作用:
1疚察、占位
2、提升用戶(hù)感知性能
注意:Placeholder要根據(jù)要替換的組件進(jìn)行定制仇奶,從而避免 Layout Shift貌嫡。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子衅枫,更是在濱河造成了極大的恐慌嫁艇,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弦撩,死亡現(xiàn)場(chǎng)離奇詭異步咪,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)益楼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)猾漫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人感凤,你說(shuō)我怎么就攤上這事悯周。” “怎么了陪竿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵禽翼,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我族跛,道長(zhǎng)闰挡,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任礁哄,我火速辦了婚禮长酗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘桐绒。我一直安慰自己夺脾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布茉继。 她就那樣靜靜地躺著咧叭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪烁竭。 梳的紋絲不亂的頭發(fā)上佳簸,一...
    開(kāi)封第一講書(shū)人閱讀 52,196評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音颖变,去河邊找鬼生均。 笑死,一個(gè)胖子當(dāng)著我的面吹牛腥刹,可吹牛的內(nèi)容都是我干的马胧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼衔峰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼佩脊!你這毒婦竟也來(lái)了蛙粘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤威彰,失蹤者是張志新(化名)和其女友劉穎出牧,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體歇盼,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舔痕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了豹缀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伯复。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖邢笙,靈堂內(nèi)的尸體忽然破棺而出啸如,到底是詐尸還是另有隱情,我是刑警寧澤氮惯,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布叮雳,位于F島的核電站,受9級(jí)特大地震影響妇汗,放射性物質(zhì)發(fā)生泄漏帘不。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一铛纬、第九天 我趴在偏房一處隱蔽的房頂上張望厌均。 院中可真熱鬧唬滑,春花似錦告唆、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至稻艰,卻和暖如春懂牧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尊勿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工僧凤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人元扔。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓躯保,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親澎语。 傳聞我的和親對(duì)象是個(gè)殘疾皇子途事,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 作者:北風(fēng)菌 鏈接:https://juejin.im/post/6876623829574090760 來(lái)源:掘...
    碼匠編程閱讀 397評(píng)論 0 0
  • 以下題目都是在面試過(guò)程中整理的 答案不是標(biāo)準(zhǔn)尸变。如有雷同純屬耦合义图,可與博主及時(shí)聯(lián)系 1、基本數(shù)據(jù)類(lèi)型和引用數(shù)據(jù)類(lèi)型 ...
  • 一召烂、PC端優(yōu)化策略 主要包括網(wǎng)絡(luò)加載類(lèi)碱工、頁(yè)面渲染類(lèi)、CSS優(yōu)化類(lèi)骑晶、JavaScript執(zhí)行類(lèi)痛垛、緩存類(lèi)、圖片類(lèi)桶蛔、架...
    沒(méi)糖_cristalle閱讀 474評(píng)論 0 0
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月匙头,有人笑有人哭,有人歡樂(lè)有人憂(yōu)愁仔雷,有人驚喜有人失落蹂析,有的覺(jué)得收獲滿(mǎn)滿(mǎn)有...
    陌忘宇閱讀 8,542評(píng)論 28 53
  • 信任包括信任自己和信任他人 很多時(shí)候,很多事情碟婆,失敗电抚、遺憾、錯(cuò)過(guò)竖共,源于不自信蝙叛,不信任他人 覺(jué)得自己做不成,別人做不...
    吳氵晃閱讀 6,191評(píng)論 4 8