第二十一天web前端面試題

1,手寫promise封裝axios

2,如何解決回調(diào)地獄

首先回調(diào)地獄是什么?函數(shù)作為參數(shù)層層嵌套

什么是回調(diào)函數(shù)(一個(gè)函數(shù)作為參數(shù)需要依賴另一個(gè)函數(shù)執(zhí)行調(diào)用)

一、拆解function

function拆分的方式其實(shí)僅僅只是拆分代碼塊,時(shí)常會不利于后續(xù)維護(hù);

二、事件發(fā)布/監(jiān)聽模式

發(fā)布者訂閱者模式是通過保存事件,然后在需要使用的時(shí)候直接發(fā)布事件,就可以觸發(fā)保存的回調(diào)

事件發(fā)布/監(jiān)聽方式模糊了異步方法之間的流程關(guān)系;

三、Promise

Promise雖然使得多個(gè)嵌套的異步調(diào)用能夠通過鏈?zhǔn)降腁PI進(jìn)行操作,但是過多的then也增加了代碼的冗余,也對閱讀代碼中各階段的異步任務(wù)產(chǎn)生了一定干擾;

四、Generator

通過generator雖然能提供較好的語法結(jié)構(gòu),但是畢竟generator與yield的語境用在這里多少還有些不太貼切。

五、async/await

所以就有了async/await語法糖


內(nèi)容詳細(xì)

3,請?jiān)斀庖苿佣它c(diǎn)透發(fā)生場景、原因及解決方案(最優(yōu))

發(fā)生場景總結(jié)如下:

1,A/B兩個(gè)層上下z軸重疊(上下重疊,A蓋著B)。

2,上層的A點(diǎn)擊后消失或移開。(這一點(diǎn)很重要)

3,B元素本身有默認(rèn)click事件(如a標(biāo)簽) 或 B綁定了click事件。

原因:

點(diǎn)透問題出現(xiàn)的原因就是因?yàn)槲覀兩线呎f過的移動端click事件300ms延遲問題,當(dāng)點(diǎn)擊上層元素時(shí),先觸發(fā)touchstart事件,然后在300ms后會觸發(fā)click事件,而此時(shí)上層元素已經(jīng)消失,所以下邊的元素會觸發(fā)click事件,這就是點(diǎn)透

解決方案:

1,fastclick.js

fastclick.js既然可以解決click300ms延遲,那必然可以解決點(diǎn)透問題,使用方法如上文所述。

2,對于B元素本身存在默認(rèn)click事件的情況,使用touchend代替touchstart事件并阻止掉時(shí)A元素touchend的默認(rèn)行為preventDefault(),因?yàn)橛|發(fā)touchend需要200ms,從而阻止click事件的產(chǎn)生。

3,使用一個(gè)(透明)遮罩層,屏蔽所有事件,然后400ms(對于IOS來說是個(gè)理想值)后自動隱藏

4,延遲一定的時(shí)間(300ms+)來處理事件

5,直接使用click事件,不考慮延遲問題

6,下層避開click事件,如a鏈接改為span等標(biāo)簽,使用js跳轉(zhuǎn)頁面

4,詳述前端性能優(yōu)化的手段

我只是總結(jié)小點(diǎn),詳細(xì)見網(wǎng)址

一、頁面級優(yōu)化

1,減少 HTTP請求數(shù)??

主要途徑包括:(1). 從設(shè)計(jì)實(shí)現(xiàn)層面簡化頁面 (2). 合理設(shè)置 HTTP緩存 (3). 資源合并與壓縮?(4). CSS Sprites?(5). Inline Images

2. 將外部腳本置底(將腳本內(nèi)容在頁面信息內(nèi)容加載后再加載)

3. 異步執(zhí)行 inline腳本(其實(shí)原理和上面是一樣,保證腳本在頁面內(nèi)容后面加載。)

4. Lazy Load Javascript(只有在需要加載的時(shí)候加載,在一般情況下并不加載信息內(nèi)容。)

5. 將 CSS放在 HEAD中

6. 避免重復(fù)的資源請求

5,瀏覽器輸入網(wǎng)址回車發(fā)生了什么

