版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
歷年前端大廠面試必備(一)
一、HTML/CSS篇
1、如何刷新瀏覽器的應(yīng)用緩存?
【僅供參考】
應(yīng)用緩存通過變更,”標(biāo)簽后的版本號(hào)來刷新,如下所示:
CACHEMANIFEST
#version2.0
/icketang.css
/icketang.js
/icketang.png
NETWORK:
login,php
2、HTML5如何實(shí)現(xiàn)跨域?
【僅供參考】
在服務(wù)器端設(shè)置允許在其他域名下訪問,例如允許所有域名訪問以下內(nèi)容。
response.setHeader(z,Access-Control-Allow-Originzz,〃*〃);
response.setHeader(zzAccess-Control-Allow-Methodsz/,“POST");
response.setHeader(,zAccess-Control-Allow-Headers,z,z,x-requested-with,content-
type");
3、與HTML4比較,HTML5廢棄了哪些元素?
【僅供參考】
廢棄的元素包括frame>frameset、noframe>applet、big>center和basefonto
4、如果把HTML5看成一個(gè)開放平臺(tái),它的構(gòu)建模塊有哪些?
【僅供參考】
如果把HTML5看成一個(gè)開放平臺(tái),它的構(gòu)建模塊至少包括以下幾個(gè),如<navXheader><section>
<footer>0
Wnav>標(biāo)簽用來將具有導(dǎo)航性質(zhì)的鏈接劃分在一起,使代碼結(jié)構(gòu)在語(yǔ)義化方面更加準(zhǔn)確
〈header》標(biāo)簽用來定義文檔的頁(yè)眉。
〈section〉標(biāo)簽用來描述文檔的結(jié)構(gòu)。
(footer》標(biāo)簽用來定義頁(yè)腳。在典型情況下,該元素會(huì)包含文檔作者的姓名、文檔的創(chuàng)作日期
和聯(lián)系信息
5、請(qǐng)你說一下WebWorker和WebSocket的作用。
【僅供參考】
第1/26頁(yè)
WebWorker的作用如下:
(1)通過worker=newWorker(url)加載一個(gè)JavaScript文件,創(chuàng)建一個(gè)Worker,同時(shí)返
回一個(gè)Worker實(shí)例
(2)用worker.postMessage(data)向Worker發(fā)送數(shù)據(jù)
(3)綁定worker,onmessage接收Worker發(fā)送過來的數(shù)據(jù)
(4)可以使用worker,terminate()終止一個(gè)Worker的執(zhí)行。
WebSocket的作用如下。
它是Web應(yīng)用程序的傳輸協(xié)議,提供了雙向的、按序到達(dá)的數(shù)據(jù)流。它是HTML5新增的協(xié)議,
WebSocket的連接是持久的,它在客戶端和服務(wù)器之間保持雙工連接,服務(wù)器的更新可以及時(shí)推
送到客戶端,而不需要客戶端以一定的時(shí)間間隔去輪詢。
6、本地存儲(chǔ)的數(shù)據(jù)有生命周期嗎?
【僅供參考】
本地存儲(chǔ)的數(shù)據(jù)沒有生命周期,它將一直存儲(chǔ)數(shù)據(jù),直到用戶從瀏覽器清除或者使用
JavaScript代碼移除。
7、應(yīng)用緩存中的回退是什么?
【僅供參考】
應(yīng)用緩存中的回退會(huì)幫助你指定在服務(wù)器不可訪問時(shí),顯示某文件。例如在下面的manifest文
件中,如果用戶輸入了“/home”,同時(shí)服務(wù)器不可到達(dá),“404htm”文件應(yīng)送達(dá)。
FALLBACK:
/home//404.html
8、HTML5新增了哪些功能AP?
【僅供參考】
新增的功能API包括MediaAPI、TextTrackAPI、ApplicationCacheAPI、User
Interaction、DataTransferAPI、CommandAPI、ConstraintValidationAPI、History
API
9、如何在頁(yè)面上實(shí)現(xiàn)一個(gè)圓形的可點(diǎn)擊區(qū)域
【僅供參考】
1map+area或者svg
2、border-radius
3、純js實(shí)現(xiàn),一個(gè)點(diǎn)不在圓上的算法
10、簡(jiǎn)述一下你對(duì)HTML語(yǔ)義化的理解?
【僅供參考】
用正確的標(biāo)簽做正確的事情。
html語(yǔ)義化讓頁(yè)面的內(nèi)容結(jié)構(gòu)化,結(jié)構(gòu)更清晰,便于對(duì)瀏覽器、搜索引擎解析;即使在沒有樣
式CSS情況下也以一種文檔格式顯示,并且是容易閱讀的;
第2/26頁(yè)
搜索引擎的爬蟲也依賴于HTML標(biāo)記來確定上下文和各個(gè)關(guān)鍵字的權(quán)重,利于SEO;
使閱讀源代碼的人對(duì)網(wǎng)站更容易將網(wǎng)站分塊,便于閱讀維護(hù)理解。
11、如何實(shí)現(xiàn)瀏覽器內(nèi)多個(gè)標(biāo)簽頁(yè)之間的通信?
【僅供參考】
在標(biāo)簽頁(yè)之間,調(diào)用localstorge.cookies等數(shù)據(jù)存儲(chǔ),可以實(shí)現(xiàn)標(biāo)簽頁(yè)之間的通信
12、什么是SVG?
【僅供參考】
SVG即可縮放失量圖形(ScalableVectorGraphics)0它是基于文本的圖形語(yǔ)言,使用文
本、線條、點(diǎn)等來繪制圖像,這使得它輕便、顯示迅速。
13、子元素如何垂直水平居中?你會(huì)用哪幾種方式?不使用margin和padding的情況下
【僅供參考】
方法一:使用flex,無論子元素是行級(jí)元素還是塊級(jí)元素,都能搞定
.parent{
display:flex;
justify-content:center;//水平居中
align-items:center;//垂直居中
)
方法二:如果子元素是行級(jí)元素,text-align和line-height就可以解決
.parent{
height:200px;
width:200px;
text-align:center;
line-height:200px;//Sameasheight
)
如果子元素是塊級(jí)元素,使用table-cell+vertical-align也可以解決
.parent{
display:table-cell;
vertical-align:middle;
)
.child{
margin:0auto;
)
方法三:transform可以解決
第3/26頁(yè)
.parent{
position:relative;
)
.child{
position:absolute;
top:50%;
left:50%;11從相對(duì)父元素寬高50%的地方開始繪制子元素
transform:translate(-50%,-50%);//把繪制好的子元素,往上和左邊,平移子元素50%
的寬高
)
14、無樣式內(nèi)容閃爍(FOUC)FlashofUnstyleContent**
【僅供參考】
@import導(dǎo)入CSS文件會(huì)等到文檔加載完后再加載CSS樣式表。因此,在頁(yè)面DOM加載完成到CSS導(dǎo)
入完成之間會(huì)有一段時(shí)間頁(yè)面上的內(nèi)容是沒有樣式的。
解決方法:使用link標(biāo)簽加載CSS樣式文件。因?yàn)閘ink是順序加載的,這樣頁(yè)面會(huì)等到CSS下載
完之后再下載HTML文件,這樣先布局好,就不會(huì)出現(xiàn)F0UC問題。
15、vertical-align什么時(shí)候生效
【僅供參考】
父元素(inline-block\block)必須含有l(wèi)ine-height(inline元素有無皆可),子元素中的
(inline-block/inline元素)vertical-align才能起作用
當(dāng)父元素沒有設(shè)置line-height時(shí),只對(duì)行內(nèi)元素的兄弟元素對(duì)齊有用,無法子元素居中對(duì)齊父
元素
16、我們會(huì)在寫css的時(shí)候做一些標(biāo)簽選擇器的初始化樣式?為什么?比如:
【僅供參考】
body,ul,ol,li,p,hl,h2,h3,h4,h5,h6,form,fieldset,table,td,img,div{margin:0;padding:0
;border:。;}
body{background:#fff;color:#333;font-size:12px;margin-top:5px;font-
family:"SimSun","宋體","ArialNarrow”;}
ul,ol{list-style-type:none;}
select,input,img,select{vertical-align:middle;}
a{text-decoration:none;}
a:link{color:#009;}
a:visited{color:#800080;}
a:hover,a:active,a:focus{color:4c00;text-decoration:underline;}
第4/26頁(yè)
為了保證默認(rèn)的標(biāo)簽樣式在不同瀏覽器能有一致的效果
17、如何讓文字換行
【僅供參考】
word-wrap,word-break,white-space都可以做到
word-wrap:normal;遇到空格才換行
word-break:break-all;把所有字符(包括空格)當(dāng)一行,遇到邊界換行
word-break:break-word;先按空格換行,再拆分單詞和word-wrap:break-word一樣
white-space:normal;正常遇到空白換行
white-space:no-wrap;空白都不換行,一行顯示所有
word-wrap和word-break在flex布局下的效果,word-wrap不能換行,word-break可以。
但是如果二者都有width或者min-widt邸艮制,效果一樣。
〈divstyle二〃border:lpxsolidred;width:200px;height:200px;display:flex;〃>
〈divstyle="flex:1;word-wrap:break-
word;z/>dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd</div>
〈divstyle="min-width:lOOpx;border:lpxsolidgreen,z>sss</div>
</div>
〈divstyle二〃border:lpxsolidred;width:200px;height:200px;display:flex;〃>
〈divstyle二〃flex:1;word-break:break-
word;,z>dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd</div>
〈divstyle="min-width:lOOpx;border:lpxsolidgreenzz>sss</div>
</div>
18、移動(dòng)端lpx邊框怎么設(shè)置
【僅供參考】
/*方法1*/
.border{
width:100%;
height:lpx;
background:red;
}
/*方法2*/
,border(
border-image:url(border.png)
)
/*方法3*/
第5/26頁(yè)
.border{
box-shadow:000lpx#000;
)
19、CSSSprite(雪碧圖,精靈圖)是什么,談?wù)勥@個(gè)技術(shù)的優(yōu)缺點(diǎn)?
【僅供參考】
就是把很多圖標(biāo)合并到一張圖上,然后根據(jù)圖片的位置(background-position)加上顯示的寬
高來控制具體用哪個(gè)圖標(biāo),這樣可以減少網(wǎng)絡(luò)請(qǐng)求,但是制作和使用會(huì)顯得復(fù)雜一些。
20、calc,support,media各自的含義及用法?
【僅供參考】
?support主要是用于檢測(cè)瀏覽器是否支持CSS的某個(gè)屬性,其實(shí)就是條件判斷,如果支持某個(gè)
屬性,你可以寫一套樣式,如果不支持某個(gè)屬性,你也可以提供另外一套樣式作為替補(bǔ)。
calc()函數(shù)用于動(dòng)態(tài)計(jì)算長(zhǎng)度值。calc()函數(shù)支持“+”,,“*”,“/”運(yùn)算;
?media查詢,你可以針對(duì)不同的媒體類型定義不同的樣式。
二、JS/ES6/TS篇
1、請(qǐng)說一下你常用的字符串方法(至少七個(gè))
【僅供參考】
trimO:去首尾空格
split(sep,limit):將字符串分割為字符數(shù)組,limit為從頭開始執(zhí)行分割的最大數(shù)量
indexOf(str):返回str在父串中第一次出現(xiàn)的位置,若沒有則返回T
lastlndexOf(str):返回str在父串中最后一次出現(xiàn)的位置,若沒有則返回T
substr(start,length):從字符索引start的位置開始,返回長(zhǎng)度為length的子串
substring(from,to):返回字符索引在from和to(不含)之間的子串
slice(start,end):返回字符索引在start和end(不含)之間的子串
toLowerCase():將字符串轉(zhuǎn)換為小寫
toUpperCaseO:將字符串轉(zhuǎn)換為大寫
replace(strl,str2):strl也可以為正則表達(dá)式,用str2替換strl
concat(strl,str2,...):連接多個(gè)字符串,返回連接后的字符串的副本
match(regex):搜索字符串,并返回正則表達(dá)式的所有匹配
charAt(index):返回指定索引處的字符串
charCodeAt(index):返回指定索引處的字符的Unicode的值
fromCharCode():將Unicode值轉(zhuǎn)換成實(shí)際的字符串
search(regex):基于正則表達(dá)式搜索字符串,并返回第一個(gè)匹配的位置
valueOfO:返回原始字符串值
2、for循環(huán)與forEach循環(huán)的區(qū)別?
【僅供參考】
第6/26頁(yè)
for循環(huán)中可以使用break、continue不用使用return因?yàn)樗醒h(huán)體,且不是函數(shù);
forEach循環(huán)不能使用break、continue,可以return,因?yàn)樗鼒?zhí)行的是函數(shù);
3、怎么降維數(shù)組[[1,2],[3,4]]->[1,2,3,4]
【僅供參考】
使用遞歸循環(huán),把所有元素放到一個(gè)新數(shù)組
Array,prototype,concat.apply(口,[[1,2],[3,41]);
4、如何使用JS刪除cookie
【僅供參考】
如果要?jiǎng)h除cookie以便后續(xù)嘗試讀取cookie,則只需將過期日期設(shè)置為過去的時(shí)間。
咱們應(yīng)該定義cookie路徑以確保刪除正確的cookie。
如果未指定路徑,某些瀏覽器將不允許咱們刪除cookie
5、圖片img標(biāo)簽title與alt屬性的區(qū)別
【僅供參考】
title屬性:光標(biāo)移入要顯示圖片文字
alt屬性:當(dāng)圖片加載失敗時(shí)要顯示的文字
6、var、let、const區(qū)別?
【僅供參考】
var存在變量提升。
let只能在塊級(jí)作用域內(nèi)訪問。
const用來定義常量,必須初始化,不能修改(對(duì)象特殊)
7、基本數(shù)據(jù)類型和引用數(shù)據(jù)類型有什么區(qū)別?
【僅供參考】
(1)變量直接賦值時(shí):
基本數(shù)據(jù)類型賦值的是數(shù)據(jù)的副本,原數(shù)據(jù)的更改不會(huì)影響傳入后的數(shù)據(jù)。
引用數(shù)據(jù)類型賦值的是數(shù)據(jù)的引用地址,原數(shù)據(jù)的更改會(huì)影響傳入后的數(shù)據(jù)。
(2)兩者在內(nèi)存中的存儲(chǔ)位置:
基本數(shù)據(jù)類型存儲(chǔ)在棧中。
引用數(shù)據(jù)類型在棧中存儲(chǔ)了指針,該指針指向的數(shù)據(jù)實(shí)體存儲(chǔ)在堆中。
8^toStringO與valueOf()的區(qū)別
【僅供參考】
toStringO方法返回一個(gè)表示該對(duì)象的字符串。
valueOfO方法返回指定對(duì)象的原始值,如果對(duì)象沒有原始值,貝UvalueOf將返回對(duì)象本身
9、null/undefined的區(qū)別
第7/26頁(yè)
【僅供參考】
null值:屬于null類型,代表“空值〃,代表一個(gè)空對(duì)象指針;使用typeof運(yùn)算得到
“object”,所以你可以認(rèn)為它是一個(gè)特殊的對(duì)象值。
undefined值:屬于undefined類型,當(dāng)一個(gè)聲明的變量未初始化賦值時(shí),得到的就是
undefinedo使用typeof運(yùn)算得到"undefined",
10、事件綁定和普通事件有什么區(qū)別?
【僅供參考】
普通事件會(huì)覆蓋掉,只執(zhí)行后者方法
dom.onelick=function(){}
事件綁定不會(huì)覆蓋掉,會(huì)依次執(zhí)行
addEventListener('click),function(){},true)
11、請(qǐng)說出三種減低頁(yè)面加載時(shí)間的方法
【僅供參考】
壓縮css、js文件
合并js、css文件,減少http請(qǐng)求(精靈圖)
外部js、css文件放在最底下
減少dom操作,盡可能用變量替代不必要的dom操作
12、說一下innerHTML與innerText的作用與區(qū)別?
【僅供參考】
作用:都可以獲取或者設(shè)置元素的內(nèi)容
區(qū)別:innerHTML可以解析內(nèi)容中的html標(biāo)簽
innerText不能解析內(nèi)容中的html標(biāo)簽
13、如何在TypeScript中實(shí)現(xiàn)繼承
【僅供參考】
繼承是一種從另一個(gè)類獲取一個(gè)類的屬性和行為的機(jī)制。繼承成員的類稱為基類,繼承這些成
員的類稱為派生類。
classShape{
Area:number
constructor(area:number){
this.Area=area
)
)
classCircleextendsShape{
display():void{
console,log(“圓的面積:“+this.Area)
第8/26頁(yè)
varobj=newCircle(320);
obj.display()
14、TypeScript中?.,??,!:,_,**等符號(hào)的含義?
【僅供參考】
?.可選鏈
??類似與短路或,??避免了一些意外情況,0,NaN以及〃",false被視為false值。只有
undefind,null被視為false值。
!.在變量名后添加!,可以斷言排除undefined和null類型
_,聲明該函數(shù)將被傳遞一個(gè)參數(shù),但您并不關(guān)心它
!:待會(huì)分配這個(gè)變量,ts不要擔(dān)心
**求累
15、TypeScript支持哪些面向?qū)ο蟮男g(shù)語(yǔ)
【僅供參考】
1.模塊
2.類
3.接口
4.繼承
5.數(shù)據(jù)類型
6.成員函數(shù)
16、TS的接口是什么意思?
【僅供參考】
接口是在我們的應(yīng)用程序中充當(dāng)契約的結(jié)構(gòu),它定義了要遵循的類的語(yǔ)法,這意味著實(shí)現(xiàn)接口的
類必須實(shí)現(xiàn)它的所有成員.它不能被實(shí)例化,但是可以被實(shí)現(xiàn)它的類對(duì)象引用。
interfaceinterface_name{
//字段聲明
//方法聲明
17、枚舉和常量枚舉的區(qū)別?
【僅供參考】
枚舉會(huì)被編譯時(shí)會(huì)編譯成一個(gè)對(duì)象,可以被當(dāng)作對(duì)象使用
const枚舉會(huì)在typescript編譯期間被刪除,const枚舉成員在使用的地方會(huì)被內(nèi)聯(lián)進(jìn)來,
避免額外的性能開銷
18、下面Set結(jié)構(gòu),打印出的size值是多少
【僅供參考】
lets=newSet();
第9/26頁(yè)
s.add([l]);s.add([l]);
console.log(s.size);
答案:2
兩個(gè)數(shù)組[1]并不是同一個(gè)值,它們分別定義的數(shù)組,在內(nèi)存中分別對(duì)應(yīng)著不同的存儲(chǔ)地址,因
此并不是相同的值都能存儲(chǔ)到Set結(jié)構(gòu)中,所以size為2
19、理解async/await以及對(duì)Generator的優(yōu)勢(shì)
【僅供參考】
async/await的介紹:
asyncawait是用來解決異步的,async函數(shù)是Generator函數(shù)的語(yǔ)法糖
使用關(guān)鍵字async來表示,在函數(shù)內(nèi)部使用await來表示異步
async函數(shù)返回一個(gè)Promise對(duì)象,可以使用then方法添加回調(diào)函數(shù)
當(dāng)函數(shù)執(zhí)行的時(shí)候,一旦遇到await就會(huì)先返回,等到異步操作完成,
再接著執(zhí)行函數(shù)體內(nèi)后面的語(yǔ)句
async較Generator的優(yōu)勢(shì):
(1)內(nèi)置執(zhí)行器。Generator函數(shù)的執(zhí)行必須依靠執(zhí)行器,而Aysnc函數(shù)自帶執(zhí)行器,
調(diào)用方式跟普通函數(shù)的調(diào)用一樣
(2)更好的語(yǔ)義。async和await相較于*和yield更加語(yǔ)義化
(3)返回值是Promise。async函數(shù)返回的是Promise對(duì)象,
比Generator函數(shù)返回的Iterator對(duì)象方便,可以直接使用then0方法進(jìn)行調(diào)用
20、Promise構(gòu)造函數(shù)是同步執(zhí)行還是異步執(zhí)行,那么then方法呢?
【僅供參考】
創(chuàng)建Promise時(shí),傳入的回調(diào)函數(shù)的執(zhí)行,是同步的
promise對(duì)象上then函數(shù)中的回調(diào)執(zhí)行,是異步的
三、Vue/ReactjB
1、什么是propdrilling,如何避免?
【僅供參考】
在構(gòu)建React應(yīng)用程序時(shí),在多層嵌套組件來使用另一個(gè)嵌套組件提供的數(shù)據(jù)。最簡(jiǎn)單的方法
是將一個(gè)prop從每個(gè)組件一層層的傳遞下去,從源組件傳遞到深層嵌套組件,這叫做prop
drillingo
propdrilling的主要缺點(diǎn)是原本不需要數(shù)據(jù)的組件變得不必要地復(fù)雜,并且難以維護(hù)。
為了避免propdrilling,一種常用的方法是使用ReactContext0通過定義提供數(shù)據(jù)的
Provider組件,并允許嵌套的組件通過Consumer組件或useContextHook使用上下文數(shù)據(jù)
2、解釋Reducer的作用
【僅供參考】
第10/26頁(yè)
Reducers是純函數(shù),它規(guī)定應(yīng)用程序的狀態(tài)怎樣因響應(yīng)ACTION而改變。Reducers通過接受
先前的狀態(tài)和action來工作,然后它返回一個(gè)新的狀態(tài)。它根據(jù)操作的類型確定需要執(zhí)行哪
種更新,然后返回新的值。如果不需要完成任務(wù),它會(huì)返回原來的狀態(tài)
3、你對(duì)“單一事實(shí)來源”有什么理解?
【僅供參考】
Redux使用“Store”將程序的整個(gè)狀態(tài)存儲(chǔ)在同一個(gè)地方。因此所有組件的狀態(tài)都存儲(chǔ)在
Store中,并且它們從Store本身接收更新。單一狀態(tài)樹可以更容易地跟蹤隨時(shí)間的變化,并
調(diào)試或檢查程序
4、這三個(gè)點(diǎn)(...)在React干嘛用的?
【僅供參考】
擴(kuò)展運(yùn)算符或者叫展開操作符,對(duì)于創(chuàng)建具有現(xiàn)有對(duì)象的大多數(shù)屬性的新對(duì)象非常方便,在更
新state時(shí)經(jīng)常這么用
5、什么是虛擬D0M?
【僅供參考】
虛擬DOM是真實(shí)DOM在內(nèi)存中的表示,ul的表示形式保存在內(nèi)存中,并且與實(shí)際的D0M同步,這是
一個(gè)發(fā)生在渲染函數(shù)被調(diào)用和元素在屏幕上顯示的步驟,整個(gè)過程被稱為調(diào)和
6、怎樣解釋React中render0的目的
【僅供參考】
每個(gè)React組件強(qiáng)制要求必須有一個(gè)render()o它返回一個(gè)React元素,是原生DOM組件的
表示。如果需要渲染多個(gè)HTML元素,則必須將它們組合在一個(gè)封閉標(biāo)記內(nèi),例如〈form〉、
〈group>、<p>等。此函數(shù)必須保持純凈,即必須每次調(diào)用時(shí)都返回相同的結(jié)果
7、為什么不直接更新state?
【僅供參考】
如果試圖直接更新state,就不會(huì)重新渲染組件
需要使用setState()方法更新state,它對(duì)state對(duì)象進(jìn)行更新,當(dāng)state改變時(shí),組件通過重
新渲染來響應(yīng)
8、Redux有哪些優(yōu)點(diǎn)?
【僅供參考】
Redux的優(yōu)點(diǎn)如下:
結(jié)果的可預(yù)測(cè)性-由于總是存在一個(gè)真實(shí)來源,即store,因此不存在如何將當(dāng)前狀態(tài)與動(dòng)
作和應(yīng)用的其他部分同步的問題。
可維護(hù)性-代碼變得更容易維護(hù),具有可預(yù)測(cè)的結(jié)果和嚴(yán)格的結(jié)構(gòu)。
服務(wù)器端渲染-你只需將服務(wù)器上創(chuàng)建的store傳到客戶端即可。這對(duì)初始渲染非常有用,
并且可以優(yōu)化應(yīng)用性能,從而提供更好的用戶體驗(yàn)。
第11/26頁(yè)
開發(fā)人員工具-從操作到狀態(tài)更改,開發(fā)人員可以實(shí)時(shí)跟蹤應(yīng)用中發(fā)生的所有事情。
社區(qū)和生態(tài)系統(tǒng)-Redux背后有一個(gè)巨大的社區(qū),這使得它更加迷人。一個(gè)由才華橫溢的人組
成的大型社區(qū)為庫(kù)的改進(jìn)做出了貢獻(xiàn),并開發(fā)了各種應(yīng)用。
易于測(cè)試-Redux的代碼主要是小巧、純粹和獨(dú)立的功能。這使代碼可測(cè)試且獨(dú)立。
組織-Redux準(zhǔn)確地說明了代碼的組織方式,這使得代碼在團(tuán)隊(duì)使用時(shí)更加一致和簡(jiǎn)單
9、依賴其它數(shù)據(jù)計(jì)算生成一個(gè)新的數(shù)據(jù)屬性;
【僅供參考】
2、當(dāng)里邊依賴的其它數(shù)據(jù)發(fā)生改變,就會(huì)重新計(jì)算,
10、Vuex用過嗎?簡(jiǎn)單介紹一下?
【僅供參考】
狀態(tài)管理模式+庫(kù)
相當(dāng)于共享倉(cāng)庫(kù),方便任何組件直接獲取和修改。
state-數(shù)據(jù)【存項(xiàng)目共享狀態(tài),是響應(yīng)式的,store的數(shù)據(jù)改變,所有依賴此狀態(tài)的組件會(huì)更
新】
$store.state,count
mutations-方法【同步函數(shù),只建議在這個(gè)地方修改數(shù)據(jù)】
inc(state,參數(shù)唯一){}
$store.commitCinc',2)
actions-【異步操作】【提交的是mutations,不直接修改狀態(tài)】
increment(context,num){context,commit()}
this.$store.dispatch('',arg)
getters-包裝數(shù)據(jù)【store的計(jì)算屬性,可緩存】
show:function(state){}
this.$store.getters.show
傳參,返回函數(shù):show(state){returnfunction(參數(shù)){return...}}【不會(huì)緩存數(shù)據(jù)】
11、$on()函數(shù)有什么用?
【僅供參考】
監(jiān)聽當(dāng)前實(shí)例上的自定義事件。事件可以由vm.$emit觸發(fā)
12、組件間通訊方式
【僅供參考】
props/$emit
(1)父組件向子組件傳值(props將數(shù)據(jù)自上而下傳遞)
(2)子組件向父組件傳遞數(shù)據(jù)($emit和v-on來向上傳遞信息)
eventBus事件總線($emit/$on)
通過EventBus進(jìn)行信息的發(fā)布與訂閱
第12/26頁(yè)
vuex:
是全局?jǐn)?shù)據(jù)管理庫(kù),可以通過vuex管理全局的數(shù)據(jù)流
ref/$refs
ref:這個(gè)屬性用在子組件上,它的用用就指向了子組件的實(shí)例,可以通過實(shí)例來訪問組件的數(shù)
據(jù)和方法
依賴注入(provide/inject)
provide和inject是vue提供的兩個(gè)鉤子,和data、methods是同級(jí)的。并且provide的書寫形
式和data一樣。
provide鉤子用來發(fā)送數(shù)據(jù)或方法。
inject鉤子用來接收數(shù)據(jù)或方法
$parent/$children
使用$parent可以讓組件訪問父組件的實(shí)例(訪問的是上一級(jí)父組件的屬性和方法)。
使用$children可以讓組件訪問子組件的實(shí)例,但是,$children并不能保證順序,并且訪
問的數(shù)據(jù)也不是響應(yīng)式的。
$attrs/$listeners
實(shí)現(xiàn)組件之間的跨代通信。
13、Vue中的key有什么作用?
【僅供參考】
key是為Vue中vnode的唯一標(biāo)記,通過這個(gè)key,我們的diff操作可以更準(zhǔn)確、更快
速。
Vue的diff過程可以概括為:oldCh和newCh各有兩個(gè)頭尾的變量oldStartlndex.
oldEndlndex和newStartlndex、newEndIndex,它們會(huì)新節(jié)點(diǎn)和舊節(jié)點(diǎn)會(huì)進(jìn)行兩兩對(duì)比,即一
共有4種比較方式:newStartlndex和oldStartlndex、newEndlndex和oldEndlndex、
newStartIndex和oldEndlndex、newEndlndex和oldStartlndex,如果以上4種比較都沒
匹配,如果設(shè)置了key,就會(huì)用key再進(jìn)行比較,在比較的過程中,遍歷會(huì)往中間靠,一旦
Startldx>Endldx表明oldCh和newCh至少有一個(gè)已經(jīng)遍歷完了,就會(huì)結(jié)束比較。
所以Vue中key的作用是:key是為Vue中vnode的唯一標(biāo)記,通過這個(gè)key,我們的
diff操作可以更準(zhǔn)確、更快速!
更準(zhǔn)確:因?yàn)閹ey就不是就地復(fù)用了,在sameNode函數(shù)a.key===b.key對(duì)比中可以避
免就地復(fù)用的情況。所以會(huì)更加準(zhǔn)確。
更快速:利用key的唯一性生成map對(duì)象來獲取對(duì)應(yīng)節(jié)點(diǎn),比遍歷方式更快,源碼如下:
functioncreateKeyToOldldx(children,beginldx,endldx){
leti,key
constmap={}
for(i=beginldx;i<=endldx;++i){
第13/26頁(yè)
key=children[i].key
if(isDef(key))map[key]=i
)
returnmap
}
14、Vuex如何區(qū)分state是外部直接修改,還是通過mutation方法修改的?
【僅供參考】
在vuex底層會(huì)有一個(gè)committing變量,初始值false;當(dāng)通過mutation方法修改數(shù)據(jù)時(shí)
把committing變量變成true;如果是直接改變的變量則不改變committing變量
15、描述一下vue在生命周期的beforeMount階段時(shí),頁(yè)面是怎么樣的
【僅供參考】
beforeMount執(zhí)行時(shí),數(shù)據(jù)和虛擬D0M樹已經(jīng)都加載完成,但是這時(shí)數(shù)據(jù)沒有渲染
16、Vue原理總結(jié)
【僅供參考】
【模板編譯】將template模板,經(jīng)過編譯系統(tǒng)后生成VNode,(模板字符串一AST-Render函
數(shù))
【渲染】然后再通過渲染系統(tǒng)來將VNode生成真實(shí)DOM(document.createElement&&Mount掛載
到真實(shí)DOM節(jié)點(diǎn)上)
【響應(yīng)式】通過響應(yīng)式系統(tǒng)對(duì)數(shù)據(jù)進(jìn)行監(jiān)聽,當(dāng)數(shù)據(jù)發(fā)生改變時(shí),觸發(fā)依賴項(xiàng)(組件)
[Diff&Patch]組件內(nèi)收到通知后,會(huì)通過diff算法對(duì)比VNode的變化,盡可能復(fù)用代碼,找
出最小差異,保證性能消耗最小。
【渲染】拿到需要新增/刪除/修改的VNode后,逐一去操作真實(shí)D0M進(jìn)行修改(通過選擇器選擇
到對(duì)應(yīng)真實(shí)D0M節(jié)點(diǎn)進(jìn)行修改)
17、什么是Proxy?
【僅供參考】
Proxy:代理,是ES6新增的功能,可以理解為代理器(即由它代理某些操作)。
Proxy:對(duì)象用于定義或修改某些操作的自定義行為,可以在外界對(duì)目標(biāo)對(duì)象進(jìn)行訪問前,對(duì)
外界的訪問進(jìn)行改寫。
Proxy是ES6中新增的一個(gè)特性JavaScript中用來表示由它來‘代理'某些操作
Proxy是ES6中新增的一個(gè)特性,翻譯過來意思是"代理",用在這里表示由它來“代理”某些
操作。Proxy讓我們能夠以簡(jiǎn)潔易懂的方式控制外部對(duì)對(duì)象的訪問。其功能非常類似于設(shè)計(jì)模
式中的代理模式。
Proxy可以理解成,在目標(biāo)對(duì)象之前架設(shè)一層“攔截”,外界對(duì)該對(duì)象的訪問,都必須先通過
這層攔截,因此提供了一種機(jī)制,可以對(duì)外界的訪問進(jìn)行過濾和改寫。
使用Proxy的核心優(yōu)點(diǎn)是可以交由它來處理一些非核心邏輯(如:讀取或設(shè)置對(duì)象的某些屬性
前記錄日志;設(shè)置對(duì)象的某些屬性值前,需要驗(yàn)證;某些屬性的訪問控制等)。從而可以讓對(duì)
象只需關(guān)注于核心邏輯,達(dá)到關(guān)注點(diǎn)分離,降低對(duì)象復(fù)雜度等目的。
第14/26頁(yè)
18、說一下v-model的作用
【僅供參考】
v-model:
雙向綁定,用于表單元素綁定數(shù)據(jù),數(shù)據(jù)的改變會(huì)響應(yīng)到頁(yè)面;
頁(yè)面表單元素value的改變,同樣也會(huì)響應(yīng)到數(shù)據(jù)
19、說一下vm.$once()的作用
【僅供參考】
監(jiān)聽一個(gè)自定義事件,但是只觸發(fā)一次。一旦觸發(fā)之后,監(jiān)聽器就會(huì)被移除。
20、Vue是如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定的?
【僅供參考】
如果被問到Vue怎么實(shí)現(xiàn)數(shù)據(jù)雙向綁定,大家肯定都會(huì)回答通過Object,definePropertyO
對(duì)數(shù)據(jù)進(jìn)行劫持,但是Object,definePropertyO只能對(duì)屬性進(jìn)行數(shù)據(jù)劫持,不能對(duì)整個(gè)對(duì)象
進(jìn)行劫持。
同理無法對(duì)數(shù)組進(jìn)行劫持,但是我們?cè)谑褂肰ue框架中都知道,Vue能檢測(cè)到對(duì)象和數(shù)組(部
分方法的操作)的變化,那它是怎么實(shí)現(xiàn)的呢?我們查看相關(guān)代碼如下:
/**
*ObservealistofArrayitems.
*/
observeArray(items:Array<any>){
for(leti=0,1=items,length;i<1;i++){
observe(items[i])//observe功能為監(jiān)測(cè)數(shù)據(jù)的變化
)
/**
*對(duì)屬性進(jìn)行遞歸遍歷
*/
letchildOb=!shallow&&observe(val)//observe功能為監(jiān)測(cè)數(shù)據(jù)的變化
通過以上Vue源碼部分查看,我們就能知道Vue框架是通過遍歷數(shù)組和遞歸遍歷對(duì)象,從而
達(dá)到利用Object,definePropertyO也能對(duì)對(duì)象和數(shù)組(部分方法的操作)進(jìn)行監(jiān)聽。
四、Webpack/RollupM
1、如何解決循環(huán)依賴問題
【僅供參考】
第15/26頁(yè)
Webpack中將require替換為webpack_require,會(huì)根據(jù)moduleld到installedModules找
是否加載過,加載過則直接返回之前的export,不會(huì)重復(fù)加載。
2、有哪些常見的Plugin?他們是解決什么問題的?
【僅供參考】
html-webpack-plugin:可以復(fù)制一個(gè)有結(jié)構(gòu)的html文件,并自動(dòng)引入打包輸出的所有資源
(JS/CSS)
c1ean-webpack-plugin:重新打包自動(dòng)清空dist目錄
mini-css-extract-plugin:提取js中的css成單獨(dú)文件
optimize-css-assets-webpack-plugin:壓縮css
uglifyjs-webpack-plugin:壓縮js
commons-chunk-p1ugin:提取公共代碼
define-plugin:定義環(huán)境變量
3、有哪些常見的Loader?他們是解決什么問題的?
【僅供參考】
file-loader:把文件輸出到一個(gè)文件夾中,在代碼中通過相對(duì)URL去引用輸出的文件
url-loader:和file-loader類似,但是能在文件很小的情況下以base64的方式把文件內(nèi)容
注入到代碼中去
source-map-loader:加載額外的SourceMap文件,以方便斷點(diǎn)調(diào)試
image-loader:加載并且壓縮圖片文件
babel-loader:把ES6轉(zhuǎn)換成ES5
css-loader:加載CSS,支持模塊化、壓縮、文件導(dǎo)入等特性
style-loader:把CSS代碼注入到JavaScript中,通過D0M操作去加載CSS。
eslint-loader:通過ESLint檢查JavaScript代碼
4、webpack3和webpack4的區(qū)別
【僅供參考】
mode/-mode參數(shù),新增了mode/-mode參數(shù)來表示是開發(fā)還是生產(chǎn)
(development/production)production側(cè)重于打包后的文件大小,development側(cè)重于
goujiansud移除loaders,必須使用rules(在3版本的時(shí)候loaders和rules是共存的但是到4的
時(shí)候只允許使用rules)移除了CommonsChunkPlugin(提取公共代碼),用
optimization.splitChunks和optimization.runtimeChunk來代替支持es6的方式導(dǎo)入JSON文
件,并且可以過濾無用的代碼
5、webpack如何配置多入口文件?
【僅供參考】
entry:{
home:resolve(_dirname,"src/home/index.js"),
about:resolve(_dirname,"src/about/index.js")
第16/26頁(yè)
用于描述入口的對(duì)象。你可以使用如下屬性:
dependOn:當(dāng)前入口所依賴的入口。它們必須在該入口被加載前被加載。
filename:指定要輸出的文件名稱。
import:啟動(dòng)時(shí)需加載的模塊。
library:指定library選項(xiàng),為當(dāng)前entry構(gòu)建一個(gè)library。
runtime:運(yùn)行時(shí)chunk的名字。如果設(shè)置了,就會(huì)創(chuàng)建一個(gè)新的運(yùn)行時(shí)chunko在webpack
5.43.0之后可將其設(shè)為false以避免一個(gè)新的運(yùn)行時(shí)chunko
publicPath:當(dāng)該入口的輸出文件在瀏覽器中被引用時(shí),為它們指定一個(gè)公共URL地址
6、webpack的核心概念
【僅供參考】
Entry:入口,Webpack執(zhí)行構(gòu)建的第一步將從Entry開始,可抽象成輸入。告訴webpack要使
用哪個(gè)模塊作為構(gòu)建項(xiàng)目的起點(diǎn),默認(rèn)為./src/index.js
output:出口,告訴webpack在哪里輸出它打包好的代碼以及如何命名,默認(rèn)為./dist
Module:模塊,在Webpack里一切皆模塊,一個(gè)模塊對(duì)應(yīng)著一個(gè)文件。Webpack會(huì)從配置的
Entry開始遞歸找出所有依賴的模塊。
Chunk:代碼塊,一個(gè)Chunk由多個(gè)模塊組合而成,用于代碼合并與分割。
Loader:模塊轉(zhuǎn)換器,用于把模塊原內(nèi)容按照需求轉(zhuǎn)換成新內(nèi)容。
Plugin:擴(kuò)展插件,在Webpack構(gòu)建流程中的特定時(shí)機(jī)會(huì)廣播出對(duì)應(yīng)的事件,插件可以監(jiān)聽這
些事件的發(fā)生,在特定時(shí)機(jī)做對(duì)應(yīng)的事情。
7、npm打包時(shí)需要注意哪些?如何利用webpack來更好的構(gòu)建?
【僅供參考】
Npm是目前最大的JavaScript模塊倉(cāng)庫(kù),里面有來自全世界開發(fā)者上傳的可復(fù)用模塊。
你可能只是JS模塊的使用者,但是有些情況你也會(huì)去選擇上傳自己開發(fā)的模塊。
關(guān)于NPM模塊上傳的方法可以去官網(wǎng)上進(jìn)行學(xué)習(xí),這里只講解如何利用webpack來構(gòu)建。
NPM模塊需要注意以下問題:
要支持CommonJS模塊化規(guī)范,所以要求打包后的最后結(jié)果也遵守該規(guī)則。
Npm模塊使用者的環(huán)境是不確定的,很有可能并不支持ES6,所以打包的最后結(jié)果應(yīng)該是采用ES5
編寫的。并且如果ES5是經(jīng)過轉(zhuǎn)換的,請(qǐng)最好連同SourceMap一同上傳。
Npm包大小應(yīng)該是盡量?。ㄓ行﹤}(cāng)庫(kù)會(huì)限制包大?。?/p>
發(fā)布的模塊不能將依賴的模塊也一同打包,應(yīng)該讓用戶選擇性的去自行安裝。這樣可以避免模
塊應(yīng)用者再次打包時(shí)出現(xiàn)底層模塊被重復(fù)打包的情況。
UI組件類的模塊應(yīng)該將依賴的其它資源文件,例如.css文件也需要包含在發(fā)布的模塊里。
8、Loader機(jī)制的作用是什么?
【僅供參考】
webpack默認(rèn)只能打包js文件,配置里的module,rules數(shù)組配置了一組規(guī)則,告訴Webpack在
遇到哪些文件時(shí)使用哪些Loader去加載和轉(zhuǎn)換打包成js。
注意:
use屬性的值需要是一個(gè)由Loader名稱組成的數(shù)組,Loader的執(zhí)行順序是由后到前的;
第17/26頁(yè)
每一個(gè)Loader都可以通過URLquerystring的方式傳入?yún)?shù),例如cssToader?minimize中
的minimize告訴css-loader要開啟CSS壓縮。
9、什么是Tree-sharking?
【僅供參考】
指打包中去除那些引入了但在代碼中沒用到的死代碼。在wepack中jstreeshaking通過
UglifyJsPlugin來進(jìn)行,css中通過purify-CSS來進(jìn)行。
10、理解babel-preset-env
【僅供參考】
babel-preset-es2015:可以將es6的代碼編譯成es5.
babel-preset-es2016:可以將es7的代碼編譯為es6.
babel-preset-es2017:可以將es8的代碼編譯為es7.
babel-preset-latest:支持現(xiàn)有所有ECMAScript版本的新特性
11、plugin的作用
【僅供參考】
plugin是一個(gè)類,類中有一個(gè)apply()方法,主要用于Plugin的安裝,可以在其中監(jiān)聽一些來自
編譯器發(fā)出的事件,在合適的時(shí)機(jī)做一些事情。
12、lazyloading(模塊懶加載)
【僅供參考】
借助import。語(yǔ)法異步引入組件,實(shí)現(xiàn)文件懶加載:prefetch,preloading
webpack提倡多寫異步代碼,提升代碼利用率,從而提升頁(yè)面性能
先加載主業(yè)務(wù)文件,prefetch利用網(wǎng)絡(luò)空閑時(shí)間,異步加載組件
import(/*webpackPrefetch:true/'LoginModal');
preload和主業(yè)務(wù)文件一起加載,異步加載組件
import(/webpackPreload:true*/'ChartingLibrary');
13、HMR熱模塊更新
【僅供參考】
借助webpack.HotModuleReplacementPlugin(),devServer開啟hot
場(chǎng)景1:實(shí)現(xiàn)只刷新css,不影響js
場(chǎng)景2:js中實(shí)現(xiàn)熱更新,只更新指定js模塊
if(module,hot){
module,hot.acceptC./library.jsJ,function0{
//Dosomethingwiththeupdatedlibrarymodule---
});
第18/26頁(yè)
14、Plugin(插件)的作用是什么?
【僅供參考】
Plugin是用來擴(kuò)展Webpack功能的,通過在構(gòu)建流程里注入鉤子實(shí)現(xiàn),它給Webpack帶來了
很大的靈活性。
Webpack是通過plugins屬性來配置需要使用的插件列表的。plugins屬性是一個(gè)數(shù)組,里面的
每一項(xiàng)都是插件的一個(gè)實(shí)例,在實(shí)例化一個(gè)組件時(shí)可以通過構(gòu)造函數(shù)傳入這個(gè)組件支持的配置
屬性。
15、webpack-dev-server和http服務(wù)器的區(qū)別
【僅供參考】
webpack-dev-server使用內(nèi)存來存儲(chǔ)webpack開發(fā)環(huán)境下的打包文件,并且可以使用模塊熱更
新,比傳統(tǒng)的http服務(wù)對(duì)開發(fā)更加有效。
16、Webpack的基本功能有哪些?
【僅供參考】
代碼轉(zhuǎn)換:TypeScript編譯成JavaScript、SCSS編譯成CSS等等
文件優(yōu)化:壓縮JavaScript、CSS、html代碼,壓縮合并圖片等
代碼分割:提取多個(gè)頁(yè)面的公共代碼、提取首屏不需要執(zhí)行部分的代碼讓其異步加載
模塊合并:在采用模塊化的項(xiàng)目有很多模塊和文件,需要構(gòu)建功能把模塊分類合并成一個(gè)文件
自動(dòng)刷新:監(jiān)聽本地源代碼的變化,自動(dòng)構(gòu)建,刷新瀏覽器
代碼校驗(yàn):在代碼被提交到倉(cāng)庫(kù)前需要檢測(cè)代碼是否符合規(guī)范,以及單元測(cè)試是否通過
自動(dòng)發(fā)布:更新完代碼后,自動(dòng)構(gòu)建出線上發(fā)布代碼并傳輸給發(fā)布系統(tǒng)。
17、webpack的工作原理?
【僅供參考】
WebPack可以看做是模塊打包機(jī):它做的事情是,分析你的項(xiàng)目結(jié)構(gòu),找到JavaScript模塊以及
其它的一些瀏覽器不能直接運(yùn)行的拓展語(yǔ)言(Sass,TypeScript等),并將其轉(zhuǎn)換和打包為合
適的格式供瀏覽器使用。在3.0出現(xiàn)后,Webpack還肩負(fù)起了優(yōu)化項(xiàng)目的責(zé)任。
18、gulp/grunt與webpack的區(qū)別是什么?
【僅供參考】
三者都是前端構(gòu)建工具,grunt和gulp在早期比較流行,現(xiàn)在webpack相對(duì)來說比較主流,不過
一些輕量化的任務(wù)還是會(huì)用gulp來處理,比如單獨(dú)打包CSS文件等。
grunt和gulp是基于任務(wù)和流(TasksStream)的。
類似jQue:ry,找到一個(gè)(或一類)文件,對(duì)其做一系列鏈?zhǔn)讲僮?,更新流上的?shù)據(jù),整條鏈?zhǔn)?/p>
操作構(gòu)成了一個(gè)任務(wù),多個(gè)任務(wù)就構(gòu)成了整個(gè)web的構(gòu)建流程。
webpack是基于入口的。
webpack會(huì)自動(dòng)地遞歸解析入口所需要加載的所有資源文件,然后用不同的Loader來處理不同的
文件,用Plugin來擴(kuò)展webpack功能。
19、sourceMap
第19/26頁(yè)
【僅供參考】
是一個(gè)映射關(guān)系,將打包后的文件隱射到源代碼,用于定位報(bào)錯(cuò)位置
配置方式:
例如:devtool:'source-map'
加不同前綴意義:
inline:不生成映射關(guān)系文件,打包進(jìn)main.js
cheap:L只精確到行,不精確到列,打包速度快2.只管業(yè)務(wù)代碼,不管第三方模塊
module:不僅管業(yè)務(wù)代碼,而且管第三方代碼
eval:執(zhí)行效率最快,性能最好
最佳實(shí)踐:
開發(fā)環(huán)境:cheap-module-eval-source-map
線上環(huán)境:cheap-mudole-source-map
20、webpack的熱更新是如何做到的?說明其原理?
【僅供參考】
1、在webpack的watch模式下,文件系統(tǒng)中某一個(gè)文件發(fā)生修改,webpack監(jiān)聽到文件變
化,根據(jù)配置文件對(duì)模塊重新編譯打包,并將打包后的代碼通過簡(jiǎn)單的JavaScript對(duì)象保存
在內(nèi)存中。
2、webpack-dev-server和webpack之間的接口交互,而在這一步,主要是dev-server的
中間件webpack-dev-middleware和webpack之間的交互,webpack-dev-middleware調(diào)用
webpack暴露的API對(duì)代碼變化進(jìn)行監(jiān)控,并且告訴webpack,將代碼打包到內(nèi)存中。
3、webpack-dev-server對(duì)文件變化的一個(gè)監(jiān)控,這一步不同于第一步,并不是監(jiān)控代碼變化
重新打包。當(dāng)我們?cè)谂渲梦募信渲昧薲evServer.watchContentBase為true的時(shí)候,Server
會(huì)監(jiān)聽這些配置文件夾中靜態(tài)文件的變化,變化后會(huì)通知瀏覽器端對(duì)應(yīng)用進(jìn)行l(wèi)ivereloado
注意,這兒是瀏覽器刷新,和HMR是兩個(gè)概念
4、webpack-dev-server代碼的工作,該步驟主要是通過sockjs(webpack-dev-server的依
賴)在瀏覽器端和服務(wù)端之間建立一個(gè)websocket長(zhǎng)連接,將webpack編譯打包的各個(gè)階段
的狀態(tài)信息告知瀏覽器端,
同時(shí)也包括第三步中Server監(jiān)聽靜態(tài)文件變化的信息。瀏覽器端根據(jù)這些socket消息
進(jìn)行不同的操作。當(dāng)然服務(wù)端傳遞的最主要信息還是新模塊的hash值,后面的步驟根據(jù)這一
hash值來進(jìn)行模塊熱替換。
webpack-dev-server/client端并不能夠請(qǐng)求更新的代碼,也不會(huì)執(zhí)行熱更模塊操作,而
把這些工作又交回給了webpack,webpack/hot/dev-server的工作就是根據(jù)webpack-dev-
server/client傳給它的信息以及dev-server的配置決定是刷新瀏覽器呢還是進(jìn)行模塊熱更
新。當(dāng)然如果僅僅是刷新瀏覽器,也就沒有后面那些步驟了。IIotModuleReplacement.runtime
是客戶端HMR的中樞,它接收到上一步傳遞給他的新模塊的hash值,它通過
JsonpMainTemplate.runtime向server端發(fā)送Ajax請(qǐng)求,服務(wù)端返回一個(gè)json,該json
包含了所有要更新的模塊的hash值,獲取到更新列表后,該模塊再次通過jsonp請(qǐng)求,獲取
到最新的模塊代碼。
5、決定HMR成功與否的關(guān)鍵步驟,在該步驟中,HotModulePlugin將會(huì)對(duì)新舊模塊進(jìn)行對(duì)
第20/26頁(yè)
比,決定是否更新模塊,在決定更新模塊后,檢查模塊之間的依賴關(guān)系,更新模塊的同時(shí)更新
模塊間的依賴引用。最后一步,當(dāng)HMR失敗后,回退到livereload操作,也就是進(jìn)行瀏覽
器刷新來獲取最新打包代碼。
五、性能/瀏覽器/其他篇
1、哪些方法可以提升網(wǎng)站前端性能?
【僅供參考】
精靈圖合并,減少HTTP請(qǐng)求;壓縮HTML、CSS、JavaScript文件;使用CDN托管靜態(tài)文件;使用
localstorage緩存和mainfest應(yīng)用緩存。
2、針對(duì)HTML,如何優(yōu)化性能?
【僅供參考】
具體方法如下。
(1)對(duì)于資源加載,按需加載和異步加載
(2)首次加載的資源不超過1024KB,即越小越好。
(3)壓縮HTML、CSS、JavaScript文件。
(4)減少DOM節(jié)點(diǎn)。
(5)避免空src(空src在部分瀏覽器中會(huì)導(dǎo)致無效請(qǐng)求)。
(6)避免30*、40*、50*請(qǐng)求錯(cuò)誤
(7)添加Favicon,ico,如果沒有設(shè)置圖標(biāo)ico,則默認(rèn)的圖標(biāo)會(huì)導(dǎo)致發(fā)送一個(gè)404或者500請(qǐng)
求。
3、性能優(yōu)化六大指標(biāo)
【僅供參考】
六大指標(biāo)基本囊括大部分性能優(yōu)化細(xì)節(jié),可作為九大策略的補(bǔ)充。筆者根據(jù)每條性能優(yōu)化建議
的特征將指標(biāo)劃分為以下六方面。
「加載優(yōu)化」:資源在加載時(shí)可做的性能優(yōu)化
「執(zhí)行優(yōu)化」:資源在執(zhí)行時(shí)可做的性能優(yōu)化
「渲染優(yōu)化」:資源在渲染時(shí)可做的性能優(yōu)化
「樣式優(yōu)化」:樣式在編碼時(shí)可做的性能優(yōu)化
「腳本優(yōu)化」:腳本在編碼時(shí)可做的性能優(yōu)化
「V8引擎優(yōu)化」:針對(duì)V8引擎特征可做的性能優(yōu)化
4、常見的瀏覽器內(nèi)核有哪些?
【僅供參考】
Trident內(nèi)核:IE,MaxThon,TT,TheWorld,360,搜狗瀏覽器等。[又稱MSHTML]
Gecko內(nèi)核:Netscape6及以上版本,F(xiàn)F,MozillaSuite/SeaMonkey等
Presto內(nèi)核:0pera7及以上。[Opera內(nèi)核原為:Presto,現(xiàn)為:Blink;]
Webkit內(nèi)核:Safari,Chrome等。[Chrome的:Blink(WebKit的分支)]
第21/26頁(yè)
5、平時(shí)你是如何對(duì)代碼進(jìn)行性能優(yōu)化的?
【僅供參考】
利用性能分析工具監(jiān)測(cè)性能,包括靜態(tài)Analyze工具和運(yùn)行時(shí)的Profile工具(在Xcode工具欄
中依次單擊Product-Profile項(xiàng)可以啟動(dòng))。
比如測(cè)試程序的運(yùn)行時(shí)間,當(dāng)單擊TimeProfiler項(xiàng)時(shí),應(yīng)用程序開始運(yùn)行,這就能獲取到運(yùn)
行整個(gè)應(yīng)用程序所消耗時(shí)間的分布和百分比。為了保證數(shù)據(jù)分析在同一使用場(chǎng)景下的真實(shí)性,
一定要使用真機(jī),因?yàn)榇藭r(shí)模擬器在Mac上運(yùn)行,而Mac上的CPU往往比iOS設(shè)備要快。
6、針對(duì)CSS,如何優(yōu)化性能?
【僅供參考】
具體優(yōu)化方法如下。
(1)正確使用display屬性,display屬性會(huì)影響頁(yè)面的渲染,因此要注意以下幾方面。
display:inline后不應(yīng)該再使用width、height、margin、padding和float。
display:inline-block后不應(yīng)該再使用float。
display:block后不應(yīng)該再使用vertical-aligno
display:table-*后不應(yīng)該再使用margin或者float。
(2)不濫用floato
(3)不聲明過多的font-size。
(4)當(dāng)值為0時(shí)不需要單位。
(5)標(biāo)準(zhǔn)化各種瀏覽器前綴,并注意以下幾方面。
瀏覽器無前綴應(yīng)放在最后。
CSS動(dòng)畫只用(-webkit-無前綴)兩種即可。
其他前綴包括-webkit-、-moz-、-ms-、無前綴(Opera瀏覽器改用blink內(nèi)核,所以-0-被淘
汰)
(6)避免讓選擇符看起來像是正則表達(dá)式。高級(jí)選擇器不容易讀懂,執(zhí)行時(shí)間也長(zhǎng)。
(7)盡量使用id、class選擇器設(shè)置樣式(避免使用style屬性設(shè)置行內(nèi)樣式)
(8)盡量使用CSS3動(dòng)畫。
(9)減少重繪和回流。
7、請(qǐng)說一下
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年培訓(xùn)項(xiàng)目協(xié)議書范本
- 專項(xiàng)財(cái)務(wù)優(yōu)化咨詢合同(2024版)版
- 2025年度家庭價(jià)值觀重塑離婚撫養(yǎng)協(xié)議4篇
- 2025版電商綠色物流體系建設(shè)合作協(xié)議4篇
- 2025年度拆除工程合同變更管理分包合同規(guī)范4篇
- 個(gè)體資金借入?yún)f(xié)議:固定期限還款協(xié)議版B版
- 2025年度互聯(lián)網(wǎng)+教育項(xiàng)目貸款協(xié)議4篇
- 二零二五版智能門窗系統(tǒng)承包合同4篇
- 2025年度新能源汽車鋁合金零部件生產(chǎn)合作協(xié)議范本3篇
- 二零二五版礦山安全生產(chǎn)培訓(xùn)教材編寫合同3篇
- 2024版塑料購(gòu)銷合同范本買賣
- 【高一上】【期末話收獲 家校話未來】期末家長(zhǎng)會(huì)
- JJF 2184-2025電子計(jì)價(jià)秤型式評(píng)價(jià)大綱(試行)
- GB/T 44890-2024行政許可工作規(guī)范
- 有毒有害氣體崗位操作規(guī)程(3篇)
- 兒童常見呼吸系統(tǒng)疾病免疫調(diào)節(jié)劑合理使用專家共識(shí)2024(全文)
- 二年級(jí)下冊(cè)加減混合豎式練習(xí)360題附答案
- TSG11-2020 鍋爐安全技術(shù)規(guī)程
- 汽輪機(jī)盤車課件
- 異地就醫(yī)備案?jìng)€(gè)人承諾書
- 蘇教版五年級(jí)數(shù)學(xué)下冊(cè)解方程五種類型50題
評(píng)論
0/150
提交評(píng)論