第二十一天web前端面試題

1,手寫promise封裝axios

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

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

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

一、拆解function

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

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

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

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

三、Promise

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

四、Generator

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

五、async/await

所以就有了async/await語法糖


內(nèi)容詳細

3,請詳解移動端點透發(fā)生場景、原因及解決方案(最優(yōu))

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

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

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

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

原因:

點透問題出現(xiàn)的原因就是因為我們上邊說過的移動端click事件300ms延遲問題,當點擊上層元素時,先觸發(fā)touchstart事件,然后在300ms后會觸發(fā)click事件,而此時上層元素已經(jīng)消失,所以下邊的元素會觸發(fā)click事件,這就是點透

解決方案:

1,fastclick.js

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

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

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

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

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

6,下層避開click事件,如a鏈接改為span等標簽,使用js跳轉頁面

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

我只是總結小點,詳細見網(wǎng)址

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

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

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

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

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

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

5. 將 CSS放在 HEAD中

6. 避免重復的資源請求

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

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

瀏覽器都會開啟一個線程來處理這個請求,同時在遠程 DNS 服務器上啟動一個 DNS 查詢。這能使瀏覽

器獲得請求對應的 IP 地址。

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

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

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

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

該握手包括一個同步報文,一個同步-應答報文和一個應答報文,這三個報文在 瀏覽器和服務器之間傳遞。該握手首先由客戶端

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

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

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

4/此時,Web 服務器提供資源服務,客戶端開始下載資源。

6,頁面的渲染過程

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

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

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

4,瀏覽器接收服務器響應結果,如果有壓縮則首先進行解壓處理,緊接著就是頁面解析渲染

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

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

? ? ? ? 2,構建DOM樹

? ? ? ? 3,DOM樹與CSS樣式進行附著構造呈現(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)核的子項目

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)資源包含進來,導致編譯出的文件過大

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

6、配置vue路由

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

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

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

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

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