1,當(dāng)發(fā)送一個(gè)?URL?請求時(shí),不管這個(gè)?URL?是 Web 頁面的?URL?還是 Web 頁面上每個(gè)資源的?URL,

瀏覽器都會開啟一個(gè)線程來處理這個(gè)請求,同時(shí)在遠(yuǎn)程 DNS 服務(wù)器上啟動一個(gè) DNS 查詢。這能使瀏覽

器獲得請求對應(yīng)的 IP 地址。

2,瀏覽器與遠(yuǎn)程 Web 服務(wù)器通過 TCP 三次握手協(xié)商來建立一個(gè) TCP/IP 連接。

第一次握手: 建立連接時(shí),客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SENT狀態(tài),等待服務(wù)器確認(rèn);

第二次握手: 服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài);

第三次握手: 客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED(TCP連接成功)狀態(tài),完成三次握手。

該握手包括一個(gè)同步報(bào)文,一個(gè)同步-應(yīng)答報(bào)文和一個(gè)應(yīng)答報(bào)文,這三個(gè)報(bào)文在 瀏覽器和服務(wù)器之間傳遞。該握手首先由客戶端

嘗試建立起通信,而后服務(wù)器應(yīng)答并接受客戶端的請求,最后由客戶端發(fā)出該請求已經(jīng)被接受的報(bào)文。

一旦 TCP/IP 連接建立,瀏覽器會通過該連接向遠(yuǎn)程服務(wù)器發(fā)送 HTTP 的 GET 請求。遠(yuǎn)程服務(wù)器找

3,到資源并使用 HTTP 響應(yīng)返回該資源,值為 200 的 HTTP 響應(yīng)狀態(tài)表示一個(gè)正確的響應(yīng)。

4/此時(shí),Web 服務(wù)器提供資源服務(wù),客戶端開始下載資源。

6,頁面的渲染過程

1,用戶輸入url地址,瀏覽器根據(jù)域名尋找IP地址

2,瀏覽器向服務(wù)器發(fā)送http請求,如果服務(wù)器段返回以301之類的重定向,瀏覽器根據(jù)相應(yīng)頭中的location再次發(fā)送請求

3,服務(wù)器端接受請求,處理請求生成html代碼,返回給瀏覽器,這時(shí)的html頁面代碼可能是經(jīng)過壓縮的

4,瀏覽器接收服務(wù)器響應(yīng)結(jié)果,如果有壓縮則首先進(jìn)行解壓處理,緊接著就是頁面解析渲染

  解析渲染該過程主要分為以下步驟:

????????1,解析HTML

? ? ? ? 2,構(gòu)建DOM樹

? ? ? ? 3,DOM樹與CSS樣式進(jìn)行附著構(gòu)造呈現(xiàn)樹

? ? ? ? 4,布局

? ? ? ? 5,繪制

7,列舉你知道的瀏覽器內(nèi)核

IE瀏覽器 :Trident內(nèi)核

Firefox(火狐瀏覽器):Gecko內(nèi)核

Safari(蘋果瀏覽器):?Webkit內(nèi)核

Chrome/opera:Blink內(nèi)核:是基于Webkit內(nèi)核的子項(xiàng)目

8,如何優(yōu)化SPA首屏加載慢的問題

1、安裝動態(tài)懶加載所需插件

babel-plugin-syntax-dynamic-import

配置/laravel/.babelrc

{

? "plugins": ["syntax-dynamic-import"]

}

2、去掉.extract()

它包含需要編譯的文件類型,現(xiàn)在vue等靜態(tài)資源從CDN加速

3,配置output輸出形式

chunkFilename: 'js/chunk/[name].js?v=[chunkHash]'

4、配置externals

它所包含的文件類型將被排除,避免不必要的靜態(tài)資源包含進(jìn)來,導(dǎo)致編譯出的文件過大

5、在首頁HTML掛載點(diǎn)之前引入靜態(tài)資源CDN

6、配置vue路由

由require()方式修改為() => import()方式

{ path: '/home/wx/auth', component: () => import ('./views/home/wx/Auth')},

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容