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語法糖
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')},