日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

前端面经 300条,背完这些就够了!

發布時間:2024/3/12 HTML 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 前端面经 300条,背完这些就够了! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前沿

確實有些標題黨哈,但是確實是本人秋招之間總結的經驗,前端崗位,會很多也不行,有時候秋招就是面試官看你的知識廣度和深度,特別是前端的崗位,設計的方方面面太多了,只有提前準備好,理解好,然后背下來,才能夠在秋招中暢通無阻~

經驗之談:秋招 = 項目要好 + 基礎要牢(牢固 + 牢記,直接背誦就好了) + 深度(一些框架的原理,弄明白)+ 做題(算法題要會寫吧,刷題)

正文

東西太多,網頁端閱讀可能不方便,特提供以下方式:
① html 版本:免積分下載
② Anki 背誦版本:用 anki 軟件背誦的,這個導出挺麻煩的,需要的可以評論區告知。

1
flash和js通過什么類如何交互?
ExternalInterface


2
call和apply:

  • apply傳入的是一個{{c1::參數數組}}。
  • call傳入的則是直接的{{c1::參數列表}}
    apply 數組
    call 列表

3
路由懶加載、異步加載、React 文件加載有辦法解決嗎?
1、react-loadable:將js 拆分成若干個chunk.js
2、react-router 創建一個異步組件 AsyncComponent,然后使用AsyncComponent動態導入組件。


4
為什么瀏覽器要設置跨域的防范
假如我是A網的管理員,登錄了我的賬號,然后B網站被攻擊了,被植入了一個iframe,里面調用了我通過POST刪除用戶的接口,這樣我只要訪問了B網站被攻擊的頁面,就會刪除用戶,所以為了避免敏感信息接口被攻擊,需要設計為跨域。


5
image標簽把href寫成b.com,為什么不收到跨域的限制?為什么只對AJAX做限制,對圖片不做限制?圖片地址也可以寫一個api接口,為什么不做限制呢?
1、圖片是GET請求,我們設計API時不應用GET做敏感事情。
2、支持跨域的標簽還有:image、iframe、link、script


6
瀏覽器怎么知道允不允許跨域?我如果根據header的話,那就已經請求了一次,怎么解決?

如果同源,瀏覽器發送數據請求,否則發送跨域請求

瀏覽器收到跨域請求后,返回自身配置的是否含有Access-control-Allow-origin字段

瀏覽器收到這個header后,匹配看是否允許,允許的話則發送數據請求。


7
Promise直接resolve,和setTimeout 0,誰先執行?為什么?
Promise先執行
主線程從"任務隊列"中讀取事件,這個過程是循環不斷的,所以整個的這種運行機制又稱為Event Loop(事件循環)。
Promise.resolve() 是微任務,本輪事件循環結束時執行
setTimeout(fn,0)是宏任務,在下一輪“事件循環”event loop開始時執行


8
__proto__知道嗎?原型鏈,聲明一個object a, 然后讓 a.proto.b,js原來是面向過程的,但是es6/es7又支持了class,原來不支持class,是怎么模擬的?

prototype是函數才有的屬性,__proto__是每個對象都有的屬性

對象的__proto__等于生成這個對象的函數的prototype

ES6類的底層還是通過原型鏈構造函數去創建


9
React現在官方推薦使用Function組件,之前是class,他們兩個有什么區別?
function組件沒有state狀態,刪除了生命周期,速度會很快
class組件適合有狀態組件


10
解釋性語言一行一行執行怎么支持類的
1、解釋型是說不需要編譯,每次執行的時候,再去轉為機器語言運行。
2、而是否面向對象,說的是語言的模式,是面向過程還是面向對象的。所以這倆沒什么關聯,是不同的分法


11
JS的數據類型有哪些?
① JS有八種數據類型:Number、String、Boolean、Null、undefined、object、symbol、bigInt
② 其中除了object之外都是基本類型,而引用類型分為:Object、Array、RegExp、Date、Function。
③ 基本類型和引用類型有四點區別:
1、基本類型保存在棧中,引用類型保存在堆中。
2、基本類型按值訪問,引用類型按引用訪問。
3、基本類型的值不能改變,引用類型的值可以改變。
4、基本類型的比較是值的比較,引用類型的比較是引用的比較。


12
函數式編程
函數式編程的本質
1、函數式編程中的函數指的不是計算機里面的函數,而是數學中的函數,即自變量的映射
2、只要輸入是確定的,輸出就是確定的
函數式編程的好處
1、函數式編程引用透明,沒有副作用。
2、函數不依賴外部狀態,這樣寫的代碼不容易出錯。
3、不共享狀態就不會造成資源爭奪,也不需要鎖,也不會出現死鎖。


13
Babel/Webpack 分別講一下,在項目中用到過嗎?
1、Babel 是一個JS編譯器,用來轉換最新的JS語法,比如把ES6, ES7等語法轉化成ES5語法。提供了一些插件轉換最新的 api,如 babel-pilofill, 基于 core-js 和 regenerator. 也支持 React 的 JSX 語法。
2、Webpack 是一個打包工具,打包js文件,css文件,圖片,html等等,可以分析文件結構,確定文件依賴,合并壓縮js,加入hash,最終生成項目文件。
3、在使用過的飛冰框架ice-js和微信小程序框架taro中都有應用


14
瀏覽器渲染的過程
HTML 解析成 DOM 樹
CSS 構造成 CSS 對象模型
DOM 和 CSS 模型合并為渲染樹,渲染樹每個元素的內容都是計算好的 layout.
將渲染樹的節點繪制到屏幕上。


15
重排、重繪、合成
1、重排: 修改幾何屬性,如寬高度,會重新布局
2、重繪:修改繪制屬性,如背景顏色,直接進入繪制階段。
3、合成:更改一個既不要布局也不要繪制的屬性,渲染引擎會跳過布局和繪制,在非主線程上合成,如更改 transform屬性。
優化:
1、使用class
2、使用React的虛擬節點
3、避免使用table布局
4、使用硬件加速
5、帶動畫的元素position:absolute或fixed、不顯示的元素使用display: none


16
減少白屏的方式
script放在 body后面
script 加defer屬性
減少 head里的css資源
gzip壓縮文件體積


17
React Fiber 了解嗎?引入 React Fiber 的好處是什么?
1、React filber 是一種基于瀏覽器的單線程調度算法,將遞歸的diff拆分成無數個小任務,可以隨時停止與恢復。
2、React fiber優化了虛擬DOM的diff算法,將組件渲染拆分為無數個具有優先級的分片任務,防止瀏覽器在組件個數較多的時候后陷入假死卡頓狀態。


18
HTTP 請求方法
GET、POST、PUT、DELETE、PATCH
HEAD、CONECTION、OPTIONS、TRACE


19
HTTP 請求狀態碼
一共有五類:1是臨時響應,2是成功,3是重定向,4是客戶端錯誤,5是服務端錯誤。
1、100(繼續)、101(切換協議)
2、200(成功)、201(成功并創建資源)、204(成功但沒有返回內容)
3、301(永久移動)、302(臨時移動)、304(服務端已執行 GET, 但是文件未變化)
4、400(錯誤請求)、401(未授權)、403(禁止訪問)、404(未找到)、405(請求方法不支持)、408(請求超時)、410(已經刪除)
5、500(服務器內部錯誤)、501(網關錯誤)、503(服務不可用)、504(網關超時)


20
Webpack HMR 的原理詳細介紹一下
首先建立 WebSocket 連接
文件發生變化,Webpack Dev Server 通知應用程序
HMR Runtime 通過 HTTP 請求模塊更新清單
script 標簽下載模塊更新
插入新模塊、進行局部刷新。


21
webpack優化方式,如何提高 webpack 的構建速度
優化方式:https://www.cnblogs.com/wangjiachen666/p/11561186.html
Loader 縮小文件搜索范圍
對編譯文件使用緩存
多線程打包 happypack
image-webpack-loader 壓縮圖片
刪除無用的 css 樣式
CDN 加載資源


22
JS的深拷貝與淺拷貝
① 淺拷貝:Object.assign(obj), … 展開運算符

② 深拷貝:
1、JSON先stringify再parse.
2、遞歸實現一個深拷貝:clone函數里面判斷類型,如果是基本類型直接返回,如果是object,則定義一個空對象,然后用for key in 的方式遞歸調用clone來深拷貝每一個屬性。還可以用一個Map來避免循環引用。
3、jQuery.extend()
4、lodash.cloneDeep()


23
js判斷數據類型的方法,以及他們的優缺點?
① typeof:缺點是基本類型null返回的是object,引用類型中除了function外返回的都是object。
② constructor:缺點是無法判斷null和undefined,而且重寫prototype后也無法判斷。
③ Object.prototype.toString.call(value),默認返回當前對象的class,用中括號括起來的[object + 類名].


24
toString()方法返回的是什么東西?
返回的是當前對象的字符串形式。


25
new 操作發生了什么?如何實現一個 new?
假設構造函數為 Fun,接收參數為 args
① 根據構造函數的原型,創建一個新對象
let obj = Object.create(Fun.prototype)
② 對對象應用參數,改變 this 指向
let result = Fun.apply(obj, args)
③ 如果返回的是 object, 則返回這個 result,否則返回第一步創建的 obj
return typeof reuslt === ‘object’ ? result : obj

整體代碼如下:
function myNew (Fun, …args) {
let obj = Object.create(Fun.prototype)
let result = Fun.apply(obj, args)
return typeof reuslt === ‘object’ ? result : obj
}


26
函數的防抖與節流
1、函數防抖與節流都可以避免頻繁觸發事件。
2、函數防抖與節流都可以使用setTimeout實現,目標都是降低執行頻率。
3、函數防抖讓連續觸發的事件只執行最后一次,而函數節流側重于一段時間內只執行一次。
4、應用:加載更多、輸入框輸入、避免重復提交。


27
Promise的過程
Promise是一個具有三種狀態的狀態機:pending、resolved、rejected.初始是pendig,調用resolve變成resolved,調用rejected變成rejected.


28
實現一個Promise.all
1、Promise.all概述:返回一個Promise,參數內所有的Promise都resolved后回調一個結果數組,有一個rejected則會回調失敗。
2、實現:
① 輸入時一個數組,輸出new 一個 Promise.
② 函數內定義一個數組result,來存放最終結果。
③ 返回的Promise內使用for循環,把每一個Promise.then的結果放入result,如果發生了reject則直接reject,如果結果數組的長度等于輸入數組的長度,則resolve(result).
function isPromise(obj) {
return !!obj && (typeof obj === ‘object’ || typeof obj === ‘function’) && typeof obj.then === ‘function’;
}

const myPromiseAll = (arr)=>{
let result = [];
return new Promise((resolve,reject)=>{
for(let i = 0;i < arr.length;i++){
if(isPromise(arr[i])){
arr[i].then((data)=>{
result[i] = data;
if(result.length === arr.length){
resolve(result)
}
},reject)
}else{
result[i] = arr[i];
}
}
})
}


29
前端框架的MVVM模式
1、VM視圖模型層通過接口從后臺model層請求數據,然后VM層與view層實現數據的雙向綁定。
2、優點:促進了前后端分離,提升了前端開發效率。


30
VUE里面的數據劫持+發布訂閱模式,實現雙向數據綁定。
vue.js 是采用數據劫持結合發布者-訂閱者模式的方式實現MVVM的,VUE 2 使用的是Object.defineProperty()。
實現過程:
1.實現一個監聽器Observer,用來劫持并監聽所有屬性,如果有變動的,就通知訂閱者。
2.實現一個訂閱者Watcher,可以收到屬性的變化通知并執行相應的更新函數,從而更新視圖。
3.實現一個解析器Compile,可以掃描和解析每個節點的相關指令,并初始化模板數據以及訂閱器。


31
CSS 相對于父元素垂直居中
1、display:inline-block的時候可以vertical-align:middle
2、用display:flex和align-items: center;
3、inline-height 和父元素高度一樣。
4、transform: translateY(-50%)


32
BFC
① BFC 概念:塊格式化上下文,是一個獨立的布局環境。
② 適合類型:根元素、浮動元素、絕對定位元素、display: inline-block/flex/inline-flex/table-cell、overflow: 非visible。
③ 作用:清除浮動、BFC內部外邊距折疊、不同的BFC可以避免外邊距折疊。


33
響應式布局
使用百分比、rem、vw、flex、媒體查詢五種方式
① 使用百分比
② 使用媒體查詢對不同分辨率設置不同css樣式
③ 使用 rem:相對于html元素的font-size值
④ 使用 vw
⑤ 使用 flex


34
304 協商緩存
① 200是強緩存,直接從緩存中取。304是協商緩存,通過服務器告知緩存是否可用。
② 服務器上的資源不是一成不變的,如果我們還訪問本地緩存,那么對用戶來說,那就相當于資源沒有更新,用戶看到的還是舊的資源。


35
跨域的解決方案
① 服務器返回一個header:Access-Control-Allow-Origin
② jsonp跨域:利用script標簽的src屬性
③ 代理跨域
④ 設置 document.domain 解決一級域名相同,二級域名不同的情況。

其他的方式:
① hash 跨域通信:A 里面通過 iframe 嵌入了一個 B,然后 A 修改 B 的 url hash, B 里面通過 onhashchange 監聽到 hash 變化。
② postMessage:窗口 A 中 window.postMessage(數據,來源), 窗口 B 中 window.addEventListener(‘message’, event) 接收。


36
CSS 優先級
!important > 內聯樣式>ID選擇器 > 類選擇器 > 標簽 > 通配符 > 繼承 > 瀏覽器默認屬性


37
cookie的屬性,前端怎么設置cookie,可以設置cookie的哪些屬性
① cookie 屬性:expires 過期時間、domain/path 域名和路徑、secure 安全發送、httpOnly 只允許http訪問,不允許 js 訪問。
② 前端設置cookie 的方法:document.cookie=,一次只設置一個,多個需要多次。
③ 前端可以設置的 cookie:httpOnly不能設置,secure 在 https 時才能設置,其他都可以。


38
XSS攻擊
① 概念:XSS 中文是跨站腳本攻擊,指的是攻擊者向網頁植入惡意代碼,用戶瀏覽器會被控制或者導致隱私泄露。
② 分類: 分為反射型(如放置一個惡意跳轉鏈接)、存儲型(通過發表評論向數據庫注入js代碼,然后所有瀏覽該帖子的瀏覽器都會執行這段代碼)、基于DOM (通過惡意腳本修改頁面的 DOM 結構)
③ 防范:HttpOnly 防止截取 Cookie、輸入檢查、輸出檢查。


39
為什么第二個參數是[]時,只會在組件mount時執行
useEffect 源碼里面有一個if,說如果沒有依賴,或者依賴發生變化,則執行callback,而如果數組為空,依賴一直不變化,callback不會二次執行。


40
原型
① 是什么:prototype屬性是一個指針,指向一個對象。
② 用途:它包含該類型所有實例共享的屬性和方法,
③ proto和prototype的關系:每個實例對象的__proto__都指向這個構造函數/類的prototype屬性。


41
閉包
① 閉包簡單來說就是函數嵌套函數,詳細說就是閉包可以讓一個函數訪問并操作其聲明時的作用域中的變量和函數,并且,即使聲明時的作用域消失了,也可以調用。
② 內部函數引用來外部函數的變量,從而導致垃圾回收機制沒有把當前變量回收掉,這樣的操作帶來了內存泄漏的影響。
例子:

function A() {let data = ['1']return function () {console.log(data)} } let a = A() // 此時的 data 仍在引用,沒有被回收 ```javascript *** 42 原型鏈 查找方法的時候會先在自身屬性上查找,如果沒有這個屬性,就會去__proto__中查找,一層層向上直到查找到頂層對象Object,這個查找的過程就是原型鏈。 *** 43 vue-router vue-router是vuex.js官方的路由管理器,包含<router-link> 導航、<router-view>視圖組件、<keep-alive> 組件。 *** 44 HTTP ① 中文超文本傳輸協議,無連接無狀態,基于TCP/IP,分為請求和響應兩個部分。 ② 報文包括狀態行、頭部、空行、數據四個部分。 狀態行 (請求)請求方法、URL、HTTP 版本 (響應)狀態碼、HTTP 版本 頭部 (兩者都有)Date, Connection, Cache-Control, Content-Type, Content-Length 等 (請求)Host, Accept, Accept-Encoding, Accept-Language 等 (響應)Accept-Range, Location 等*** 45 說一說SessionStorage和localStorage還有cookie ① cookie在http中傳輸,其他兩個僅在本地保存。 ② 大小:cookie不超過4k,其他兩個能到5M ③ 有效性:sessionStorage關閉瀏覽器銷毀,localStorage 本地持久存儲,cookie 過期之前都有效。 ④ 作用域:sessionStorage 不共享,localStorage和cookie 同源共享, *** 46 前端優化 ① HTTP 請求:減少次數、CSS Sprites、JS / CSS 壓縮、網頁 GZIP、CDN 托管、圖片懶加載、AJAX 異步加載、減少 Cookie 傳輸。 ② 頁面操作:CSS 放在 head, script 放在 body 后面,innerHTML 代替 DOM 操作,使用 class 而不是 style,避免使用 table 布局。 ③ JS 方面:避免使用 eval, 減少全局變量使用,避免 with 語句,避免循環引用,字符串使用 join 連接。 *** 47 說一下你了解的 ES6 ① 箭頭函數 ② 使用反引號 ` 的模板字符串格式化 ③ 解構賦值 ④ import / export ⑤ Set 數據結構 ⑥ ... 展開運算符 ⑦ 引入 class 關鍵字 ⑧ Promise *** 48 Promise 的方法 ① then / catch / resolve / reject ② all(),傳入 Promise 對象的數組,.then() 可以獲取到全都 resolve 的結果數組 ③ race(), 顧名思義,傳入也是 Promise 隊型數組,.then() 輸出最快的那個。 *** 49 React diff 算法原理 時間復雜度 傳統的差異查找算法時間復雜度為O(n^3),React 通過以下三個策略降低到 O(n): 三大策略 ① 跨層級的移動操作特別少,可以忽略不計 ② 相同類的組件會生成相似的樹形結構,不同類的組件生成不同的樹形結構。 ③ 同一層級的子節點可以通過唯一 id 區分。 具體的做法 具體來說,React 是這樣做的: ① 分層:將樹形結構按層級分解,只比較同級元素,并且只會匹配類名相同的組件。 ② 列表: 給列表結構的每個單元添加唯一的 key 屬性,方便比較。 ③ dirty: 調用 setState 方法的時候,先標記為 dirty, 所有的標記完成后,檢查所有標記為 dirty 的組件重新繪制。 ④ 選擇性子樹渲染:開發者可以重寫 shouldComponentUpdate 提高 diff 的性能。 *** 50 webpack 常用配置 ① cache: true, 開啟編譯緩存 ② entry:配置入口,app 寫 main.js 的相對路徑 ③ output: 配置輸出目錄,有 path, filename, publicPath. ④ module.rules: 配置 loader ⑤ plugins: 配置插件 ⑥ externals: 外部引入,不會打包合并。 *** 51 使用過哪些 loader file-loader:把文件輸出到一個文件夾中,在代碼中通過相對 URL 去引用輸出的文件 url-loader:和 file-loader 類似,但是能在文件很小的情況下以 base64 的方式把文件內容注入到代碼中去 image-loader:加載并且壓縮圖片 babel-loader:把 ES67 轉換成 ES5, jsx 轉換成 js css-loader:加載 CSS,支持模塊化、壓縮、文件導入等功能 eslint-loader:通過 ESLint 檢查 JavaScript 代碼 *** 52 對 babel 的了解 ① Babel 是一個JS編譯器,用來轉換最新的JS語法,比如把ES6, ES7等語法轉化成ES5語法。提供了一些插件轉換最新的 api,如 babel-pilofill, 基于 core-js 和 regenerator. 也支持 React 的 JSX 語法。 ② babel 的原理: 解析: 將代碼(其實就是字符串)轉換成 AST( 抽象語法樹) 轉換: 訪問 AST 的節點進行變換操作生成新的 AST 生成: 以新的 AST 為基礎生成代碼 *** 53 異步加載的方法、defer 和 async 的區別? 動態腳本加載 defer: html 解析后按加載順序執行 async: 加載完后立即執行,與加載順序無關 *** 54 CSS 水平居中 ① margin: auto,只能水平居中,不支持浮動元素和絕對定位元素。 ② text-align: center,只能圖片、按鈕、文字等行內元素(display: inline / inline-block) ③ 使用表格,或者table-cell模擬單元格 ④ 絕對定位直接設置四個位置。 ⑤ 浮動元素定位到 50%,然后里面的元素再相對定位拉回來 50% ⑥ flex, justify-content: center ⑦ left: 50%; transform: translateX(-50%) *** 55 解釋一下什么是 Event Loop? 概念 中文是事件循環,Javascript 代碼的執行過程中,除了依靠函數調用棧來搞定函數的執行順序外,還依靠任務隊列來搞定另外一些代碼的執行,整個執行的過程我們稱為事件循環。 任務隊列 任務隊列又分為宏任務和微任務,宏任務和微任務的組成如下: ① 宏任務:script, setTimeout, setInterval, setImmediate, I/O, UI render ② 微任務:process.nextTick, Promise, Async/Await, MutationObserver. 事件循環的執行順序 ① 首先執行同步代碼 ② 檢查是否有異步代碼需要執行 ③ 執行所有微任務,如果有必要則渲染頁面 ④ 開始下一輪事件循環,執行宏任務中的異步代碼,如 setTimeout *** 56 0.1 + 0.2 不等于 0.3 的解決辦法 ① 原因:JS 采用 IEEE 754 雙精度標準,用二進制存儲的小數是無限循環的,JS 采取的標準會對數字進行裁剪。 ② 解決:自己轉換為整數后運算,或者使用原生的解決方案: parseFloat((0.1 + 0.2).toFixed(10)) === 0.3 // true *** 57 垃圾回收 ① 回收方式:標記清除、引用計數 ② 內存泄漏:意外的全局變量、閉包泄漏、DOM 被清理后仍有引用、被遺忘的定時器。 *** 58 DOM 的事件流?事件的觸發過程是怎樣的? ① 概念:用戶與瀏覽器當前頁面的交互過程稱為事件流。 ② 三個階段:捕獲階段(從最頂層元素傳遞到目標元素的父元素)、目標階段(事件到達目標元素,阻止冒泡的話就會終止)、冒泡階段(從目標元素父元素向上傳遞到頂層元素) ③ 順序:捕獲順序:window --> document --> html --> body --> 中間元素 --> 目標元素, 冒泡順序相反。 ④ 阻止冒泡: stopPropagation. *** 59 instanceof 原理 ① 功能:可以正確判斷對象的類型 ② 原理:判斷對象的原型鏈上能不能找到類型的 prototype ③ 實現:通過迭代 left.__proto__,看原型鏈上能否找到類型的 prototype function myInstanceOf(left, right) {let type = right.prototypeleft = left.__proto__while (left) {if (left == type) {return true}left = left.__proto__}return false } *** 60 GET 與 POST 的區別 ① 回退:POST 回退時會提示再次請求,GET 不會 ② 緩存:GET 主動緩存,POST 不會 ③ 參數:GET 的參數暴露在 URL 上不安全,GET 長度有限制,GET 只允許 ASCII 字符。 ④ 特性:GET 安全冪等,POST 非安全非冪等。安全指的是不引起服務器變化,冪等指的是請求多次和請求一次結果相同。 *** 61 緩存的分類,強緩存、協商緩存、跟緩存有關的 HTTP 頭部有哪些? ① 過程:瀏覽器請求資源 --> 服務器返回資源,并通過響應頭告知緩存策略 --> 瀏覽器根據響應頭決定是否緩存資源 --> 瀏覽器再次訪問檢查是否讀取本地緩存。 ② 分類: 強緩存:直接使用緩存,HTTP 頭有(Expires: 服務器過期時間,Cache-Control: 相對過期時間,在這個時間內不會去服務器請求) 協商緩存:瀏覽器與服務器協商,如果資源沒有變化,直接返回 304 Not Modified, 否則返回 200 Ok。過程是之前服務器返回一個 Last-Modified 上次修改時間,然后第二次請求時瀏覽器發送 If-Modified-Since 攜帶這個時間。更高優先級的是服務器返回一個 ETag 作為 hash,然后瀏覽器發送 If-Non-Match 攜帶這個 hash。 *** 62 webpack與grunt、gulp的不同? ① grunt 和 gulp 早期流行,現在 webpack 相對來說是主流 ② grunt 和 gulp 是基于任務和流的,找到一個文件做一系列的鏈式操作。 ③ webpack 是基于入口的,自動地遞歸解析入口所需要加載的文件,然后使用不同的 Loader 處理不同的文件,使用 Plugin 拓展 webpack 功能。 *** 63 webpack 常見的 Plugin ① define-plugin:定義環境變量 ② commons-chunk-plugin:提取公共代碼 ③ uglifyjs-webpack-plugin:通過`UglifyJS`壓縮`ES6`代碼 *** 64 webpack 的工作流程 ① 初始化參數:合并配置文件和 shell 中的參數 ② 開始編譯:初始化 Compile 對象,加載插件,執行 run 方法開始編譯 ③ 確定入口:根據 entry 找出所有入口文件 ④ 編譯模塊:從入口出發,調用 loader 編譯模塊,并對它的依賴進行遞歸編譯,就得到了翻譯后的內容和依賴關系。 ⑤ 輸出資源:根據依賴關系組裝成多個 chunk,然后根據配置的路徑和文件名寫入到文件系統。 *** 65 編寫loader或plugin的思路 Loader:單一原則,每個 Loader 只做一種工作,拿到源文件處理后返回,也可以通過 callback 返回。 Plugin: 監聽事件,在合適的時機通過 webpack 提供的 API 改變輸出結果。 *** 66 如何用 webpack 優化前端性能 壓縮代碼:刪除多余的代碼、注釋、簡化代碼的寫法。 CDN 加速:將靜態資源修改為 CDN 路徑 刪除死代碼:將永遠不會走到的代碼刪除掉。 提取公共代碼。 *** 67 清除浮動的方法 ① 使用額外標簽:在下面加一個空 div,然后設置 clear: both ② 使用BFC: 設置 overflow: hidden; ③ 使用 after 偽元素:不需要單獨加標簽,但是為了支持 IE67,增加一個 *zoom: 1. *** 68 DOM 事件級別 ① 0 級:只能注冊一個,如 element.onclick = function () {} ② 1 級:沒有 ③ 2 級:通用的方法,支持多個,如 element.addEventListener('click', function () {}) ④ 3級:是對 2 級的拓展,增加了事件類型,如 keyup *** 69 event 對象的常見應用 ① 阻止默認事件:preventDefault ② 阻止冒泡:stopPropagation ③ 當前綁定事件的元素:currentTarget ④ 當前被點擊的元素:target ⑤ 阻止調用相同事件的其他監聽器:stopImmediatePropagation *** 70 事件模型 三種事件模型: ① DOM 0 事件模型:事件不會傳播,綁定有兩種:html 代碼中直接綁定、通過 btn.onclick 綁定,移除設置成 null。 ② IE 事件模型:有兩個階段:處理階段和冒泡階段,監聽用 attachEvent, 移除用 detachEvent。 ③ DOM 2 事件模型:捕獲階段、處理階段、冒泡階段,通過 addEventListener 和 removeEventListener。 *** 71 如何實現繼承? ① 組合繼承 直接修改子類的 prototype 為新的父類實例。 Child.prototype = new Parent() ② 寄生組合繼承 修改子類的 prototype 為 Object.create 創建一個新 Parent.prototype,然后再修改子類 prototype 的 constructor 為子類本身,避免調用父類的構造函數。 Child.prototype = Object.create(Parent.prototype) Child.prototype.constructor = Child *** 72 如何判斷 this 指向? 核心:誰調用,this 就是誰 步驟: ① 如果是箭頭函數,則this就指向包裹第一層它的函數 ② 如果是通過 bind / call / apply, 則指向第一個參數 ③ 如果是普通函數,直接調用的話,則指向 window,如果是 obj.foo() 調用,則指向 obj,如果是通過 new 實例化,則 this 固定在實例上。*** 73 遞歸實現深拷貝 deepClone 函數: ① 如果是正則表達式、日期,通過構造函數返回一個新的。 ② 如果是基本數據類型(空或者typeof 不是 object),直接返回。 ③ 如果緩存 map 中有,直接返回 ④ 通過 obj.constructor() 創建一個新實例 t,并放在 map 中 obj --> t ⑤ 通過 for key in 和 hasOwnProperty 判斷擁有這個屬性,然后遞歸調用 deepClone 進行拷貝。 function deepClone(obj, map = new WeakMap()) {// 正則表達式、日期,返回一個新建的if (obj instanceof RegExp) return new RegExp(obj);if (obj instanceof Date) return new Date(obj);// 基本數據類型(null 或者 typeof 返回的不是 object的)if (obj == null || typeof obj != 'object') return obj;// map 中存放一個緩存,避免循環引用if (map.has(obj)) {return map.get(obj);}// 首先使用 constructor() 新建一個實例let t = new obj.constructor();// 然后把這個實例加入到緩存中map.set(obj, t);// for key in 的方式循環迭代這個對象的鍵for (let key in obj) {// 如果這個對象有這個屬性的話,遞歸調用本身進行深拷貝if (obj.hasOwnProperty(key)) {// 傳入的是一個子對象,和當前的 map 緩存t[key] = deepClone(obj[key], map);}}return t; } *** 74 map / filter / reduce ① map 遍歷數組生成數組,三個參數:元素、索引、原數組. [1, 2, 3].map(v => v + 1) // -> [2, 3, 4]② filter 和 map 格式一樣,功能是返回符合條件的元素數組③ reduce 接收兩個參數,第一個是**含有結果和當前元素的回調函數**,第二個是結果的初始值,功能是將數組轉換為一個值。const arr = [1, 2, 3] const sum = arr.reduce((res, current) => res + current, 0) console.log(sum) // 6 *** 75 async / await 特點、優缺點、原理 ① 概念:一個函數如果加上 async ,那么就會返回一個 Promise,看起來是將函數返回值使用 Promise.resolve() 包裝了一下。只能配合 await 使用。 ② 優點:解決回調地獄,代碼邏輯清晰。 ③ 缺點:如果異步代碼沒有依賴性卻使用了 await,會導致性能的降低。如發起多個請求,而這幾個請求之間沒有聯系,就不需要 await ④ 原理: 語法糖:async 就是 Generator 的語法糖,將星號替換成 async,將 yield 替換成 await。看起來是將函數返回值使用 Promise.resolve() 包裝了一下,而 await 就是內部 then 的語法糖。 原理:函數執行時,一旦遇到await就會返回,異步操作完成,并且調用棧清空,就會再接著執行函數體后面的語句 *** 76 Generator ① 概念:生成器是 ES6 標準引入的,看著像一個函數,function 后面加星號,可以通過 yield 和 return 返回多個值。 ② 例子: function* Generator() {yield '1'yield '2'return '3' } // 實例化一個 Generator let generator = Generator() // 連續調用四次 next() 方法 console.log(generator.next()) // {value: 1, done: false} console.log(generator.next()) // {value: 2, done: false} console.log(generator.next()) // {value: 3, done: false} console.log(generator.next()) // {value: undefiend, done: true} *** 77 JS 單線程的好處 ① 如果 JS 執行的時候 UI 線程還在工作,渲染過程變得不安全。 ② 單線程運行能夠節約內存、節約上下文切換時間。 ③ 單線程的話就不需要考慮各種線程同步、互斥、死鎖等問題了。 *** 78 null 和 undefined 的區別 大多數語言只有一個表示空的值,而 Javascript 卻有兩個,這是為什么呢? ① null 表示沒有對象,即此處不應該有值。 ② undefined 表示缺少值,此處應該有,但是卻沒有定義。 *** 79 首屏加載優化 ① loading 提示:在 js 執行期間加入用戶提示,使用 html-webpack-plugin 插件,可以在文件中插入 loading 圖。 ② 服務器渲染:服務器直接返回完整的 DOM 結構,使用 prerender-spa-plugin 插件,原理是本地模擬瀏覽器環境,然后返回預先解析好的 HTML. ③ 開啟 HTTP2: HTTP2 采用二進制分幀的方式通信,并支持多路復用、頭部壓縮、服務器推送。 ④ 開啟瀏覽器緩存:強緩存的頭部為 Expires / Cache-Control, 協商緩存的頭部為 Last-Modified / If-Not-Modified-Since、ETag / If-Non-Match。可以使用 commons-chunk-plugin 對不經常變化的第三方庫進行抽取。 ⑤ 骨架屏:使用骨架屏,Antd 有默認的 Skeleton ⑥ 動態加載:polifill 動態加載、ES6 動態加載、路由動態加載(React.lazy()、React-Loadable、AsyncComponent 動態組件) *** 80 如何避免重繪或者重排? ① 通過改變 class 的方式集中改變樣式。 ② 使用 DocumentFragment 批量操作后插入,只觸發一次重排。 ③ will-change: transform 提升為合成層。 *** 81 前端如何實現即時通訊? ① 短輪詢:每隔一段時間就發出一個請求。兼容性強,延遲高。 ② comet:基于 AJAX 的長輪詢、基于 iframe 的長連接。 ③ SSE: 服務端推送事件,請求不能復用。 ④ Websocket: 基于 TCP,雙向實時通信,但是使用復雜度高,不兼容低版本瀏覽器。我自己使用過 MQTT,是基于 Websocket 的。一方面與硬件直接通信,另一方面曾在小程序中實現實時聊天。 *** 82 HTTP2相對于HTTP1.x有什么優勢和特點 ① 二進制分幀:使用二進制而不是文本傳輸數據,解析更加高效。 ② 頭部壓縮:只發送差異頭部。 ③ 服務器推送:主動推送其他資源,不需要瀏覽器請求。 ④ 多路復用:TCP 連接可以復用。 *** 83 source map ① 概念:代碼壓縮與轉換后,如果報錯,很難找到在原文件中的位置,而 source map 能夠解決這個問題。source map 是一個存儲位置信息的文件,轉換后的代碼的每一個位置都對應著轉換前的位置。 ② 啟用:最后一行加上一個注釋 //@ sourceMappingURL=路徑 ③ 生成:使用 Google 的 Closure 編譯器 *** 84 Virtual DOM ① 概念:本質上是一個 javascript 對象,是一個節點樹,最初是 真實 DOM 的副本,React 的渲染函數從組件中創建一個節點樹,用戶操作引起數據模型變化時,根據這種變化更新樹。 ② 原理:三步,第一步數據發生變化時,重新渲染 虛擬 DOM。第二步計算前后兩個 DOM 之間的差異。第三步使用這種差異對真實 DOM 執行最小化渲染. ③ 優點:在 js 和真實 DOM 中間增加了一個緩存,因此它的更新快、DOM 操作簡單、內存消耗少。 *** 85 React 生命周期 三個階段:初始渲染階段、更新階段、卸載階段 初始化階段: componentWillMount(): 在渲染之前執行。 Render: 渲染組件 componentDidMount(): 僅在第一次渲染后執行。 運行階段 componentWillReceiveProps(): 當從父類接收到 props 并且在調用另一個渲染器之前調用。 shouldComponentUpdate(): 根據特定條件返回 true 或 false。如果希望更新組件,請返回true, 否則返回 false。默認情況下,它返回 false。 componentWillUpdate(): 在 DOM 中進行渲染之前調用。 componentDidUpdate(): 在渲染發生后立即調用。 銷毀階段 componentWillUnmount(): 從 DOM 卸載組件后調用。用于清理內存空間。 最新版的生命周期 把三個 will 給廢棄了,前面加上了大寫的 UNSAVE_ componentWillMount() 、componentWillReceiveProps() 、componentWillUpdate() *** 86 高階組件 HOC ① 概念:是重用組件邏輯的高級方法,本質上是一個函數,接收一個組件并返回一個新的組件。 ② 方式: 函數參數稱為 ComponentClass. - 屬性代理:返回新組件,render 里面渲染 ComponentClass,傳遞 props。 - 反向繼承:直接返回一個繼承 ComponentClass 的新類。 - 渲染劫持:在高階組件中可以控制 ComponentClass 的 render 渲染輸出,因此可以劫持渲染 *** 87 說一下你對 Redux 的理解 概念 Redux 是 JavaScript 中的一個應用狀態管理框架,整個應用的狀態存儲在單個 Store 的狀態樹里。 三大原則 ① 單一事實來源:整個應用的狀態存儲在單個 store 的狀態樹里。 ② 狀態是只讀的:改變狀態的唯一方法是去觸發一個動作。 ③ 使用純函數進行更改:純函數指的是輸出僅取決于輸入的函數,相同的輸入導致相同的輸出。 核心概念 ① Store: 存放數據的地方,只有一個 ② State: 包含所有數據 ③ Action: View 發起的動作,表示 State 應該發生某種變化 ④ Action Creator: 創建 Action 的函數 ⑤ Reducer:收到 Action 計算出新 State 的過程。接收 Action 和當前 State,返回一個新的 State。 ⑥ dispatch: 是 View 發起 Action 的唯一方法 ⑦ Provider: 封裝整個應用 ⑧ connect:連接 React 和 Redux,將 state 和 action 通過 props 的方式傳遞到組件中。 工作流程 ① 用戶在 View 通過 dispatch 發起 Action ② Store 調用 Reducer,計算出新的 State ③ Store 監聽 State 變化,更新 View 優點 ① 結果的可預測性 ② 可維護性,易于測試 ③ 服務端渲染,只需要將服務器上創建的 store 傳到客戶端即可 ④ 開發工具、社區生態良好 *** 88 Redux 和 Flux 的不同點 ① Redux 狀態和更改邏輯是分開的,Flux 狀態和更改邏輯是在一塊的。 ② Redux 只有一個 Store,Flux 有多個Store ③ Redux 狀態是不可變的,Flux 狀態是可變的 ④ Redux 容器組件是有聯系的 connect,Flux 是組件訂閱 Store。 “Redux 容器組件是有聯系的” 指的是 “connect 連接 Provider 及容器組件和UI組件”。 *** 89 調用 setState 之后發生了什么 ① 將傳入的參數對象和當前狀態合并,觸發調和過程,這個調和過程指的是:UI 和內存中的虛擬 DOM 保持同步的過程 ② 根據新的狀態構建狀態樹 ③ 對比前后狀態樹的差異,根據差異進行最小化渲染。 調和過程:UI 和內存中的虛擬 DOM 保持同步的過程 *** 90 React的請求應該放在哪個?命周期中? ① 先上結論:應該放在 componentDidMount中 ② 原因分析:有的觀點認為在componentWillMount中可以提前進?異步請求,避免?屏,其實這個觀點是有問題的。React 渲染?個組件時,它不會等待componentWillMount,而是會繼續 render,而且在服務器渲染時,fetch data會執行兩次,同時經過React Filber優化后,可能會執行多次。 *** 91 setState到底是異步還是同步? ① 先上結論:有時候同步,有時候異步。 ② setState只在合成事件和鉤?函數中是“異步”的,在原?事件和setTimeout中都是同步的。 ③ setState的“異步”并不是說內部由異步代碼實現,其實本身執?的過程和代碼都是同步的,只是合成事件和鉤?函數的調?順序在更新之前,導致在合成事件和鉤?函數中沒法??拿到更新后的值,形成了所謂的“異步”,當然可以通過第?個參數setState(partialState, callback)中的callback 拿到更新后的結果。 ④ setState的批量更新優化也是建?在“異步”(合成事件、鉤?函數)之上的,在原?事件和setTimeout中不會批量更新,在“異步”中如果對同?個值進?多次setState,setState的批量更新策略會對其進?覆蓋,取最后?次的執?,如果是同時setState多個不同的值,在更新時會合并進行批量更新。 *** 92 React 組件通信如何實現 ① 父子通信:props ② 子父通信:props + 回調 ③ 兄弟通信:用父節點做中轉 ④ 跨層級:Context: React.createContext() ⑤ 發布訂閱模式:引入 event 模塊 ⑥ 全局狀態管理工具:Redux / Mobx *** 93 Redux 和 MobX 的區別 ① Redux 是單一 Store,mobx 是多個 Store ② Redux 狀態不能直接修改,只能使用純函數返回一個新的狀態,mobx 可以直接修改。 ③ Redux 是函數式編程的思維,mobx 是面向對象的思維。 ④ Redux 調試方便,mobx 調試困難,結果難以預測。 *** 94 Redux 如何進行異步操作 ① 直接請求:直接在 componentDidMount中請求,但是難以管理 ② 借助異步中間件:redux-thunk、redux-saga ③ 優缺點 - redux-thunk: 一個請求需要大量代碼,耦合嚴重,很多功能需要自己封裝。 - redux-saga:異步操作單獨放在 saga.js 中,很多功能可以直接使用。 *** 95 React 有哪些性能優化的手段? ① 使用純組件 ② 使用 React.memo 進行組件記憶 ③ 使用 shouleComponentUpdate 選擇性渲染子樹。 ④ 避免 componentWillMount()中的異步請求 ⑤ 迭代時候增加唯一 key ⑥ 使用其他基本的前端優化措施。 *** 96 MVC 和 MVVM 的區別 ① 更新數據的思想不同:MVC 是 Controller 把 Model 的數據賦值給 View,而 MVVM 是 VM 層和 V 層建立雙向數據綁定。 ② 可重用性:MVC 中的 V 和 C 連接過于緊密,妨礙了獨立重用,MVVM 的 VM 可以很方便重用。 *** 97 MVC MVC: 是 Model View Controller 的縮寫,包含 ① Model:模型層,負責在數據庫中讀寫數據 ② View:視圖層,處理渲染邏輯 ③ Controller:控制器,M V之間通信的橋梁,從 View 層讀取輸入發送到 Model 層,以及將 Model 層的數據寫入 View 層。 *** 98 三欄布局,高度已知,左右兩欄固定,中間自適應 ① absolute 實現:三個都是絕對布局,設置好絕對位置,簡單快捷但是脫離文檔流。 ② float 實現:按照 left right center 的順序放置,然后 left 左浮動,right 右浮動,兼容性好但是脫離文檔流,節點順序出錯。 ③ flex 實現:父元素 flex 布局,左右固定寬度,中間 flex: 1 ④ table 實現:父元素 display: table-cell, 左右固定寬度,性能差且單元格高度要保持一致。 ⑤ grid 實現:父元素 display: grid,然后設置 grid-template-columns: 左寬度 auto 右寬度,但是兼容性差。 如果高度未知,只能用 flex 和table 三列布局 *** 99 CSS 動畫 三種實現方式: ① transition 漸變動畫:property 配置需要變化的屬性如寬高度,duration 設置過渡時間,timing-function 速度曲線,如 linear, ease, ease-in, ease-out, ease-in-out, 還可以設置貝塞爾曲線。 ② transform 轉變動畫:rotate 旋轉,scale 縮放,translate 移動, skew 傾斜。 ③ animation 自定義動畫:使用 @keyframes 配置不同百分比的值,其他的還有 name 名稱,duration 過渡時間,timing-function 速度曲線,delay 延遲,iteration-count 次數,direction 是否輪流反向播放。 例子:當鼠標指針滑過時,圖標在1秒內勻速旋轉360度 .close:hover::before{-webkit-transform:rotate(360deg);transform:rotate(360deg);-webkit-transition:-webkit-transform 1s linear;transition:transform 1s linear; } *** 100 盒模型,相互轉化 ① 包括 content padding margin border ② 標準模型、IE 模型 標準模型:寬高,box-sizing: content-box IE 模型:包括 border,box-sizing: border-box *** 101 ES6 箭頭函數和普通函數的區別 ① 語法更加簡潔、清晰 ② 箭頭函數不會創建自己的 this ③ 箭頭函數的 this 指向永遠不變,call / apply / bind 也無法改變箭頭函數 this 的指向 ④ 箭頭函數不能作為構造函數使用,因為創建對象需要 this,而箭頭函數沒有自己的 this ⑤ 箭頭函數沒有 arguments 對象 ⑥ 箭頭函數沒有 prototype ⑦ 箭頭函數不能做 Generator 函數,不能使用 yield 關鍵字 *** 102 computed和watch的區別 ① computed 支持緩存,watch 不支持緩存 ② computed 不支持異步,watch 支持異步 ③ computed 適合一對一、多對一,watch 適合一對多。 *** 103 websocket 原理 層 是傳輸層的協議 特點 ① 握手階段采用HTTP協議,默認端口是80和443,建立在TCP協議基礎之上,和http協議同屬于應用層 ② 可以發送文本,也可以發送二進制數據。 ③ 沒有同源限制,客戶端可以與任意服務器通信。 ④ 協議標識符是ws(如果加密,為wss),如ws://localhost:8023 過程 ① 瀏覽器發送請求頭 Connection: Upgrade, Upgrade: websocket,告知服務器使用的是 websocket 一個隨機數、協議名稱、協議版本 ② 服務器返回 101 切換協議,告知收到請求,成功建立連接。 ③ 開始全雙工通信優缺點 優點:推送功能、減少通信量、減少資源消耗 缺點:不支持低版本瀏覽器、服務器維護長連接需要成本。*** 104 css3新增了哪些特性 ① 邊框:border-radius, box-shadow, border-image ② 背景:background-size, backtround-origin, background-clip ③ 文字:text-shadow, text-wrap, word-break, word-wrap ④ 動畫:transform, transition, animation/@keyframes *** 105 圣杯布局 ① 兩側寬度固定,中間寬度自適應的三欄布局。 ② 實現: 使用 flex 布局實現 父元素 container 設置 flex 布局,left center right 按順序排列,設置兩端固定寬度,center 設置 flex: 1 使用浮動實現 在父元素上設置了padding-left和padding-right,在給左右兩邊的內容設置position為relative,通過左移和右移來使得左右兩邊的內容得以很好的展現 *** 106 html5 新特性 ① 語義標簽:讓開發者更加清晰地構建頁面布局。 ② 增強型表單:input 增加了一些新輸入特性,如 color 選擇顏色,date 選擇日期,tel 輸入電話等 ③ 音視頻標準:audio 和 video 元素 ④ canvas 繪圖 ⑤ SVG 繪圖 ⑥ 地理定位:getCurrentPosition() ⑦ 拖放:draggable ⑧ Web Woker:加載一個腳本文件,創建一個獨立工作的線程 ⑨ Web Storage: localStorage 和 sessionStorage ⑩ WebSocket *** 107 語義化標簽,有哪些,為什么要用語義化標簽? ① 概念:語義化標簽,顧名思義指的就是讓標簽擁有自己的含義。 ② 有哪些:常見的: header, nav, article, section, aside, footer ③ 為什么使用: 代碼結構清晰,方便閱讀與合作開發 方便其他設備解析,如屏幕閱讀器 有利于搜索引擎優化 *** 108 閉包的應用場景 給 setTimeout 的函數傳遞參數 函數防抖與函數節流 函數柯里化 *** 109 函數柯里化 curry ① 概念:柯里化是一種將使用多個參數的一個函數轉換成一系列使用較少參數的函數的技術。比方說原來是五個參數,生成柯里化函數后,五個參數可以多次調用,每次調用的參數數量都可以不一樣。 ② 實現: 函數的 length 大于參數長度的話,返回一個新函數,遞歸調用 curry,將新參數加入到原來的調用中取,否則的話返回函數的調用。let curry = (fn, ...args) => fn.length > args.length ? (...arguments) => curry(fn, ...args, ...arguments) : fn(...args) *** 110 Promise 的優缺點 優點:實現鏈式調用,解決回調地獄。 缺點: ① Promise無法取消,一旦新建就會立即執行 ② 不設置回調函數,Promise內部拋出的錯誤無法反應到外部 ③ 當處于pending狀態時,無法得知目前處于哪一階段(剛剛開始還是即將完成) *** 111 React 類組件和函數組件的區別 ① 類組件有 this,函數式組件沒有 this ② 類組件有生命周期,函數式組件沒有生命周期 ③ 類組件有狀態 state,函數式組件沒有狀態 ④ 函數式組件的性能比類組件高,因為類組件需要實例化,函數式組件直接返回結果。 *** 112 雙飛翼布局 在center這個div中再加了一個div來放置內容,在給這個新的div設置margin-left和margin-right。 left、center、right三種都設置左浮動 設置center寬度為100% 設置負邊距,left設置負邊距為100%,right設置負邊距為自身寬度 設置content的margin值為左右兩個側欄留出空間,margin值大小為left和right寬度 *** 113 CSS 加載會造成阻塞嗎? ① CSS 不會阻塞 DOM 解析,因為CSSOM 和 DOM 是并行構建的;CSS 會阻塞 DOM 渲染,因為渲染樹是兩者結合的。 ② CSS 不會阻塞 JS 加載,因為兩者是并行下載的;CSS 會阻塞 JS 執行,因為有時候通過 JS 獲取樣式,是需要 CSS 加載完成才可以獲取。 *** 114 為什么 JS 會阻塞頁面加載? JS 阻塞 DOM 解析,是因為瀏覽器將 JS 執行和 DOM 解析設置成互斥的關系,因為如果兩者可以并行,渲染可能會出現不可預知的結果,因此是 JS 先執行完畢,然后再渲染 DOM。 *** 115 圖片懶加載的實現 除了使用 JQuery,也可以使用原生方式實現圖片懶加載,思路為:給 img 增加 data-src 屬性,當圖片出現在可視區域時,將 data-src 賦值給 src。 判斷圖片出現在可視區域的方法有兩種: ① 圖片的 offsetTop 小于可見高度 clientHeight 和滾動條距離頂部的高度 scrollTop 之和 ② 圖片的 getBoundingClientRect().top 小于這個和。 *** 116 PWA ① 概念:PWA,全稱是 Progressive Web Application,中文是漸進式網頁應用。PWA 是一套理念,通過技術手段逐漸縮小與本地應用的差距。 ② 漸進性:從開發上來講,是普通網站逐步過渡到 Web 應用;從技術上來講,是逐步提供更好的新特性支持。是非常緩和的,不像以前一樣一開始就要取代 APP 、取代小程序。 ③ 原理:使用 Service Worker 解決離線存儲和消息推送的問題,在頁面和網絡之間增加一個攔截器,用來緩存和攔截請求。Service Worker 與 Web Worker 一樣,都有“運行在主線程之外”這種思想,不同的是 Service Worker 增加了緩存,以及不和單個頁面綁定在一塊。 *** 117 useEffect 第二個參數中,數組如果寫一個對象,這個對象的屬性發生變化,會執行嗎?空和空數組有什么區別? ① 如果數組元素為一個對象,對象內容發生變化,不會觸發更新,因為 useEffect 里面比較的是地址。 ② 如果傳遞空,會一直調用。如果傳遞空數組,只會執行一次。 *** 118 React Fiber 的原理和機制 ① 為什么需要 Fiber 雖然 React 的 diff 算法是經過優化的,但是它是同步的,如果有大量的節點需要更新, JS 線程的執行時間就會很長,而 JS 線程和 GUI 線程又是互斥的,用戶會感到卡頓。Fiber 可以將長時間的同步任務拆分成多個小任務,讓瀏覽器抽身去響應其他事件,等有空了再回來計算,整個渲染過程就會平滑很多。 ② 底層的數據結構 之前的數據結構是一棵樹,父節點的 children 指向了所有的子節點,Fiber 改成了三個指針:指向第一個子元素的 child,指向下一個兄弟元素 sibling,指向父元素的 return。 這樣改造后,就成為了一個鏈表。 ③ 優化的階段 react 渲染可以分為 reconcile 調度階段和 commit 渲染階段。reconcile 階段是一個從頂向下的遞歸算法,比較前后兩顆樹的差異。commit 階段使用這種差異對真實 DOM 做最小化渲染。fiber 是對 reconciler 調度階段進行分割,原因是調度階段漸進地生成 Fiber 樹,是可以被打斷的,而渲染階段不能被打斷。 ④ 工作流程 1. 在 ReactDOM.render() 和 setState 的時候開始創建更新 2. 將創建的更新加入任務隊列,等待調度 3. 在 requestIdleCallback 空閑時執行任務 4. 從根節點開始遍歷 Fiber Node, 并且構建 WorkInProgress Tree, 5. 生成 effectList 6. 根據 effectList 更新 DOM *** 119 React 核心流程有哪兩個階段?分別包含哪些生命周期? reconcile 調度階段: 廢棄的三個 will: ① componentWillMount ② componentWillReceiveProps ③ componentWillUpdate 還有兩個: ① shouldComponentUpdate ② getDerivedStateFromProps commit 渲染階段: ① componentDidMount ② componentDidUpdate ③ componentWillUnmount ④ getSnapshotBeforeUpdate *** 120 react 生命周期的廢棄,為什么廢棄,廢棄了哪些,新的生命周期有哪些,怎么替換? ① 廢棄的原因:在 Fiber 架構中,調和過程會多次執行 will,因此失去了原有的意義,多次執行的話還會影響性能。 ② 廢棄的周期:三個 will:componentWillMount、componentWillReceiveProps、componentWillUpdate ③ 新的周期:getDerivedStateFromProps 在 render 之前調用,替換 componentWillReceiveProps,getSnapshotBeforeUpdate 在 render 之后調用,在更新之前從 DOM 中獲取一些信息,實現類似 willMount 的效果。 *** 121 React Fiber 任務分割,使用的是哪兩個 API? ① requestIdleCallback ② requestAnimationFrame *** 122 requestAnimationFrame ① 核心思路:是讓系統來決定回調函數的執行時機,保證回調函數在屏幕每一次的刷新間隔中只執行一次,在 60 Hz 的刷新率下,每一幀是 16.7 ms ② 調用格式:直接將回調函數作為 rAF 的參數。 ③ 優勢: CPU 節能,setTimeout 會在后臺執行,而rAF 頁面未激活的時候會暫停,節省 CPU 開銷。 函數節流:可以使用 rAF 實現函數節流,將函數作為 rAF 的參數。 *** 123 requestIdleCallback ① 概念:requestIdleCallback 的作用是在瀏覽器一幀的剩余空閑時間執行優先級相對較低的任務。 ② 缺點:內置的 requestIdleCallback FPS 只有 20 Hz,因此 React 自己進行實現,非 DOM 環境下可以使用 setTimeout 模擬,DOM 環境下則配合 requestAnimationFrame 實現一個 requestHostCallback,也就是 requestIdleCallback。 *** 124 如何解析 jsx? 首先使用 babel 編譯轉化為 React.createElement 的對象形式,然后通過 ReactDOM.render 渲染 DOM 元素。 *** 125 Fiber 的單鏈表是如何 Diff 得到 change 的呢? ① 雙緩沖技術:使用另一顆樹 WorkInProgress Tree, 代表要刷新到屏幕的未來狀態。 ② 構造完畢之后,得到的就是新的 Fiber Tree, 然后喜新厭舊將 current 指針指向 WorkInProgress Tree ,丟掉舊的 Fiber Tree. *** 126 flex 布局可以設置哪些屬性? flex-direction, flex-wrap, flex-flow, justify-content, align-items, align-center flex-direction 主軸方向:row | row-reverse | column | column-reverse flex-wrap 是否換行:nowrap | wrap | wrap-reverse flex-flow : direction 和 wrap 的簡寫形式 justify-content: 在主軸上的對齊方式: flex-start | flex-end | center | space-between | space-around align-items: 在交叉軸上如何對齊: flex-start | flex-end | center | stretch | baseline align-center 多根軸線的對齊方式, *** 127 css 的單位 絕對長度: cm, mm, in, pt, pc, px 相對長度: em: 相對于當前元素的尺寸 %: 百分比 rem: 相對于根元素的尺寸 vw: 視圖寬度 vh: 視圖高度 vmin: vw, vh 較小的那個 vmax: vw, vh 較大的那個 *** 128 層疊上下文 ① 概念:是 HTML 元素的三維概念,在一條假想的 z 軸上延伸。 ② 創建:默認創建的根元素、需要配合 z-index 的 relative / absolute / fixed, 不需要配合 z-index 的 (opacity 小于 1、transform 不為 none, will-change ) ③ 順序:負 z-index --> block --> float --> inline/inline-block --> z-index: auto/0 --> 正 index *** 129 css 布局 ① 浮動布局:float ② 位置布局:position: relative、absolute、fixed、table、grid、flex。 *** 130 CSS 預處理、后處理 預處理:為 css 增加一些編程特性,將 css 作為目標生成文件,有 scss, less, stylus 后處理:對 css 處理,生成 css,如自動處理兼容性問題的 autoprefixer. *** 131 display 有哪些取值? none 不顯示 inline 行內元素 list-item 列表元素,如 li inherit 繼承 block / inline-block 塊級元素、行內塊元素,可以設置寬高度 table / inline-table 塊級表格 flex / inline-flex 彈性布局 *** 132 相鄰的兩個inline-block節點為什么會出現間隔 ① 原因:代碼中的回車、換行會被當成文檔節點處理,間隔就是空的文檔節點導致的。 ② 解決: 去掉這個文檔節點 font-size: 父元素 font-size: 0, 子元素設置自己的 font-size margin 負值 父元素 display: table, word-spacing: 0 *** 133 meta viewport 移動端適配有哪些配置項 width : 設置viewport 的寬度 height: 設置viewport 的高度 initial-scale : 設置頁面的初始縮放值 minimum-scale :允許用戶的最小縮放值 maximum-scale:允許用戶的最大縮放值 user-scalable: 是否允許用戶進行縮放,值為"no"或"yes", no 代表不允許,yes代表允許 *** 134 CSS實現寬度自適應100%,寬高16:9的比例的矩形 ① 計算高度,寬度 100%,高度為 56.25% ② 設置 width: 100%; height: 0px; padding-bottom: 56.25%; ③ 內容使用 position: absolute. *** 135 rem布局的優缺點 ① 優點:能實現自適應 ② 缺點:不支持 IE,相對于 html 根元素判斷大小,屏幕變化的時候不是很好控制。 *** 136 如何用一個 div 模擬 textarea 給 div 添加 contenteditable=true *** 137 移動設備忽略將頁面中的數字識別為電話號碼的方法 <meta name = "format-detection" content = "telephone=no"> *** 138 實現繼承有哪幾種方式? ① 構造函數繼承 直接 Parent.call(this) 缺點:prototype 上的方法無法繼承 ② 原型鏈繼承 設置 Child.prototype = new Parent(), 缺點:丟失了 constructor、原型鏈上引用類型的數據會被所有實例共享。 ③ 組合繼承 同時使用了 Parent.call(this)和Child.prototype = new Parent(),并恢復了 constructor: Child.prototype.constructor = Child。 缺點:調用了兩次 Parent 的構造函數。 ④ 寄生組合繼承 使用 Object.create(Parent.prototype) 實現原型鏈的淺拷貝。 暫無缺點。 *** 139 arguments arguments 是一個對應于參數的類數組對象。除了 length 和索引訪問外沒有任何 Array 的屬性,可以通過 Array.prototype.slice.call(arguments) 轉化為標準的數組。 *** 140 JS 作用域和作用域鏈 作用域:全局作用域、函數作用域 作用域鏈:在當前作用域沒有查到值,就會向上級作用域查,直到全局作用域,這個查找的過程稱為作用域鏈。 *** 141 圖片懶加載、預加載 懶加載:到達可視區域將 data-src 賦值給 src 預加載:JS 中通過一個 Image 對象事先設置 src 屬性,就會觸發預加載,真正使用的時候設置 img 標簽的 src,就會直接從緩存中取。 *** 142 網頁加載進度條實現 ① 使用定時器定時固定的時間,做一個模擬的進度條。 ② document.onreadystatechange 監控加載狀態,四種狀態:未初始化、加載中、可交互、加載完成。 ③ 給重要節點增加 JS 代碼,改變進度條顯示。 ④ 實時監控加載情況,顯示加載百分比,如很多個圖片,給圖片注冊 onload 事件,每一個加載完成都更新加載進度。 *** 143 如何先冒泡再捕獲 根據w3c標準,應先捕獲再冒泡。若要實現先冒泡后捕獲,給一個元素綁定兩個addEventListener,其中一個第三個參數設置為false(即冒泡),另一個第三個參數設置為true(即捕獲),調整它們的代碼順序,將設置為false的監聽事件放在設置為true的監聽事件前面即可。 *** 144 window的onload事件和domcontentloaded onload:所有的都加載完成了。 DOMContentLoaded: 僅 DOM 加載完成 *** 145 for in / for of / forEach / for 的區別? for in 和 for of 的區別 for ... in : 迭代的是 key for ... of : 迭代的是 value forEach 和 for 的區別 forEach 中的一個參數,每次都是創建的一個新變量 forEach 不能 break、continue forEach 一次只能循環一個數組 *** 146 立即執行函數和使用場景 概念 顧名思義,就是函數定義后立即執行,聲明并立即執行一個匿名函數。 作用 ① 不需要聲明,避免污染全局變量。 ② 形成了一個單獨的作用域,可以封裝一些外部無法讀取的私有變量。 ③ 封裝臨時變量,如 for var 循環,使用立即執行函數能避免一直輸出相同的值。 *** 147 數組的常見方法 不改變數組的方法 名稱 參數 功能 concat 一個或多個數組 返回連接的結果 slice [開始位置,結束位置) 返回截取的結果 join 字符串 返回用字符串連接數組元素的結果 toString 無 返回數組內容,逗號隔開 改變數組的方法 名稱 參數 功能 reverse 無 反序 shift 無 刪除并返回第一個元素的值 pop 無 刪除并返回最后一個元素 unshift 元素 在首位加入元素 push 元素 在尾部加入元素 sort 無或者一個回調函數 排序,默認字典序升序,可以通過回調更改排序行為 splice 開始位置,元素數目 從開始位置刪除并返回元素 ES6 中的方法 forEach, map, filter,reduce, reduceRight every 是否所有的都滿足條件 some 是否有一個滿足條件 indexOf, lastIndexOf *** 148 css-loader 原理 css 轉換成 js,被其他 js 引用,同時導出轉換前后的類名對應關系。 *** 149 瀏覽器內核 IE 瀏覽器的 Trident, 火狐瀏覽器的 Gecko,Safari 的 Webkit, 谷歌瀏覽器的 Chromium/Blink *** 150 模塊化:commonJS,es6,cmd,amd ① commonJS: API 是 require, module.exports 或 exports, 模塊輸出的是一個值的拷貝,運行時同步加載。 ② AMD: require.js 實現。中文是異步模塊定義,API 是 define, require, 異步加載,但是不能按需加載。 ③ CMD: sea.js 實現,能夠按需加載。 ④ es6: API 為 import /export,輸出的是值的引用。 *** 151 小程序和傳統的 web 有什么區別呢? ① 大小有限制 ② 不能直接操作 DOM ③ 樣式不能引入本地資源 ④ 提供了豐富的額外功能。 *** 152 小程序的架構?小程序為什么要有很多限制?怎么設計的,怎么實現的? ① 小程序框架分為邏輯層和視圖層兩部分,邏輯層并非運行在瀏覽器中,因此 JS 的一些能力無法使用。 ② 實現:所有代碼打包成一份 JS 文件,IOS 中運行在 JavaScriptCore 上,Android 中運行在 V8 中,開發工具中運行在 NW.JS 中。架構描述: 微信小程序主要分為 邏輯層 和 視圖層,以及在他們之下的原生部分。邏輯層主要負責 JS 運行,視圖層主要負責頁面的渲染,它們之間主要通過 Event 和 Data 進行通信,同時通過 JSBridge 調用原生的 API。這也是以微信小程序為首的大多數小程序的架構*** 153 能直接用 React 開發小程序嗎?它是怎么做的? Taro, 通過編譯的方式,將 jsx 轉換成小程序的格式。 *** 154 通過編譯運行小程序的方案,有什么缺陷? JS 是一個動態語言,使用靜態的方式去分析是非常復雜的,稍微有點改動,編譯可能就會失敗。 *** 155 除了編譯的方案,還有別的方案在小程序中使用 react 嗎? 采用動態模板的方式。如 Remax,是一個通過 react-reconciler 實現的小程序端的渲染器,引入一層 VNode。https://remaxjs.org/guide/implementation-notes① React 在 reconciliation 過程中不是直接去改變 DOM,而先更新 VNode。React 更新完成之后,將組件轉換成 VNode 對象。 ② 事先構建了一個 頁面模板,然后將整個節點數遞歸遍歷出來。 *** 156 antd 大的組件包怎么做按需的構建?實現的原理是怎樣的? babel-plugin-import 將 import { Button} from 'antd' 替換成具體的路徑,antd/lib/xxx *** 157 Redux 最后一步,為什么 Store 變化 View 就變化?具體是怎么變化?Provider 掛了一個 Store,Store 變化了,下面的組件怎么知道自己需要變化了? ① 實現的關鍵是 Context ② Provider:將 store 通過 Context 傳給后代組件,注冊對 store 的監聽 ③ connect:一旦 store 變化就會執行 mapStateToProps 和 mapDispatchToProps 獲取最新的 props 后,將其傳給子組件。 *** 158 如果說讓你做一個很大型的項目,有很多模塊,出現樣式沖突的問題,有什么解決思路? CSS Module *** 159 CSS Module 的原理是怎樣的? ① 將類名編譯成一個哈希字符串 ② css 里面也進行替換 *** 160 react 服務器渲染怎么做的?服務端渲染 怎么做的 核心 api 是 renderToString ① 啟動一個 node 服務 ② 把 react 根組件用 reanderToString 渲染成字符串返回給前端 ③ 前端再渲染一次:恢復生命周期、給組件綁定事件以響應用戶操作好處是什么 ① SEO 收錄更好 ② 減少白屏 ③ 支持更多后端代碼模板的支持 *** 161 如果我想做一個從 A 頁面跳轉到 B 頁面,打一次點,怎么實現?更簡單一些,打開 A 頁面的時候要直接 alert 一下,怎么實現?進入每一個頁面的時候,發一次請求。 ① 給 history 對象添加自定義監聽事件,接收參數為 location,里面有 pathName ② 給 layout 組件使用 withRoute 變成路由組件,然后在 componentWillReceiveProps 中處理。 *** 162 如果設計一個比較完整成熟的爬蟲方案,你大題的思路是怎樣的? 引擎、調度器、下載器、爬蟲、管道、中間件 *** 163 你覺得小程序這個知識體系有什么缺陷嗎? 無法形成一個統一的標準 大小限制 頁面棧深度有限制 框架不穩定 社區不開源 *** 164 React Native 大致的原理 ① JavaScriptCore 負責執行 JS 代碼 ② React 用來管理虛擬 DOM ③ Bridges 翻譯 React 指令繪制原生組件,同時將原生組件的事件反饋給 React *** 165 React Native 有什么弊端 平臺沒有完全統一、升級版本麻煩、并不能減少人力成本、不夠穩定、性能趕不上原生 *** 166 微前端是怎樣實現的 概念 這是一個普適的物理定律,熵增定律:任何物體在沒有接受外界能量的條件下,總是朝著熵增(無序)的方向變化。而表現在前端上面就是,在分離了前后端之后,業務拓展,應用變大,需要拆分成更小的單位。 多種方式 ① 通過反向代理分派到對應的應用上。 ② 通過路由管理器和應用管理器動態加載子應用。劫持 window.history, 如果是不同的子應用,卸載之前的 bundle,然后加載新的 bundle。 難點關鍵點 ① 多 Bundle 集成:服務端集成、構建時集成、運行時繼承(iframe、前端路由等) ② 影響隔離:樣式隔離(CSS 預處理 SASS, 模塊定義 CSS Module, CSS in JS)、作用域隔離(ES6, AMD, CMD, CommonJS) ③ 資源復用:基礎資源、UI 組件、業務組件 ④ 應用間通信:比如使用 iframe 的話,可以用 window.postMessage。其他的話可以在全局派發消息給各個 app。或者使用發布訂閱模式 + 單例模式,父工程生成實例傳遞給子工程。 ⑤ 測試:單元測試、功能測試、集成測試。 https://zhuanlan.zhihu.com/p/96464401 *** 167 前端發展趨勢 前端后端化、前端工程化、跨端開發 ① 前端后端化:前端全棧化、Serverless ② 前端工程化:從項目初始化,到編寫代碼,到測試發布,會形成一個完整的閉環體系。 ③ 跨端開發:小程序技術繼續升級、RN、Flutter、SwiftUI 也迅速發展。 *** 168 CSS 組合選擇器的優先級 計算 ID 選擇器的個數為 a,類選擇器、偽類選擇器、屬性選擇器的個數為 b,標簽選擇器和偽元素選擇器的個數為 c,按照 a、b、c 的順序比較大小,如果相等則使用就近原則。 *** 169 react-router路由有哪些形式?(hash, history)區別是什么?history模式是用的瀏覽器的哪個對象?有哪些常用方法? HashRouter: 帶有 #,通過 hash 值對路由進行控制 BrowserRouter: 不帶 #,傳統的斜杠分割,原理是使用 history 對象,方法有 pushState, replaceState, popState. *** 170 redux是怎么做全局數據管理的?組件通過什么api拿到數據? redux 原理 Provider 通過 Context,將數據直接傳遞子孫組件。 api mapStateToProps、mapDispatchToProps *** 171 context了解嗎? ① 概念:通過 context ,直接進行跨層級的組件之間的通信。 ② 使用: 生產者 - 消費者設計模式const { Provider, Consumer } = React.createContext(defaultvalue) 通過 createContext 獲得一個 Provider 和 Consumer,Provider 提供數據,在最外層包裹。Consumer 在 Privider 里面嵌套,通過回調的方式獲取數據。 23種設計模式 Abstract Factory(抽象工廠):提供一個創建一系列相關或相互依賴對象的接口,而無需指定他們的具體的類。 Adapter(適配器):將一個類的接口轉換成調用者希望的另外一個接口。適配器模式是的原本由于接口不兼容而不能在一起工作的那些類可以一起工作。 Bridge(橋接):將抽象部分與他的實現部分分離,使他們都可以獨立的變化。比如在實體類里面使用聚合,該聚合的屬性為抽象的,可以動態改變其真正的實現類,聯想spring ioc 的注入。 Builder(建造者):將一個負責對象的構建與他的表示分離,使得同樣的構建過程可以創建不同的表示。建造者模式比工廠模式多了一個指揮者的角色,比如某商品是需要由不同工廠加工而成的零件拼裝而成,在指揮者角色中指揮由不同工廠創建的零件的拼裝過程。 Chain of Responsibility(責任鏈):為解除請求的發送者和接受者之間耦合,而使多個對象都有機會處理這個請求。將這些對象連成一條鏈,并沿著該鏈傳遞請求,直到有一個對象處理他。是消除多個if-else的好方法。 Commond(命令):將一個請求封裝成一個對象,該對象里面封裝了真正動手的服務類,從而使你可用不同的請求對具體服務進行參數化;對請求排隊或記錄請求日志,以及支持可消除的操作。 Composite(組件):將對象組合成樹性結構以表示“部分-整體”的層次結構。Composite使得客戶對單個對象和復合對象的使用具有一致性。重點在于形成一個樹形結構。 Decorator(裝飾者):動態給一個對象添加一些額外的職責。就拓展功能而言,Decorator模式比生成子類方式更加靈活。可以聯想到以前做swing的時候很多時候用到了裝飾者模式動態增加功能。 Facade(外觀):為子系統中的一組接口提供一個一致的對外操作方法。Facade模式定義了一個高層接口。這個接口使得這一子系統更加容易使用。可以聯想到當我們拿到一些開源項目的時候,我們使用了一個類對一系列的操作進行封裝,這其實就是外觀模式。 Factory Method(工廠):定義一個用于創建對象的接口,讓子類決定將哪一個類實例化。Factory Method 使一個類的實例化延遲到其子類。聯想到將原料放入類返回產品(對象)。 Flyweight(蠅量):運用共享技術有效的支持大量細粒度的對象。比如可以使用一個List對一些相同的對象進行封裝,然后通過定義好的一系列接口對所有對象進行操作。 Interpreter(解釋器):給定一個語言,定義他的文法的一種表示,并定義一個解釋器,該接解釋器使用該表示來解釋語言中的句子。比較少用到,可以聯想到一些語言的解析。 Iterator(迭代器):提供一種方法順序訪問一個聚合對象中各個元素,而又不需暴露該兌現的內部表示。聯想到List的迭代器,就是封裝了內部的數據結構,其實內部的結構是一個一維數組,Object[]。 Mediator(中介者):提供一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立的改變他們之間的交互。把*型交互轉換為以中介者為核心的中心者交互。 Memento(備忘錄):在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可以將該對象回復到保存的狀態。一般使用數據庫做持久化處理,還未聯想到該模式使用用途。 Observer(觀察者):定義對象間的一種一對多的依賴關系,以便當一個對象的狀態發生改變時,所有依賴他的對象都得到通知并自動更新。原理是在被觀察者中增加List**存儲觀察者**,每次被觀察者又什么動靜時,調用方法,統一調用List里面的觀察者的被通知方法。jdk有提供相應api Prototype(原型):用原型實例指定創建對象的種類,并且通過拷貝這個原型來創建新的對象。java使用.clone()方法進行對象的克隆。使用該方法時,是通過直接復制二進制數據來創建一個復制的對象,效果比用new 反射快的多。 Proxy(代理模式):為其他對象提供一個代理以控制對這個對象的訪問。代理與真正的實體實現同一接口,代理依賴實體類。當用戶調用代理類的方法時,可以在上面做一些處理,在調用真正的實體。java提供動態代理api,以前使用動態代理做日志記錄,屏蔽,防護等。但是后來spring aop 功能出現,代替了動態代理功能。 Singleton(單例):保證一個類僅有一個實例,并提供一個訪問他的全局訪問點。全局只有一個對象,有懶加載模式,餓加載模式,還有使用靜態內部類加載模式。 State(狀態):允許一個對象在其內部狀態改變時改變他的行為。對象看起來似乎修改了它的所屬的類。實體對象依賴狀態,把所有操作都分別封裝在具體的狀態中,讓狀態對象幫我干活。 Strategy(策略):定義一系列算法,把他們一個個封裝起來,并且使他們可互相替換。本模式使算法可變化可獨立于使用他的用戶。同樣也是使用組合模式,但是狀態是封裝了實體類的所有操作,而策略只是改變了他具體行事的某一個或幾個方法。策略的意圖在于算法的封裝與動態改變。 Template Method(模版):定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。Template Method 使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。聯想,大牛定義父抽象類,把高難度算法寫好封裝在父抽象類中并定義好算法執行步驟,又菜鳥基礎該抽象類,實現那些無聊的邏輯方法。 Visitor(訪問者):表示一個作用于某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。通過別人去訪問自己的方法。 https://www.runoob.com/design-pattern/design-pattern-tutorial.html *** 172 異步請求用的多嗎 ① 回調函數 ② Promise ③ async/await ④ Generator/yield *** 173 Promise 看過實現嗎?大概說說?哪些屬性?哪些方法? 實現: ① 成員變量:當前值、狀態、兩個異步任務隊列 ② 構造函數:一開始就要執行 fn ③ 方法 resolve: 如果狀態為 pending,則設置值,設置狀態為完成,成功隊列回調當前值 reject: 如果狀態為 pending,則設置值,設置狀態為失敗,失敗隊列回調當前值 then: 如果狀態為 pending,將傳入參數分別 push 到兩個隊列;如果狀態為完成,第一個參數去處理;如果狀態為失敗,第二個參數去處理。 方法: then / catch / resolve / reject all race *** 174 axios用過嗎?哪些方法? get: 第一個參數為地址,第二個參數為攜帶的參數 post:第一個參數為地址,第二個參數為 body all:多個請求并發,先 all, 然后.then 中用 spread 確保兩個請求都成功 一開始還可以進行配置、創建實例、添加攔截器 interceptors *** 175 常用DOM操作API 節點查找 getElementById 根據 ID 獲取元素 getElementsByClassName 根據 CLASS 獲取元素 getElementsByTagName 根據標簽獲取元素 getElementsByName 根據 NAME 獲取元素 節點創建 createElement 創建元素 createTextNode 創建文本節點 createDocumentFragement 創建文檔碎片,大量操作 DOM時可以減少重排 節點修改 appendChild 添加子節點 insertBefore 在某節點前添加節點 insertAdjacentHTML: 在四個位置添加 HTML 代碼 removeChild 刪除子節點 元素屬性 setAttribute: 設置屬性 getAttribute: 獲取屬性 hasAttribute; 是否含有屬性 *** 176 有用過前端路由框架嗎?vue router或者react router?可以講講原理嗎?比如頁面不刷新的時候切換路由。 原理 ① 核心原理:根據不同的路由,去渲染不同的組件。 ② 實現:點擊按鈕后,首先設置window.location.hash = 'xxx', 然后返回不同的組件。這是 hash 路由的切換方式,可以不刷新切換路由。另一種是 window.location.pathname = 'xxx',但是它會刷新頁面。替代方式是 window.history.pushState 第三個參數傳遞 pathname(數據、標題、路徑) 不刷新的時候切換路由 window.location.hash window.history.pushState() *** 177 css-loader是做什么的?假如寫了一段css,最終是如何在瀏覽器上渲染的? ① css-loader 的作用:將 css 加載到 js 代碼中,但是并不會使用。 ② 需要使用 style-loader,將 css-loader 解析后的內容掛載在 html 頁面中。 *** 178 寫過webpack插件嗎 只嘗試過 HelloWorld,比方說實現在打包完成后,顯示一行 Hello World 消息 ① 創建一個 HelloWorldPlugin 函數 ② 設置 HelloWorldPlugin.prototype.apply 為一個 function,攜帶 compile 參數,然后再 compile.plugin('done', 回調函數),在回調函數中寫邏輯 ③ 將插件加入到配置文件中的 plugins 中 *** 179 tree shaking tree shaking tree shaking 直接找出使用的代碼,掃描所有 export,找到被 import 的內容添加到最終代碼中,而不是傳統的先添加再剔除。 *** 180 模塊化進化史 ① 全局 function 模式:函數直接掛在 window 上,很容易沖突。 ② namespace 模式:將函數掛在一個對象上,但是屬性不是私有的。 ③ 立即執行函數:屬性私有,只能通過暴露的方法修改。 ④ commonJS: 通過 module.export 和 require,對外暴露一個拷貝。 ⑤ ES6: import / export,是一個引用 ⑥ 其他的還有:AMD, CMD AMD: require.js 實現。中文是異步模塊定義,API 是 define, require, 異步加載,但是不能按需加載。 CMD: sea.js 實現,能夠按需加載。 *** 181 hook介紹 hook 允許在純函數中使用 React 的各種能力,包括: ① useState: 使用狀態。 ② useEffect: 傳入空數組,替代 didMount。傳入依賴,依賴發生變化時就會執行。 ③ useRef: 使用實例對象 ④ useContext: 使用跨層級傳遞數據的 Context *** 182 Vue生命周期 - beforeCreate - created - beforeMount - mounted - beforeUpdate - updated - beforeDestroy - destroyed *** 183 Vue雙向綁定原理, proxy, defineProperty ① 2.0 通過 Object.defineProperty 數據劫持實現,弊端是需要克隆一份對象,需要給每一個屬性都設置監聽 ② 3.0 通過 ES6 的 Proxy 委托代理實現,不需要克隆,而且只需要對整個對象進行代理。 *** 184 auth協議 OAuth OAuth 簡單理解就是一種授權機制,它是在客戶端和資源所有者之間的授權層,用來分離兩種不同的角色。在資源所有者同意并向客戶端頒發令牌后,客戶端攜帶令牌可以訪問資源所有者的資源。 token 擁有權限范圍,有時效性的,到期自動失效,而且無效修改。 四種方式 ① 授權碼:如小程序中 wx.login 獲取 code,然后 code + secret 換取 accesss_token ② 隱藏式:沒有后端,跳過授權碼,直接返回令牌 ③ 密碼:用戶名 + 密碼換取令牌。 ④ 憑證:app_id + app_secret 換取 access_token *** 185 let const var區別 ① 全局變量:var聲明的變量會掛載在window上,而let和const聲明的變量不會: ② 變量提升:var聲明變量存在變量提升,let和const不存在變量提升 ③ 作用域:var 是函數作用域,let和const是塊級作用域 ④ 重新定義:同一作用域下let和const不能聲明同名變量,而var可以 *** 186 前端路由實現 ① location.hash:當 url 的 hash 值發生變化時,會觸發 onhashchange 事件,通過 window.location.hash 可以獲取到,然后根據不同的 hash 加載相應的組件。 ② history.pushState(數據,標題,路徑):通過 history.pushState() 方法設置路由地址,通過 onpopstate 事件監聽修改,加載相應的組件。 *** 187 長連接和多路復用的區別 長連接是逐個復用同一個連接,多路復用是同時復用同一個連接。 好比面試,長連接是您辛苦的面完一個又一個,而多路復用是您對我們進行群體面試。 *** 188 css的position有哪些屬性值?分別是相對于誰定位的? ① static 沒有定位,元素出現在正常的流中。 ② relative 相對定位,相對于原來的位置定位。 ③ absolute 絕對定位,相對于最近一級不是 static 的父元素定位。 ④ fixed 固定定位,相對于窗口或 frame 定位。 ⑤ sticky 粘性定位,在指定的位置進行粘性操作。 *** 189 git rebase了解嗎 將本地的多次提交合并為一個,以簡化提交歷史,扁平化提交。 *** 190 git commit -m提交后,message寫錯了想修改怎么辦 git commit --amend *** 191 為什么url變化頁面不會刷新 pushState 只是改變瀏覽器的歷史記錄,以及地址欄的顯示,但并不會導航至任何頁面。 本來就不會刷新,因果關系是,頁面發生變化,然后瀏覽器設置地址欄那個控件的值為新的 url,而不是反過來。 *** 192 使用history模式需要服務器端怎么做配合 如果 URL 匹配不到任何靜態資源,則應該返回 index.html 頁面 *** 193 ref、useRef ① ref、useRef 都能獲取到一個組件的引用。 ② useRef 還能用來跨渲染周期保存數據。 ref 的常規用法 ① ref = 一個回調函數,在回調函數中給變量賦值,記錄了當前組件。 ② ref = 一個字符串,則可以在 this.refs 中以鍵的方式訪問 同理,useRef 也有這樣的常規用法,一般是: 首先通過 const couterRef = useRef(); 創建一個 couterRef, 然后給 Counter 組件的 ref 等于這個 counterRef: ```javascript const couterRef = useRef() ... <Counter ref={counterRef}/> ...

然后就能夠通過 counterRef.current 訪問這個 DOM 對象。

useRef 的第二個用法:跨渲染周期保存數據

// 首選創建一個 ref const timerID = useRef()// 初始的時候,給 timerID.current 設置一個定時器 useEffect(() => {timerID.current = setInterval(()=>{setCount(count => count + 1);}, 1000); }, []);//

194
Object.is() 用來做什么?
比較基本類型,值相同。比較引用類型,引用相同。


195
為什么使用 React.Children.map(props.children, () => {}), 而不是直接 props.children.map(() => {})?
因為不能保證 props.children是一個數組,單個的話就是一個對象,多個才是數組,而React.Chilredn.map可以自動處理這兩種情況。


196
描述事件在 React 中的處理方式
① 事件處理程序通過合成事件 (SyntheticEvent) 的實例傳遞,SyntheticEvent 是瀏覽器原生事件跨瀏覽器的封裝。SyntheticEvent 是池化的,可以通過 e.persist() 對事件進行保留。但是在 React 17 中,移除了事件池,不需要主動保留了。
② React 沒有將事件附加在子節點本身,而是通過事件委托模式代理。


197
ES5 / ES6 的 React 有什么區別?
① 組件定義:ES5 使用 React.createClass, ES6 是繼承 Component 的一個 class。
② 默認 props: ES5 使用 getDefaultProps, ES6 使用 defaultProps
③ 初始 state: ES5 使用 getInitialState, ES6 使用 this.state = xxx


198
Object.assign() 的作用
① 用法:
Object.assign(target, …sources)
② 作用:將所有可枚舉屬性的值從一個或多個源對象復制到目標對象,并返回目標對象。


199
Reducer 文件里,對于要返回的結果,要注意什么問題?
需要使用 Object.assign({}, state, …newState)淺拷貝一份。


200
Vue 和 React 的區別
① 編寫方式:Vue 使用 HTML 模板文件,React 完全使用 JS 創建 DOM
② 數據綁定:Vue 是雙向綁定,React 是單向流動。
③ 狀態:React 中 state 是不能直接改變的,需要使用 setState,而 Vue 中 state 不是必須的,數據主要是在 data 屬性里,能直接修改。


201
副作用是什么?
函數式編程將那些與數據計算無關的操作,都稱為副作用 side effect。如生成日志、存儲數據、改變狀態等。


202
HTTP 管線化
管線化后,請求和響應不再是交替的順序。可以一次性發送多個請求,一次性接收多個響應。只支持 GET 與 HEAD。


203
HTTP 3
讓 HTTP 跑在 QUIC 上,而不是 TCP 上,QUIC 的特點有以下幾個方面:
① 基于 UDP, 實現快速握手。
② 在 UDP 的基礎上,實現了類似 TCP 的超時重傳、流量控制、擁塞控制等可靠性措施。
③ 集成了 TLS1.3,減少了握手時間。
④ 多路復用,同一條物理連接上可以有多個獨立的邏輯數據流,徹底解決 TCP 中隊頭阻塞的問題。


204
React.lazy() 用法
用途是動態調用 import(), 封裝的是組件的導入行為,需要配合 Suspence 使用,Suspence 有一個 fallback 屬性,用來在異步加載的時候,顯示一個 Loading


205
PureComponent 的使用、純組件與普通組件的區別
純組件的使用
① PureComponent 通過 props 和 state 的淺比較實現 shouldComponentUpdate
② 如果狀態更新涉及到一個對象內部的更新,則不應該使用 PureComponent.

純組件與普通組件的區別
① 純組件在 render 之前會進行淺比較,普通組件不會。
② 也不能濫用純組件,因為純組件多了一個淺比較的步驟,濫用反而拖累性能。

順便說一下,React 判斷類組件是否需要更新,只有兩個地方:
一是看有沒有shouldComponentUpdate方法,二就是這里的PureComponent判斷


206
useEffect 返回函數的作用是什么?
清除上一次副作用遺留下來的狀態。


207
useMemo、useCallback 的用法
① 使用 useMemo 可以避免無用方法的調用:一個函數直接寫在 render 中,當重新渲染的時候,就會又觸發一次這個函數。而如果使用 useMemo 包裹,則只當依賴變化的時候才會調用,渲染的時候不會主動觸發。
② useCallback: 相當于 useMemo 回調函數返回一個函數.


208
TS 都有哪些數據類型?
在 js 基礎上,增加了:
tuple 元祖
enum 枚舉
any, never 任意值
void 沒有返回值


209
webpack 的緩存機制,三種 hash?
① hash: 修改任何一個文件,所有文件的 hash 都會改變
② chunkhash: 根據不同的入口文件,生成對應的哈希值。將公共庫和程序入口文件分開,只要不改動公共庫的代碼,就可以保證其哈希值不會受到影響。
③ contenthash: chunkhash 有個問題,css 或 js 改變,與之關聯的文件的 hash 也會改變,哪怕其文件內容沒變。contenthash 能夠解決這個問題。


210
DOM 樹的構建過程
① Conversion 轉換:將 HTML 內容根據編碼轉換為字符流。
② Tokenizing 分詞: 根據 HTML 規范,將字符流解析為標記。
③ Lexing 語法分析: 將標記轉換為對象,并定義屬性和規則。
④ DOM 構建: 根據 HTML 標記關系,將對象組成 DOM 樹。


211
no-cache 指的是不緩存嗎?
不是,no-cache 指的是每次都向服務器驗證。no-store 才是不緩存。


212
DNS 預解析
① 自動解析:http 下碰到 a 標簽,會自動解析,https 為了安全默認不會。
② 手動解析:
link 標簽:
meta 標簽,可強制開啟 HTTPS 下的預解析:


213
Scope Hoisting
分析模塊之間的依賴關系,盡可能地把打包出來的模塊合并在一個函數中去,能減少代碼量,開啟方式是設置 optimization.concatenateModules 為 true


214
Object.create() 作用,實現
作用:創建一個新對象,使用現有的對象來提供新對象的 proto
實現:創建一個空函數,然后函數的 prototype 等于 obj,然后再恢復 constructor,最后返回一個實例化
Object.prototype.myCreate = function (obj) {
function Fn () {}
// 這里直接指向 obj
Fn.prototype = obj
Fn.prototype.constructor = Fn
return new Fn()
}


215
React setState 是同步還是異步?
結論:既可能是同步的,也可能是異步的。
具體來說:在 React 內部機制能檢測到的地方,setState 就是異步的;在 React 檢測不到的地方,如 setInterval, setTimeout 里,setState 就是同步的。
再細節一點:本身并不異步,只是因為 React 的性能優化機制表現為異步。在 React 的生命周期函數或作用域下為異步,在原生的環境下為同步。


216
nodeJS 的事件循環
事件循環的順序
timers 階段:這個階段執行 timer(setTimeout、setInterval)的回調
I/O callbacks 階段:處理一些上一輪循環中的少數未執行的 I/O 回調
idle, prepare 階段:僅 node 內部使用
poll 階段:獲取新的 I/O 事件, 適當的條件下 node 將阻塞在這里
check 階段:執行 setImmediate() 的回調
close callbacks 階段:執行 socket 的 close 事件回調
process.nextTick
這個函數其實是獨立于 Event Loop 之外的,它有一個自己的隊列,當每個階段完成后,如果存在 nextTick 隊列,就會清空隊列中的所有回調函數,并且優先于其他 microtask 執行。
node 與瀏覽器端的不同
Node 端,microtask 在事件循環的各個階段之間執行
瀏覽器端,microtask 在事件循環的 macrotask 執行完之后執行


217
小程序的優化
① 減少請求次數
② setDate 不要太頻繁
③ wxss 能寫一行的不寫多行
④ 盡量使用緩存、刷新使用局部刷新
⑤ 開啟壓縮,降低代碼量
⑥ 資源控制,清除無用代碼、資源
⑦ 分包加載、分包預加載
⑧ 骨架屏


218
小程序的優缺點
優點
① 容易上手
② 兼容性問題相對來說少
③ 自帶統計
④ 支持插件開發、云開發
缺點
① 后端調試麻煩
② 模擬器和真機有時不一致,安卓和 iOS 有時不一致
③ native 組件存在遮擋問題
④ 能力上的限制:new Function,eval,Generator,沒有 cookie,沒有 DOM


219
vue 組件通信
① 父子通信:直接通過 props
② 子父通信:綁定事件,然后 $emit 傳值
③ Vuex 通信:通過 Store 通信。


220
TCP長連接和短連接的區別和應用場景是什么?
區別
① 長連接:在一個 TCP 連接上可以連續發送多個數據包,如果沒有數據包發送,需要雙方發送心跳包保活。
② 短連接:有數據交互時,就建立一個 TCP 連接,數據發送完成后,就斷開。
應用場景
① 長連接:頻繁讀寫,點對點,連接數少,如數據庫的連接使用長連接。
② 短連接:WEB 服務器,高并發使用短連接,否則的話連接太多。


221
小程序和普通網頁開發的區別
① 線程:網頁開發 JS 線程和渲染線程是互斥的,小程序是在不同的線程中的。
② DOM: 小程序的邏輯層和渲染層是分開的,沒有 DOM API,一些庫沒法使用。
③ 兼容:網頁開發需要兼顧各種瀏覽器、手機、電腦,小程序開發只需要考慮 Android 和 iOS
④ 開發流程:網頁開發只需要自己的服務器即可,小程序開發還需要賬號申請、審核、發布等流程。


222
小程序做不了,H5 能做的?
比方說想做一個在線運行 JS 的編輯器,小程序由于不能使用 eval,因此沒法直接使用,只能使用服務器中轉一下。


223
表單提交規則
分為以下幾個步驟:
① 識別所有的成功組件
② 為成功組件創建一個數據集合,包含 name 和 value 的鍵值對。
③ 按照編碼規則,對這些數據進行編碼。
④ 提交編碼后的數據。
成功組件如:
① 非 disabled
② 選中的 checkbox, radio, select, 選擇了文件的 file 上傳。


224
小程序的數據共享
① 利用頁面的 url 傳遞
② 利用 localStorage 傳遞
③ 通過一個全局變量,掛在 getApp() 上


225
DOCTYPE
① 作用:它是用來告知 Web 瀏覽器頁面使用了哪種 HTML 版本
② 版本:
1.0: (Strict, Transitional, Frameset)
4.01: (Strict, Transitional, Frameset)
5.0: 只有一種
③ 三種之間的區別:
Strict: 不允許過時標簽,不允許框架集。
Transitional: 允許過時標簽,不允許框架集
Frameset: 允許過時標簽,允許框架集


226
偽元素和偽類的區別,都有哪些?
區別:
① 本質:偽類本質上是為了彌補常規選擇器的不足,偽元素本質上是創建了一個有內容的虛擬容器。
② CSS3 中冒號的數量不同:偽類是一個,偽元素是兩個。
③ 數量:偽類可以有多個,偽元素同時只能使用一個。
偽類有:
① :hover
② :active
③ :firsr-child
④ :visited
偽元素有:
① :first-line
② :first-letter
③ :after
④ :before
單個冒號和兩個冒號的區別:
單個冒號是 CSS2 的寫法,兩個冒號是 CSS3 的寫法。


227
媒體查詢的原理
窗口的 onresize 事件,得到窗口大小,匹配對應的樣式修改。


228
localStorage 的最大存儲空間是多少
5Mb,超出會報錯:exceeded error


229
async/await 和 Promise 的區別
① async/await 函數前面多了一個 async 關鍵字
② async/await 更加簡潔
③ async/await 可以同時處理同步和異步錯誤
④ 調試的時候,如果多個 Promise 其中一個出現了錯誤,堆棧信息很亂很誤導人,而 async/await 直接給出行號。


230
Proxy 和 Reflect
Proxy 代理
① 作用:Proxy 就是操作對象的中間媒介,要操作對象的話,需要經過這個媒介同意。
② 例子:首先創建一個 obj,然后 new Proxy(obj, 代理行為),代理行為里面可以寫 get 和 set, 則在獲取、設置的時候,都會首先經過這樣的一層中間代理。
Reflect 反射
① 作用:Reflect 可以當做 object 的工具類來使用。
② 例子:
獲取屬性:Reflect.get(obj, ‘key’)
設置屬性:Reflect.set(obj, ‘key’, value)


231
小程序的運行環境
環境 邏輯層 視圖層
iOS JavaScriptCore WKWebView
Android V8 自研 XWeb 引擎,基于 Mobile Chrome 內核
開發者工具 NW.js Chromium Webview


232
上傳多個文件,其中可能會有失敗的,使用 Promise.all 的話,失敗的話就會直接 reject,怎么讓讓失敗的異步請求不影響其他成功的異步請求?
所有的 Promise 的 catch 中,直接返回一個 Promise.resolve()
const p1 = new Promise(resolve => {
const a =b;
resolve(a);
}).catch(()=>{
// 直接返回這個
return Promise.resolve(‘aaab’)
});
?
const p2 = new Promise(resolve => {
const a =1;
return resolve(a);
}).catch(()=>{
return Promise.resolve(‘aaa’)
});

Promise.all([p1,p2]).then((data)=>{
console.log(‘then 成功’,data);
}).catch((err)=>{
console.log(‘333’);
console.log(‘errr’,err);
})
實際上就是新出的 API :Promise.allSettled
其他還有實現:https://www.jianshu.com/p/c5c3c2595c98


233
redux-thunk
作用
實現異步,可以將 thunk 看做 dispatch 方法的封裝器,使用 redux-thunk 之前,只能 dispatch 一個 action 對象,使用之后可以 dispatch 一個函數,然后就可以在函數里面做一些邏輯處理工作。
使用
dispatch 里面填一個回調函數,參數還是 dispatch, 然后在這個函數內部進行一步請求,異步請求拿到結果后再 dispatch.
實現
function createThunkMiddleware(extraArgument) {
return ({ dispatch, getState }) => next => action => {
if (typeof action === ‘function’) {
return action(dispatch, getState, extraArgument);
}
?
return next(action);
};
}
?
const thunk = createThunkMiddleware();
thunk.withExtraArgument = createThunkMiddleware;
?
export default thunk;


234
函數式編程的 compose
作用
把一系列的函數,組裝生成一個新的函數,并且從后往前,后面函數的執行結果,作為前一個函數的參數。
實現
// 從右到左
function compose() {
var fns = [].slice.call(arguments)
return function (initialArg) {
var res = initialArg
for (var i = fns.length - 1; i > -1; i–) {
res = fnsi
}
return res
}
}
?
// 從左到右
function pipe() {
var fns = [].slice.call(arguments)
return function (initialAgr) {
var res = initialAgr
for (var i = 0; i < fns.length; i++) {
res = fnsi
}
return res
}
}
?
// 測試
var greet = function (name) { return ‘hi:’ + name }
var exclaim = function (statement) { return statement.toUpperCase() + ‘!’ }
var transform = function (str) { return str.replace(/[dD]/, ‘DDDDD’) }
var welcome1 = compose(greet, exclaim, transform)
var welcome2 = pipe(greet, exclaim, transform)
console.log(welcome1(‘dot’))//hi:DDDDDOT!
console.log(welcome2(‘dolb’))//HI:DDDDDOLB!


235
怎么配置單頁應用?怎么配置多頁應用?
單頁應用可以理解為webpack的標準模式,直接在entry中指定單頁應用的入口即可,這里不再贅述

多頁應用的話,可以使用webpack的 AutoWebPlugin來完成簡單自動化的構建,但是前提是項目的目錄結構必須遵守他預設的規范。 多頁應用中要注意的是:
每個頁面都有公共的代碼,可以將這些代碼抽離出來,避免重復的加載。比如,每個頁面都引用了同一套css樣式表
隨著業務的不斷擴展,頁面可能會不斷的追加,所以一定要讓入口的配置足夠靈活,避免每次添加新頁面還需要修改構建配置


236

npm打包時需要注意哪些?如何利用webpack來更好的構建?
① 要支持 CommonJS 模塊化規范
② 打包結果應該上傳 ES5的,SourceMap 也要一塊上傳。
③ 包的大小應該盡可能小
④ 不打包所依賴的模塊,讓用戶自己去選擇是否安裝依賴。
⑤ UI 資源也要打包。

基于以上需要注意的問題,我們可以對于webpack配置做以下擴展和優化:
CommonJS模塊化規范的解決方案: 設置output.libraryTarget='commonjs2’使輸出的代碼符合CommonJS2 模塊化規范,以供給其它模塊導入使用
輸出ES5代碼的解決方案:使用babel-loader把 ES6 代碼轉換成 ES5 的代碼。再通過開啟devtool: 'source-map’輸出SourceMap以發布調試。
Npm包大小盡量小的解決方案:Babel 在把 ES6 代碼轉換成 ES5 代碼時會注入一些輔助函數,最終導致每個輸出的文件中都包含這段輔助函數的代碼,造成了代碼的冗余。解決方法是修改.babelrc文件,為其加入transform-runtime插件
不能將依賴模塊打包到NPM模塊中的解決方案:使用externals配置項來告訴webpack哪些模塊不需要打包。
對于依賴的資源文件打包的解決方案:通過css-loader和extract-text-webpack-plugin來實現
https://blog.csdn.net/duyujian706709149/article/details/97299339


237
webpack 如何在 vue 項目中實現按需加載?antd 如何實現按需加載?
① 組件庫現成的解決方案
名稱是:Element 的 babel-plugin-component, AntD 的 babel-plugin-import
原理是:將 import 的路徑具體化,比方說 import { Button } from ‘antd’, 替換成 import { Button } from ‘antd/lib/button’
缺點是:每一個按需加載的 chunk 中都單獨打包相關的模塊,導致每一個 chunk 的體積都比較大。

② 使用 webpack 的 externals 配置
原理是:配置之后,webpack 打包時會繞過這些引用
缺點是:會外部單獨引入一個 antd.min.js, 大約 1Mb

③ 最佳方案:使用 webpack 的 CommonsChunkPlugin 插件
原理是:CommonsChunkPlugin 能提取第三方庫和公共模塊,避免首屏加載的 bundle 文件或者按需加載的 bundle 文件體積過大。


238
兩欄布局、兩列布局
① 浮動:兩個 div,第一個浮動,設置固定寬度即可。
② 絕對定位:父元素 relative,兩個子元素 absolute,然后設置第二個子元素的 left 為左邊的寬度。
③ flex 布局:父元素 flex, 左邊固定寬度,右邊 flex: 1;


239
為什么在有 HTTPS 的情況下,還要使用 RSA 呢
HTTPS 防止中間人攻擊,RSA 驗證身份,缺一不可。
比如一個 HTTPS 接口,誰都可以調用,但是自己的公鑰加密的數據,就可以知道這是我自己的程序在調用接口。


240
Taro 的優缺點
優點
① React 方式組件開發
② 多端開發
缺點:核心就是架構問題
① 和 React DSL 強綁定
② JSX 適配工作量大、社區貢獻復雜
③ 使用靜態編譯的方式去處理動態的 JS 語言,稍微有一點變化,就可能會不適用。
④ React 新特性需要手動對接
⑤ 前端生態無法復用
⑥ 錯誤棧復雜,而且沒有 SourceMap


241
靜態編譯和動態編譯的優缺點,性能測試
優點
① 性能上:同等條件下,編譯時做的工作越多,運行時做的工作越少,性能更好。
② 可讀性:重編譯時,就保證了編譯之后代碼也具有可行性。
缺點
① 性能:長久來看,硬件性能剩余會越來越多,犧牲一點性能換取更大的開發靈活性會更好。
② 適配:需要適配很多的 JSX
其他缺點:
① 和 React DSL 強綁定
② JSX 適配工作量大、社區貢獻復雜
③ 使用靜態編譯的方式去處理動態的 JS 語言,稍微有一點變化,就可能會不適用。
④ React 新特性需要手動對接
⑤ 前端生態無法復用
⑥ 錯誤棧復雜,而且沒有 SourceMap
性能測試
taro-benchmark


242
在端上運行的程序,它的瓶頸主要在什么地方?
① 內存
② 大小
③ CPU 線程


243
JS 執行和渲染拆開后,有什么好處?雙線程有什么好處?
① 性能:UI渲染和 JS 腳本在一個單線程中執行,這就容易導致一些邏輯任務搶占UI渲染的資源
② 安全性:阻止開發者使用一些瀏覽器提供的開發性接口,諸如跳轉頁面、操作 DOM、動態執行腳本。
③ 方便基礎庫 BUG 修改:渲染層和邏輯層是兩個線程管理,兩個線程各自注入了基礎庫。可以單獨修復其中一個基礎庫的 BUG。


244
taro 的一些新的變化?背后的原理是什么?Taro 最新的架構?
https://mp.weixin.qq.com/s?__biz=MzU3NDkzMTI3MA==&mid=2247483770&idx=1&sn=ba2cdea5256e1c4e7bb513aa4c837834
新的變化:
沒有 DSL 限制:無論是是 React 還是 Vue 技術棧,都能夠使用 Taro 開發
模版動態構建:和之前模版通過編譯生成的不同,Taro Next 的模版是固定的,然后基于組件的 template,動態 “遞歸” 渲染整棵 Taro DOM 樹。
新特性無縫支持:由于 Taro Next 本質上是將 React/Vue 運行在小程序上,因此,各種新特性也就無縫支持了。
社區貢獻更簡單:錯誤棧將和 React/Vue 一致,團隊只需要維護核心的 taro-runtime。
基于 Webpack:Taro Next 基于 Webpack 實現了多端的工程化,提供了插件功能。
背后的原理:
① 前端的本質:無論是用什么框架,React 還是 Vue,最終代碼都是調用了瀏覽器那幾個 BOM/DOM 的 API
② Taro 的實現:
如何動態渲染出 DOM 樹
創建一個 taro-runtime 包,實現了一套高效、精簡的 BOM/DOM API
通過 Webpack 的 ProvidePlugin 插件,注入到小程序的邏輯層
React 精簡:React-DOM 含有大量瀏覽器兼容的代碼,去除了這部分的代碼。
React 三部分核心:核心 react-core, 與虛擬 DOM 有關的 react-reconciler, 與渲染有關的 Renderer,Taro 實現了 taro-react 包,替換掉 Renderer 用來連接 react-reconciler 和 taro-runtime.
具體這樣做:在 hostConfig 配置中調用Taro的 api,實現一個創建 DOM 樹的 render。
DOM 樹如何更新到頁面
基于組件模板,動態地遞歸渲染整棵樹。


245
remax 的短板,優缺點?
優點
基于真正 React 開發,無縫使用 Redux/Mobx 等狀態管理庫。
完全支持 TypeScript,為組件和 API 提供完整的類型支持。
跨平臺,使用一套代碼同時開發小程序和 H5 應用。
缺點
① 小程序編譯后,模板組件引入過多。有個 base.axml。但是支付寶不支持在 template 里引用小程序自定義組件。所以現在所有頁面里都包含了所有的 template,可以優化下如果頁面沒用到小程序自定義組件,那就引用 base.axml

② 原生混合開發會編譯兩次:原生寫法和 Remax 寫法同時依賴的模塊會被打包兩次。解決方案:把所有小程序頁面和自定義組件的 js 全部作為 entry 放入 webpack 的編譯流程,這樣公共模塊就能抽到 common chunk 里。

③ 性能問題:動態模板渲染的方式,將這部分工作放在了用戶手機上,對算力的要求更高。

https://remaxjs.org/guide/advanced/hybrid


246
云開發與普通開發的優點、缺點
優點:
① 規模經濟:利用云計算供應商提供的基礎設施,同在單一的企業內開發相比,開發者能夠提供更好,更便宜和更可靠的應用
② 配套齊全:直接提供了數據庫、存儲、云函數、用戶鑒別能力
缺點:
① 安全性:數據不在自己手上,可能會丟失數據。
② 數據備份機制:雖然有數據備份接口,但是可能會超出云函數20秒的時間限制,總之還是不靈活。


247
React context,如果有多個 context 怎么使用?
① 使用 React.createContext() 創建兩個 contextA, contextB
② 兩個 Provider 嵌套,兩個 Consumer 嵌套,即 contextA.Provider 點出來之后嵌套。
③ 順序不重要,要注意語法。


248
函數式組件比類組件有什么優勢?
① 代碼包大小:編譯后代碼更少
② 性能:沒有生命周期,不需要實例化,性能更好


249
React 組件如何防止無效渲染?
什么時候會渲染?
① state 發生變化
② props 發生變化
阻止無效渲染的方式:
① shouleComponentUpdate
② 使用 useMemo, useCallback 反之
③ 使用生產版本的 React,開發版本有時候會渲染兩次。


250
React 性能如何分析?
① 直接肉眼觀察某個組件是否閃爍,如果閃爍,說明重復渲染。
② 代碼中 log,看是否重復 log
③ 使用最新的 React DevTool 中的 Profiler 進行定量分析,可以查看每個組件渲染時間的火焰圖。


251
服務端渲染的過程?為什么前端還需要再渲染一次?
怎么做的
核心 api 是 renderToString
① 啟動一個 node 服務 ② 把 react 根組件用 reanderToString 渲染成字符串返回給前端 ③ 前端再渲染一次:恢復生命周期、給組件綁定事件以響應用戶操作
好處是什么
① SEO 收錄更好
② 減少白屏
③ 支持更多后端代碼模板的支持


252
TS 里面的抽象類,抽象類能有抽象屬性嗎?
抽象類
使用abstract關鍵字定義抽象類和抽象方法
抽象類不允許被實例化
抽象類中的抽象方法必須被實現
抽象類中可以有抽象屬性,如下面的寫法,是沒有報錯的


253
type 和 interface 的區別?
相同點
① 都可以描述一個屬性或函數
② 都允許拓展:interface 使用 extends, type 使用 &
不同點
① type 可以聲明基本類型、聯合類型、元祖類型,interface 不行。
基本類型: string
聯合類型:TypeA | TypeB
元祖類型:具體定位到每個位置的類型:[TypeA, TypeB]
② type 可以通過 typeof 獲取到實例的類型
③ interface 聲明能夠直接合并,同時寫多個同名的 interface
④ interface 可以被實現,type 不行
https://www.jianshu.com/p/8dff10ce3912


254
Taro 的架構
https://mp.weixin.qq.com/s?__biz=MzU3NDkzMTI3MA==&mid=2247483770&idx=1&sn=ba2cdea5256e1c4e7bb513aa4c837834
① 分為兩部分:編譯時 和 運行時
編譯時主要是將 Taro 代碼通過 Babel[11] 轉換成 小程序的代碼,如:JS、WXML、WXSS、JSON
運行時:生命周期、事件、data 等部分的處理和對接
② 編譯時具體的過程:使用 babel-parser[12] 將 Taro 代碼解析成抽象語法樹,然后通過 babel-types[13] 對抽象語法樹進行一系列修改、轉換操作,最后再通過 babel-generate[14] 生成對應的目標代碼。
③ 運行時:編譯后的代碼中,React 的核心 render 方法 沒有了。同時代碼里增加了 BaseComponent 和 createComponent ,它們是 Taro 運行時的核心。Taro 當前架構只是在開發時遵循了 React 的語法,在代碼編譯之后實際運行時,和 React 并沒有關系。
④ 總結:
整個 Taro 當前架構的特點是:
重編譯時,輕運行時:這從兩邊代碼行數的對比就可見一斑。
編譯后代碼與 React 無關:Taro 只是在開發時遵循了 React 的語法。
直接使用 Babel 進行編譯:這也導致當前 Taro 在工程化和插件方面的羸弱。
其他的 mpvue 架構的特點:
半編譯時,半運行時
WXML 模板通過編譯生成
將 Vue 運行在小程序上,實現 Vue@2.4.1 絕大部分特性
基于 wevpack


255
性能優化、audits、LightHouse、刑恩性能測試工具
性能測試工具
以前叫 audits, 現在叫 LightHouse.
有以下幾個方面:
① Performance性能
First Contentful Paint(FCP):第一次有內容繪制。
Time to Interactive (TTI):可交互時間
Speed Index (SI):頁面內容填充速度。 how quickly the contents of a page are visibly populated.
Total Blocking Time (TBT): 總阻塞時間
Largest Contentful Paint (LCP): 大內容繪制
Cumulative Layout Shift (CLS): 衡量可視窗口內元素的移動
給出建議:移除無用代碼、DNS 預解析、壓縮代碼、
② Accessibility 可訪問性
對比度
代碼可讀性
③ Best Practiveces 最佳實踐
HTTPS
跨域安全
JS 安全
④ SEO 檢查
各種標簽是否語義化等
⑤ PWA
速度是否夠快


256
CDN 原理
https://zhuanlan.zhihu.com/p/147571853?from_voters_page=true
簡要來說:
① 本地 DNS 解析,通過 CNAME 轉到 CDN 專用的 DNS 服務器
② DNS 服務器返回全局負載均衡的服務器 IP
③ 請求全局負載均衡 IP,返回局部負載均衡 IP
④ 請求局部負載均衡 IP,返回緩存服務器 IP
⑤ 請求緩存服務器 IP
具體來說:
資源上傳cdn之后,當用戶訪問cdn的資源地址之后會經歷下面的步驟:
首先經過本地的dns解析,請求cname指向的那臺cdn專用的dns服務器。
dns服務器返回全局負載均衡的服務器ip給用戶
用戶請求全局負載均衡服務器,服務器根據ip返回所在區域的負載均衡服務器ip給用戶
用戶請求區域負載均衡服務器,負載均衡服務器根據用戶ip選擇距離近的,并且存在用戶所需內容的,負載比較合適的一臺緩存服務器ip給用戶。當沒有對應內容的時候,會去上一級緩存服務器去找,直到找到資源所在的源站服務器,并且緩存在緩存服務器中。用戶下一次在請求該資源,就可以就近拿緩存了。


257
前端工程化
四化:模塊化、組件化、規范化、自動化
① 模塊化:將一個大文件拆分成相互依賴的小文件,再進行統一的拼裝和加載。只有這樣,才有多人協作的可能。

  • JS 模塊化:CommonJS --> AMD --> CMD,語言層面上使用 ES6,

    • 用Webpack+Babel將所有模塊打包成一個文件同步加載,也可以打成多個chunk異步加載;

    • 用SystemJS+Babel主要是分模塊異步加載;

    • 用瀏覽器的

② 組件化:模塊化只是在文件層面上,對代碼或資源的拆分;而組件化是在設計層面上,對UI(用戶界面)的拆分。

③ 規范化:目錄結構的制定、編碼規范、前后端接口規范、文檔規范、組件管理、Git分支管理、Commit描述規范、定期CodeReview、視覺圖標規范

④ 自動化:前端工程化的很多臟活累活都應該交給自動化工具來完成。自動化構建、自動化部署、自動化測試。


258
在海量字符串中統計處出現頻率最高的單詞,有什么思路
1.使用newFixedThreadPool構建大小為5的線程池。讓線程分別讀取不同的文件。
2.使用ConcurrentHashMap對象hashmap作為共享變量,用于存放每個單詞出現的頻率。
3.采用最小堆在hashmap中找到頻率最高的100個數據單詞,并打印。


259
前端的發展路線
https://segmentfault.com/a/1190000020281750


260
webpack怎么做PWA
offline-plugin: https://segmentfault.com/a/1190000010669126
https://segmentfault.com/a/1190000011072073


261
webpack里面的拆包
https://segmentfault.com/a/1190000007649417
① JS 拆分:requre.ensure() 按需拆分
② CSS 拆分:使用 CSS MODULE 加載 CSS, 使用STYLE LOADER 將 CSS 插入到 STYLE 標簽中,然后使用 extract-text-webpack-plugin 拆分 CSS 為單個文件。
③ 第三方庫拆分:CommonsChunkPlugin


262
React 如何復用邏輯?
https://blog.csdn.net/neoveee/article/details/87619175
① 高階組件:參數為一個組件,返回一個新的組件。
② HOOKS:狀態邏輯本身就是獨立于組件的,可以實現邏輯復用。


263
高并發場景下前端的優化方案
① 減少請求
② 負載均衡
③ 高并發請求分時發送
④ 主動過濾部分的用戶的請求
⑤ 業務邏輯上只允許請求一次


264
socket.io是用了什么協議
① 支持多種協議,為了在每一種瀏覽器上支持實時通訊,Socket.IO 在運行中選擇最佳的傳輸方式,而不影響API。② 支持的方式為:WebSocket, Adobe Flash Socket, AJAX long polling, AJAX multipart streaming, Forever Iframe, JSONP Polling。


265
307 狀態碼
① http 307 Temporary Redirect 是臨時重定向
② http 307和302的區別在于:307要求客戶端不改變原先的請求方法,對在Location頭部中規定的URI進行訪問。對于302,很多客戶端的實現是,直接使用GET方式訪問重定向地址。


266
未來學習規劃
① 深入學習 node, 用 node 做幾個小項目
② 深入前端工程化
③ debugger 方面的知識也要學習,還是很有用的。


267
做項目的目的
① 滿足興趣
② 迎合需求
③ 傭金:外包、廣告平臺、商業變現


268
服務器最大tcp連接數
① 四元組 {原IP,原端口,目的IP,目的端口}。只有前兩個可變。由客戶端的ip+port來決定連接數的,對于ipv4地址2^32 ,port是2^16 ,所以理論的連接數最多是2^48
② 實際情況中這個和設備的內存,一條tcp連接占用的內存有關
③ 65535并不是單機服務器處理的連接數上限。單機情況下,可以通過設置虛擬ip來突破單機65535這個上限。
④ 實際上不經過配置的話,端口數最多只能到 28232,這是由于 linux 源碼里面限制的,設置了 sysctl_local_port_range,差值就是這個數。可以通過 sysctl 設置。https://blog.csdn.net/zhuizhuziwo/article/details/6926904


269
io設計模式 同步異步io poll/epoll io
IO 設計模式
① 阻塞IO:讀寫數據過程中會發生阻塞現象
② 非阻塞IO:發起 read,得到結果,結果為 error 就再次 read。結果不是 error 就返回。
③ 多路復用IO:一個線程不斷輪詢多個 io 的狀態
④ 信號驅動IO:發起 io,注冊函數,可以返回,內核準備好后,發送信號給用戶進程,然后用戶進程開始讀寫。
⑤ 異步 IO: 發起 io,直接返回,內核拷貝好數據后,通知用戶進程。
前 4 個都是同步 IO,最后一個是異步 IO.

異步 I/O 與信號驅動 I/O 的區別
異步 I/O 的信號是數據拷貝完成后通知應用進程 I/O 完成,而信號驅動 I/O 的信號是通知應用進程可以開始數據拷貝 I/O。

select/poll/epoll io
① select: 將文件描述符收集過來,交給內核,讓內核去判斷那個有數據。當里面任何一個或者多個有數據的時候,內核會返回,并且有數據的那個文件描述符fd會被標記置位。返回之后,遍歷集合,判斷那個fd有數據了,然后讀取數據并處理。
② poll: poll傳入一個 pollfd 結構體,也是阻塞的。當有數據時,會置位revents字段,后續讀取數據時,會重新置為0。可以重用。
struct pollfd{ int fd; // 文件描述符 short events; // 事件類型 讀 POLLIN、 寫 POLLOUT、讀和寫 short revents; // 默認值為0,當有數據時,該參數會被置位。 }
③ epoll: 有兩個重要函數 epoll_ctl 和 epoll_wait,首先創建一個 eventpoll對象,開辟內存。epoll_wait 中,傳入 eventpoll對象的id,進行監聽。eopll_wait也是處于阻塞狀態。返回一個 int類型, 0 表示沒有就緒,大于0表示有幾個就緒,-1表示異常。epoll_wait,傳入超時時間為0,就是非阻塞的,需要每次調用去檢查就緒的socket信息。event_poll 對象存放的socket集合,采用紅黑樹結構,因為經常的增刪查,時間復雜度 O(Log(n))


270
偏函數有哪些應用,說一下怎么實現
python 里面的函數:https://www.runoob.com/w3cnote/python-partial.html
就是函數生成函數,傳遞一些參數,作為函數的默認參數,返回已經具有默認參數的一個函數。
js 里面實現,指的就是柯里化,curry。
本質上是函數式編程 + 閉包,返回一個函數。
https://www.cnblogs.com/bonelee/p/6102535.html


271
用過echarts和d3,他們的原理
① echarts:canvas 或者 svg。https://echarts.apache.org/zh/tutorial.html#%E4%BD%BF%E7%94%A8%20Canvas%20%E6%88%96%E8%80%85%20SVG%20%E6%B8%B2%E6%9F%93
② d3:力引導算法:https://blog.csdn.net/wry2008wry/article/details/80812562


272
canvas和svg區別
① SVG 是多個節點,canvas 是單個節點。
② SVG 是矢量圖,不依賴分辨率。canvas 是位圖,依賴分辨率。
③ SVG 不適合游戲,canvas 適合游戲,因為前者過度使用了 DOM.


273
node 進程通信、多進程復用
專門的dataBus進程、Pandora.js對象、主子進程通信、借助Redis
Node.js 進程通信
Node進程間通信有4種方式:
通過stdin/stdout傳遞json:最直接的方式,適用于能夠拿到“子”進程handle的場景,適用于關聯進程之間通信,無法跨機器
Node原生IPC支持:最native(地道?)的方式,比上一種“正規”一些,具有同樣的局限性
通過sockets:最通用的方式,有良好的跨環境能力,但存在網絡的性能損耗
借助message queue:最強大的方式,既然要通信,場景還復雜,不妨擴展出一層消息中間件,漂亮地解決各種通信問題
https://www.cnblogs.com/rubyxie/articles/8949417.html


274
Node直出的優缺點?服務器渲染的優缺點?
優點:
① 前端耗時少,占用資源少
② 有利于 SEO
③ 后端靜態文件緩存,減少查詢數據庫的時間。
缺點:
① 不利于前后端分離
② 占用服務器資源


275
瀏覽器發起請求的方法?XHR、fetch的區別
方法
① img 標簽、new Image()
② 表單提交
③ websocket
④ AJAX: XHR, fetch
區別
https://www.cnblogs.com/mengff/p/12836039.html
① fetch是有兼容問題的:IE系列是完全不支持的,主流瀏覽器的早起版本也不支持,所以如果在項目中使用需要做兼容方案處理。
② fetch 不管請求處理成功還是失敗,都會觸發promise的resolve狀態回掉。fetch只有當網絡故障導致請求發送失敗或者跨域的時候才會觸發reject的邏輯。我們可以通過response 對象的ok是否是true來判斷是否是真正的成功。
③ fetch配置請求是否攜帶cookie和接受服務端寫入cookie是通過設置credentials


276
實現一個可以設置超時時間的fetch
使用setTimeout和Promise.reject實現的超時控制不能阻止請求過程繼續在后臺運行,造成了流量的浪費
Promise.race, setTimeout 配合使用。
https://www.cnblogs.com/yfrs/p/fetch.html


277
React中key的作用,具體的運作方式
每個key 對應一個組件,相同的key react認為是同一個組件,這樣后續相同的key對應組件都不會被創建
https://www.cnblogs.com/nanianqiming/p/11361364.html


278
雙向綁定的缺點
① 內存上:會涉及到引用計數的回收問題
② 體驗上:無法跟蹤局部狀態的變化,潛在的行為會導致 debug 難度的增加。


279
怎么設計一個餅圖
① CSS:https://www.cnblogs.com/liangjing-yy/p/9008998.html
② CANVAS: arc 繪制
③ SVG:https://blog.csdn.net/melovemingming/article/details/83057358


280
redis和MySQL區別
① 類型:MySQL 是關系型數據庫,redis 是非關系型數據庫。
② 存儲:MySQL 持久化在硬盤上,redis 做緩存。
③ 速度:MySQL 速度慢,redis 速度快。
④ 使用:MySQL 支持 SQL 語言,redis 是鍵值對。


281
Angular / React 的區別
① 編寫方式:angular 是 JS + HTML 模板,react 是純 jsx
② 類型:angular 是一個 MVC 框架,react 是 js 庫
③ 數據綁定:angular 是雙向數據綁定,react 是單向數據流。
④ 依賴:angular 自動管理依賴項,react 用其他工具管理。
⑤ 指令:augular 中有豐富的指令,react 中沒有指令。
⑥ DOM 操作:angular 直接操作真實 dom,react 是虛擬 dom。


282
分片上傳的實現
借助js的Blob對象FormData對象可以實現大文件分片上傳的功能
https://www.cnblogs.com/sghy/p/9143955.html


283
React的特性
① 虛擬 DOM 速度快
② 跨瀏覽器兼容
③ 組件化開發
④ 單向數據流
⑤ 純 JS 語法


284
React render setState
render 原理:
https://www.jianshu.com/p/cf4c044e4edd
① ReactDOM.render 將組件轉換成真實的 DOM 元素
② 轉變為調用 React.createElement(App)
③ createElement 將傳入的參數組裝 props,返回 ReactElement
④ ReactElement 返回最終創建的react對象
⑤ 通過 legacyRenderSubtreeIntoContainer 獲取 root,然后通過 createContainer 創建一個 fiber tree
⑥ 調用root.render(children, callback)方法把生成的fiber tree轉換成真實dom
setState 的原理
① setState在react生命周期和合成事件會批量覆蓋執行
② setstate在原生事件,setTimeout,setInterval,promise等異步操作中,state會同步更新
③ setState批量更新的過程:
在react生命周期和合成事件執行前后都有相應的鉤子,分別是pre鉤子和post鉤子,pre鉤子會調用batchedUpdate方法將isBatchingUpdates變量置為true,開啟批量更新,而post鉤子會將isBatchingUpdates置為false
https://www.jianshu.com/p/89a04c132270


285
Ant Design 設計理念,優缺點
概述
Ant Design 介于Material Design 和 Bootstrap之間:給出框架的同時,也給出了設計規范。
設計理念
Ant Design 介于Material Design 和 Bootstrap之間:給出框架的同時,也給出了設計規范。 與眾不同的是,Ant Design 不但追求『用戶』的使用體驗,還追求『設計者』和『開發者』的使用體驗,踐行『以人為本』的設計理念。微小,確定,幸福『不同』不一定『更好』,但是『更好』一定『不同』。不斷追求細節上的『更好』,使得我們的組件和同類產品都不一樣,自然而然的更好。
優點
① 明確了”后臺框架“的說法
② 給出框架的同時,也給出了設計規范
缺點
① 框架和設計不能分離,限制了靈活性。


286
localStorage沖突解決
為每一個 localStorage 的 key 使用唯一的前綴區分。


287
servlet生命周期
https://www.runoob.com/servlet/servlet-life-cycle.html
Servlet 通過調用 init () 方法進行初始化。
Servlet 調用 service() 方法來處理客戶端的請求。
Servlet 通過調用 destroy() 方法終止(結束)。
最后,Servlet 是由 JVM 的垃圾回收器進行垃圾回收的。


288
性能優化的量化評價
① 工具:Lighthouse
② 標準:
FP: 首次繪制
FCP: 首次有內容繪制
FMP: 首次有意義繪制
TTI: 可交互時間


289
FP, FCP, FMP, TTI
https://github.com/LuckyWinty/fe-weekly-questions/issues/56
https://juejin.im/post/6844904029936418824
FP
含義
FP(全稱“First Paint”,翻譯為“首次繪制”) 是時間線上的第一個“時間點”,它代表瀏覽器第一次向屏幕傳輸像素的時間,也就是頁面在屏幕上首次發生視覺變化的時間。
注意:FP不包含默認背景繪制,但包含非默認的背景繪制。
統計邏輯
通過performance.getEntriesByType('paint’),取第一個 paint 的時間
FCP
含義
FCP(全稱“First Contentful Paint”,翻譯為“首次內容繪制”),顧名思義,它代表瀏覽器第一次向屏幕繪制 “內容”。
注意:只有首次繪制文本、圖片(包含背景圖)、非白色的canvas或SVG時才被算作FCP。
統計邏輯
通過performance.getEntriesByType('paint’),取第二個pain的時間,或者通過Mutation Observer觀察到首次節點變動的時間
注意
FP與FCP這兩個指標之間的主要區別是:FP是當瀏覽器開始繪制內容到屏幕上的時候,只要在視覺上開始發生變化,無論是什么內容觸發的視覺變化,在這一刻,這個時間點,叫做FP。
相比之下,FCP指的是瀏覽器首次繪制來自DOM的內容。例如:文本,圖片,SVG,canvas元素等,這個時間點叫FCP。
FP和FCP可能是相同的時間,也可能是先FP后FCP。
FMP
含義
FirstMeaningfulPaint是頁面主要內容出現在屏幕上的時間, 這將是用戶感知加載體驗的主要指標。目前尚無標準化的定義, 因為很難以通用的方式去確定各種類型頁面的關鍵內容。實踐中,可以將頁面評分最高的可見內容出現在屏幕上的時間作為FirstMeaningfulPaint。
統計邏輯
Mutation Observer將會觀察頁面加載的前30S內頁面節點的變化, 將新增/移除的節點加入/移除Intersection Observer, 這樣可以得到頁面元素的可見時間點及元素與可視區域的交叉信息。
根據元素的類型進行權重取值, 然后取元素與可視區域的交叉區域面積、可見度、 權重值之間的乘積為元素評分。
根據上面得到的信息, 以時間點為X軸, 該時間點可見元素的評分總和為Y軸, 取最高點對應的最小時間為頁面主要內容出現在屏幕上的時間。
取Mutation Observer 與 Intersection Observer的瀏覽器兼容性交集, 則此估算方法支持Chrome 51以上版本、Firefox 55以上版本及Edge 15以上版本。
注意
目前沒有統一邏輯,阿里有個標準為最高可見增量元素,采用深度優先遍歷方法,詳細可見:https://zhuanlan.zhihu.com/p/44933789


290
prerender預渲染是什么原理呀
① prerender.io:使用 PhantomJS 無頭瀏覽器。
② prerender-spa-plugin,使用 Chrome 的無頭瀏覽器,具體是使用了 Puppeteer 無頭操作庫。


291
Vue如何解析template模板,diff算法兩者的不同是什么
React diff 和 Vue diff 的區別
https://segmentfault.com/a/1190000015432258
Vue如何解析template模板
① 模板編譯成 AST 語法樹
② 語法樹轉換成 render 函數
③ render 函數返回一個 VNode 虛擬節點
diff 算法兩者的不同:
① 判斷節點類型:元素類型相同,className 不同,Vue 判斷為不同元素刪除重建,React 判斷為相同元素,只是修改屬性。
② 列表對比:Vue 是兩端到中間,React 是從左到右。Vue 更加高效。


292
前端的動畫種類
六種:
javascript直接實現;
SVG(可伸縮矢量圖形);
CSS3 transition;
CSS3 animation;
Canvas動畫;
requestAnimationFrame;
https://www.cnblogs.com/zhaowy/p/8817944.html


293
Dart 語言
Dart 面試知識點:
http://www.cainiaoxueyuan.com/xcx/12417.html
Dart 教程:
https://www.dartcn.com/guides/language/language-tour


294
prerender-spa-plugin插件你用過?具體說一說吧
使用 Chrome 的無頭瀏覽器,具體是使用了 Puppeteer 無頭操作庫。
https://segmentfault.com/a/1190000018182165


295
從項目流程上說性能優化
① 設計優化:版本迭代、風格追隨前沿
② 編碼優化:代碼規范、自動生成文檔、接口自動化測試
③ 打包部署優化:自動打包 shell 腳本、自動部署 shell 腳本、webpack 優化措施
④ 上線體驗優化:Lighthouse 性能檢測、用戶行為埋點統計


296
use strict 嚴格模式
① 嚴格模式是在 ES5 中新增的字面量,表示代碼在嚴格模式下運行。
② 嚴格模式的限制:不允許使用未聲明的變量。
③ 嚴格模式的好處:消除不安全代碼、提高編譯器效率、為未來新版本的 JS 做好鋪墊。


297
長列表解決方案
① 滾動分頁加載。
② 在 requestAnimationFrame 回調中使用 createDocumentFragment 減少重排。
③ 滑動窗口做的虛擬滾動、無限滾動:Interp Observer + padding
利用 Interp Observer 來監測相關元素的滾動位置,異步監聽,盡可能得減少 DOM 操作,觸發回調,然后去獲取新的數據來更新頁面元素,并且用調整容器 padding 來替代了本該越來越多的 DOM 元素,最終實現列表滾動、無限下拉。


298
proxy和defineProperty區別
① 2.0 通過 Object.defineProperty 數據劫持實現,弊端是需要克隆一份對象,需要給每一個屬性都設置監聽
② 3.0 通過 ES6 的 Proxy 委托代理實現,不需要克隆,而且只需要對整個對象進行代理。


299
從原理上談ajax
核心是 XMLHttpRequest
① 瀏覽器發起 xhr 請求
② 瀏覽器去做其他事情
③ xhr 請求數據
④ 服務器給 xhr 返回數據
⑤ xhr 通知瀏覽器數據回來了
⑥ 瀏覽器渲染 xhr 的數據


300
Iterator的語法,它的作用是什么
ES6 中:
var arr = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’];
var eArr = arrSymbol.iterator;
console.log(eArr.next().value); // a
console.log(eArr.next().value); // b
console.log(eArr.next().value); // c
console.log(eArr.next().value); // d
console.log(eArr.next().value); // e
迭代一個對象
作用:


301
Generator函數有哪些接口?Generator函數是異步的,Generator 跟 Promise有什么區別?
接口
① 新版:
next(): 返回 yield 生成的值
return():返回給定的值并結束生成器
throw(): 拋出一個錯誤
② 舊版:
next(): 新版的 next()
close(): 新版的 return
send(): 將值發送給生成器,用 yield 返回,對應于新版的 next(x)
throw(): 拋出錯誤,新版的 throw()
Generator 與 Promise 的區別
① 錯誤處理:Generator 可以 try/catch, Promise 只能 .catch(),如果不設置回調函數,Promise 錯誤無法反應到外部。
② 語法上:Generator 前面有一個 *,Promise 沒有
③ 邏輯上:Generator 是同步代碼異步化,更加靈活地控制代碼的行為,Promise 則是專門為異步設計的,解決異步回調地獄。


302
babel-loader離開webpack能單獨使用嗎
可以,比方說直接執行:
babel --plugins transform-react-jsx-source script.js
這是 babel 文檔上說的,可以直接 via CLI:
https://babeljs.io/docs/en/babel-plugin-transform-react-jsx-source/


303
electron 底層的通信機制
主線程到渲染線程:BrowerWindow.webContents.send()發送消息。
渲染線程到主線程:,借助ipcRender和ipcMain發送/接收消息。


304
fetch和axios的區別
axios 的特點
① 底層是 XHR, 支持 Promise
② 支持防止 CSRF, 提供并發接口
③ 支持請求和相應的攔截、轉換與取消
fetch 的缺點
① 報錯:只對網絡請求報錯,400、500都是成功
② cookie:默認不會攜帶 cookie,需要配置 credentials: ‘include’
③ 不支持取消,不支持超時控制。
④ 沒有辦法檢測請求的進度,而 XHR 可以。


305
前端的新技術關注過嗎?(Serverless、WebAssembly、GraphQL)
① Serverless:無服務器架構、云開發,讓全棧工程師真的能變成全棧工程師,而不是”全干工程師“,將底層環境、容器、網絡配置工作交給更加專業的人來做,開發者只需要聚焦于開發即可。
② WebAssembly:WebAssembly 是一種可以使用非 JavaScript 編程語言編寫代碼并且能在瀏覽器上運行的技術方案。文件更小、不需要解析成 AST、不需要重新優化、手動垃圾回收。
③ GraphQL:是一個用于 API 的查詢語言,最大的優點是前端對數據可控,想要什么數據就發送什么請求。


306
Object.defineProperty和vue3.0的proxy的區別,雙向數據綁定的區別
① 2.0 通過 Object.defineProperty 數據劫持實現,弊端是需要克隆一份對象,需要給每一個屬性都設置監聽
② 3.0 通過 ES6 的 Proxy 委托代理實現,不需要克隆,而且只需要對整個對象進行代理。


總結

以上是生活随笔為你收集整理的前端面经 300条,背完这些就够了!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

色在线视频网 | 久久国语| 久久综合狠狠综合 | 欧美激情综合色综合啪啪五月 | 国产精品第72页 | 久久久久高清 | 欧美性生活久久 | 一区二区三区精品久久久 | 午夜视频播放 | 国产伦理久久精品久久久久_ | aaa亚洲精品一二三区 | 91视频一8mav | 欧美日韩免费观看一区二区三区 | 欧美精品久久天天躁 | 亚洲黄色一级大片 | 天天操天天爽天天干 | 日韩免费在线观看视频 | 久久久精品免费观看 | 中文字幕网站 | 亚洲经典视频 | 欧美性爽爽 | 999色视频 | 曰韩在线 | 成人黄色小视频 | 精品免费在线视频 | 成人欧美亚洲 | 天天爽人人爽夜夜爽 | 99久久日韩精品免费热麻豆美女 | 国产精品久久久久久999 | 午夜在线观看 | 亚洲va在线va天堂 | 亚洲影视九九影院在线观看 | 国产成人中文字幕 | 看国产黄色大片 | 成人欧美日韩国产 | 日韩欧美综合在线视频 | 韩日精品中文字幕 | 爱情影院aqdy鲁丝片二区 | 久久免费视频在线观看6 | 日韩欧美在线免费观看 | 人人爱天天操 | 久久性生活片 | 最近中文字幕免费 | 免费看黄20分钟 | 午夜精品福利一区二区 | 中文字幕精品一区二区三区电影 | 久久久久综合精品福利啪啪 | 成人午夜剧场在线观看 | 日韩在线 一区二区 | 午夜精品久久久久久99热明星 | 日韩中文在线观看 | av中文天堂 | 91亚洲精品久久久蜜桃借种 | 福利在线看片 | 久久久久久久久久福利 | 国产美女免费看 | 狠狠婷婷 | 久久精品视 | 亚洲精品免费在线观看 | 成人性生交大片免费看中文网站 | 国产不卡在线播放 | 日韩成人免费在线电影 | 亚洲欧美日韩一区二区三区在线观看 | 四虎影视成人精品 | 九九九视频在线 | 久久 国产一区 | 亚洲精选视频在线 | 欧美国产高清 | 欧美做受xxx | 四虎影视8848aamm | 最近中文字幕视频网 | av大全在线播放 | 国产1级毛片 | 欧美国产精品一区二区 | 亚洲精品一区二区三区在线观看 | 日韩成人在线免费观看 | 999成人免费视频 | 日韩特级毛片 | 精品国产伦一区二区三区免费 | 欧美日韩二区三区 | 成人精品一区二区三区电影免费 | 99精品热 | 日韩午夜在线观看 | 天堂在线v | 国产不卡一区二区视频 | 天天天插 | 欧美日韩高清免费 | 综合色在线观看 | 国产午夜精品在线 | 麻豆视频免费入口 | 中文字幕在线播放av | 天堂在线一区二区三区 | 最新国产一区二区三区 | 欧美日韩三级在线观看 | 日韩有色 | 青草视频网 | 日韩午夜三级 | 天天爽天天摸 | 国产专区视频在线 | 国产精品一区二区三区久久久 | 国产黄色av网站 | 蜜桃av久久久亚洲精品 | 中文在线免费视频 | 人人cao| 国产免费亚洲高清 | 久久久久免费精品 | 97国产精品 | 麻豆免费视频网站 | 五月天久久 | 激情综合网色播五月 | 在线国产精品视频 | 欧美高清视频不卡网 | 国产精品涩涩屋www在线观看 | 激情视频一区二区三区 | 日韩在线观看影院 | 国产精品精品国产色婷婷 | 波多野结衣在线观看视频 | a视频在线播放 | 91在线小视频 | 99精品在线免费观看 | 黄色软件在线观看 | 日韩精品免费一线在线观看 | 操一草| 婷婷九月激情 | 国产原厂视频在线观看 | 日韩在线首页 | 青青草国产成人99久久 | 国产美女精品视频免费观看 | 久久这里只有精品1 | 日本不卡视频 | 毛片精品免费在线观看 | 少妇性bbb搡bbb爽爽爽欧美 | 国产伦理久久 | 中文字幕有码在线观看 | 国产中文字幕在线播放 | 中文字幕 在线看 | 天天干夜夜爽 | 久久99热久久99精品 | 免费精品视频在线 | 夜夜婷婷| 天天曰天天干 | 五月婷婷影院 | 黄色毛片视频免费 | 久久久久久久久久久久久9999 | 久久伦理网 | 日韩av看片 | 97视频在线观看播放 | 丁香六月在线 | 国产精品嫩草69影院 | 久久精品中文字幕少妇 | 97视频在线免费播放 | 五月天婷婷丁香花 | 99热国产在线中文 | 婷婷免费视频 | 亚洲精品影视在线观看 | 中文字幕在线观看完整版电影 | 毛片.com| 日韩综合一区二区三区 | 在线日本看片免费人成视久网 | 欧美成人中文字幕 | 欧美成人在线网站 | 中文字幕一二三区 | 黄色毛片电影 | 久久久久久久99 | 国产在线免费 | 91精品免费在线观看 | 日本精品一区二区在线观看 | 就要色综合 | 韩日电影在线观看 | 日韩精品在线看 | 免费a v观看 | 国产精品乱码久久久久 | 又黄又爽的视频在线观看网站 | 日本久久免费电影 | 91精品视频播放 | 日韩特级毛片 | 五月婷婷,六月丁香 | 国产91成人在在线播放 | 午夜性生活 | 日韩精品一区二区三区高清免费 | 国产精品美女999 | 免费成人av| 中文字幕在线看视频 | 婷婷丁香久久五月婷婷 | 精品一区三区 | 国产精品女主播一区二区三区 | 日韩av在线网站 | 国内精品免费久久影院 | 成人电影毛片 | 国产一级免费在线 | 色狠狠干 | 在线不卡视频 | 日韩有码第一页 | 粉嫩一二三区 | 久久九九影视网 | 色大片免费看 | 国产伦理久久精品久久久久_ | 韩国精品视频在线观看 | 国产永久免费高清在线观看视频 | 日本视频高清 | 在线a人片免费观看视频 | wwwav视频| 国产在线观看黄 | 免费福利小视频 | 亚洲成人一区 | 天堂av网站 | 精品国产乱码 | 亚洲精品视频网站在线观看 | 国产黄色片一级三级 | 成年人视频在线观看免费 | 久久精品二区 | 99热99re6国产在线播放 | 中文字幕在线播放av | 久久伊人八月婷婷综合激情 | www.超碰| 亚洲婷婷综合色高清在线 | 丁香婷婷激情 | 又黄又刺激又爽的视频 | 九九热只有这里有精品 | 免费看的黄色片 | 国产欧美最新羞羞视频在线观看 | 精品国产1区2区3区 国产欧美精品在线观看 | 国产999精品视频 | 欧美色图88 | 国产高清专区 | 中文字幕在线观看第三页 | 亚洲精品日韩一区二区电影 | 特黄色大片 | www.五月天色 | 欧美va电影| 又色又爽又黄 | 91黄色在线看 | 中文字幕国内精品 | 黄色电影在线免费观看 | 精品国产电影一区 | 久久视频这里只有精品 | 天天干视频在线 | 亚洲日韩欧美一区二区在线 | 久久免费的视频 | 特级a毛片 | 久久久高清免费视频 | 日本久久91| 在线v片 | 狠狠操综合网 | 国产区免费在线 | 尤物九九久久国产精品的分类 | 国产日产精品久久久久快鸭 | 在线成人中文字幕 | 91免费在线视频 | 久久精品99视频 | 综合激情| 久久激情网站 | 日韩黄色在线 | 九九热免费精品视频 | 久久艹艹 | 五月天天在线 | 久久黄色免费观看 | 国产一级片直播 | 人人爽人人 | 天天躁日日躁狠狠躁 | 黄免费网站 | 久久综合九色 | 在线成人短视频 | 天天操天天射天天爽 | 亚洲精品美女在线 | 日日夜夜天天人人 | 亚洲综合色丁香婷婷六月图片 | 国产一级片网站 | 日本中文字幕在线播放 | 你操综合 | 亚欧洲精品视频在线观看 | 久久久亚洲电影 | 成人久久毛片 | 亚洲最大激情中文字幕 | 色a网 | 五月天九九 | 在线观看亚洲电影 | 国产精品 国产精品 | 亚洲一级理论片 | 麻豆视频免费入口 | 久久久精品视频成人 | 国产精品久久一区二区三区不卡 | 国产一区自拍视频 | 国产成人免费在线观看 | 九九热精品在线 | 亚洲精品毛片一级91精品 | 久久精品中文字幕一区二区三区 | 国产看片网站 | 国产日韩精品一区二区在线观看播放 | 国产大尺度视频 | 久久手机免费视频 | 九七视频在线观看 | 国模精品在线 | 精品国产乱码久久久久久1区二区 | 69国产盗摄一区二区三区五区 | 日日射天天射 | 国产精品 中文字幕 亚洲 欧美 | 久草在线免费资源站 | 伊人成人激情 | 日日夜夜狠狠干 | 91日韩在线视频 | 国产在线观看一区 | 精品久久久久久久久久岛国gif | 成人午夜电影网站 | 少妇搡bbb | 免费a网站 | 亚洲国产精品人久久电影 | 亚洲精品国偷自产在线91正片 | 日韩在线观看视频一区二区三区 | www.久久色| 国产亚洲精品久久久久秋 | 久久免费看av | 又黄又刺激视频 | 97视频一区 | 黄色日视频 | 色噜噜狠狠狠狠色综合久不 | 久久人人精 | 人人爽人人爽人人爽学生一级 | 日韩精品最新在线观看 | 97在线观看免费观看 | 国产美女主播精品一区二区三区 | 色婷婷综合久久久久 | 久久99热国产 | 91人人人 | 欧美激情精品久久久久久免费印度 | 天天射天天爱天天干 | 中文国产在线观看 | 久久一久久 | 五月婷丁香网 | 在线看小早川怜子av | 国产尤物在线 | 国产在线精 | 色天天| 久久经典国产视频 | 天天操天天操天天操天天操天天操天天操 | 国产h在线播放 | 国产91全国探花系列在线播放 | 久久66热这里只有精品 | 日韩欧美视频在线免费观看 | 婷婷黄色片 | 国产午夜剧场 | 精品一区二区影视 | 欧美日韩国内在线 | 成人午夜精品 | 日本三级香港三级人妇99 | 1024手机基地在线观看 | 超级碰视频 | 久久国产欧美日韩 | 日韩免费观看av | 97视频人人 | 国产精品一区在线 | 色窝资源 | 三级黄免费看 | 美女网站视频免费都是黄 | 国产精品99久久久久久宅男 | 午夜婷婷在线播放 | 一区二区三区三区在线 | 免费看三级 | 香蕉久久久久 | 欧美日韩精 | 日韩av男人的天堂 | 国产在线日本 | 久久伊人精品天天 | 久久人人精 | 亚洲精品9 | 免费看污污视频的网站 | 久久久久久不卡 | 麻豆精品传媒视频 | 久久视频二区 | 亚洲天堂免费视频 | 少妇做爰k8经典 | 亚洲深爱激情 | 亚洲黄色在线播放 | 久久久久国产一区二区三区四区 | 亚洲一级免费观看 | 伊人狠狠色 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 樱空桃av | 亚洲精品视频偷拍 | 在线电影91| 日韩伦理片一区二区三区 | 五月天激情婷婷 | 91精品国产91久久久久福利 | 中文字幕久久精品亚洲乱码 | 在线观看色网 | 一级黄色免费 | 免费中文字幕视频 | 一区二区中文字幕在线播放 | 亚洲精品在线观看网站 | 欧美色精品天天在线观看视频 | 91手机电视 | 久久免费精彩视频 | 久草视频在线资源 | 久久国产片 | 国产精品theporn | 偷拍区另类综合在线 | 亚洲精品午夜久久久久久久 | 国产97av | 久久精品导航 | 亚洲精品久久久久久中文传媒 | 日韩一区二区免费视频 | av超碰在线 | 国产精品专区在线观看 | 国产亚洲精品久久久久久久久久 | 国产精品久久久久免费观看 | 精品视频免费看 | 亚洲综合网站在线观看 | www.888av| 国产又黄又猛又粗 | 激情欧美一区二区免费视频 | 国产黄色在线网站 | 一区在线观看 | 国产黄a三级三级三级三级三级 | 黄色资源网站 | 激情综合五月天 | 成人av影视观看 | 最新国产福利 | 日韩免费播放 | 2021国产在线 | 九九av| 日韩理论在线观看 | 久热免费在线观看 | 探花视频免费观看高清视频 | 亚洲精品高清视频 | 日韩精品视频免费看 | 精品国产精品国产偷麻豆 | 久久试看| 波多野结衣电影一区二区三区 | 高清精品在线 | 国产美女免费看 | 日本中文不卡 | 在线看污网站 | 精品婷婷| 精品国产1区2区 | 五月婷婷六月丁香 | 日韩在线观看视频中文字幕 | 91人人射| 国产精品婷婷午夜在线观看 | 亚洲欧美国产精品18p | 中文字幕一区二区在线播放 | 国产丝袜网站 | 欧美日韩中文国产一区发布 | 久久福利剧场 | 国产精品免费麻豆入口 | av色影院 | 在线免费视频一区 | 狠狠干天天 | 国产生活一级片 | 久久久午夜剧场 | 国产福利91精品一区 | 成人在线视频你懂的 | 国内久久精品视频 | 免费视频久久 | 亚在线播放中文视频 | 亚洲香蕉在线观看 | 国产二级视频 | 最新日韩中文字幕 | 国产精品久久久久久久久久免费看 | av福利电影 | 在线观看成年人 | 亚洲国内在线 | 亚洲成人在线免费 | 91探花视频 | 热久久最新地址 | 亚洲电影在线看 | 日韩久久电影 | 精品一区 精品二区 | 国产黄色片免费看 | 日韩欧美一区二区三区免费观看 | 热99久久精品 | 国产最新91 | 欧美日韩在线观看不卡 | av九九九 | 青草视频在线免费 | 免费一级特黄毛大片 | 激情久久综合网 | 欧美色888| 一本一本久久a久久精品牛牛影视 | av色网站 | 干综合网 | 深爱激情婷婷网 | 91亚洲精品乱码久久久久久蜜桃 | 亚洲国产色一区 | 91在线免费观看网站 | 91在线小视频 | 91九色在线视频 | 久久线视频| 精品女同一区二区三区在线观看 | 91视频这里只有精品 | 亚洲一区欧美激情 | 综合在线观看色 | 激情图片区 | 特级毛片aaa | 精品国产aⅴ麻豆 | 黄色一及电影 | 国产精品精品久久久久久 | 国产精品国内免费一区二区三区 | 中文字幕丝袜美腿 | 婷婷久久五月天 | 97超碰在线视 | 久久99精品视频 | www.色综合.com | 国产精品一区二区三区观看 | 丁香花在线观看免费完整版视频 | www欧美日韩| 精品国产一区二区三区四区在线观看 | 黄色毛片电影 | av免费试看 | www.久久色| 精品九九九| 一区三区视频在线观看 | 欧美性另类 | 日韩在线电影观看 | 亚洲国产午夜 | 日韩成人在线免费观看 | 色婷婷综合久久久久中文字幕1 | 免费在线国产精品 | 人人视频网站 | 三上悠亚一区二区在线观看 | 粉嫩av一区二区三区四区 | 在线av资源 | 黄色tv视频| 91香蕉视频黄 | 国产色视频网站 | 丰满少妇在线观看网站 | 国产精品一区二区三区在线 | 91精品婷婷国产综合久久蝌蚪 | 激情综合国产 | 深夜视频久久 | 免费黄色看片 | 黄色av大片 | 日韩精品一卡 | 日本精品久久久久久 | sesese图片 | a精品视频 | 国产精品一区二区久久精品 | 91精品国产高清自在线观看 | 精品999久久久 | 国产麻豆电影在线观看 | 高清有码中文字幕 | 欧美日韩99 | 中文字幕成人在线观看 | 精品视频资源站 | 国产99久久久国产精品成人免费 | 毛片网站在线观看 | 成人亚洲网 | 欧美性色综合网站 | 欧美午夜精品久久久久久浪潮 | 97国产在线 | 中文伊人| 久久久久久久久艹 | 久久精品综合网 | 日韩av影视在线观看 | 国产亚洲欧美一区 | 日韩理论片在线观看 | 人人插人人澡 | 欧美激情在线看 | 国产69久久精品成人看 | 人人狠狠综合久久亚洲 | 特级毛片网 | 国产青春久久久国产毛片 | 天天色天天干天天色 | 国产精品久久久久久影院 | 亚洲精品一区二区三区新线路 | 丁香六月婷婷开心 | 黄色精品视频 | 久久久在线 | 亚洲欧美视频网站 | 麻豆视频免费看 | 国产美女无遮挡永久免费 | 久草在线国产 | 国产99久久久国产精品免费二区 | www.夜夜操.com| 久久精品国产一区二区 | 久久网站最新地址 | 伊人va | 日韩电影久久久 | 激情五月网站 | 69精品| 国产精久久 | 国产视频一区在线播放 | 中文字幕黄网 | 久久99最新地址 | 97视频免费在线 | 久久久久激情 | 婷婷看片| 天天天天天天天操 | 亚洲一区二区视频在线播放 | 草在线视频 | 精品亚洲免费 | 国产精品完整版 | 久久婷婷色综合 | 国产色视频一区二区三区qq号 | 久久影视精品 | av在线电影免费观看 | 国产在线探花 | 久久精品一级片 | 亚洲欧美成人在线 | 天天拍天天爽 | 在线观看中文字幕第一页 | 久久99久久精品国产 | 久久最新视频 | 日韩久久视频 | 日韩免费三区 | 中文字幕国内精品 | 四虎影视成人精品国库在线观看 | 成人av直播 | 激情电影影院 | 亚洲成人av电影在线 | 日本资源中文字幕在线 | 久久婷婷丁香 | 五月婷婷香蕉 | 亚洲国产中文字幕在线视频综合 | 日韩一区二区免费播放 | 亚洲最新合集 | 精品视频免费久久久看 | 成人在线观看网址 | 国产精品成人在线 | 日本中文字幕在线一区 | 国产精品日韩精品 | 日韩精品中文字幕有码 | a在线播放| 国产精品久久电影观看 | 日韩高清成人 | 99久久激情视频 | 色综合天天色综合 | 欧美三人交 | av黄色免费网站 | 91在线porny国产在线看 | 视频国产| 少妇性aaaaaaaaa视频 | 色国产精品一区在线观看 | 一区二区三区精品久久久 | 黄色看片| 超碰在线观看av | 最新国产中文字幕 | 成年人黄色av| 日韩欧美一区二区三区在线 | 在线观看中文字幕 | 最近日韩中文字幕中文 | 免费福利在线 | 欧美在线free | 国产中文字幕精品 | 在线成人小视频 | 久久成视频| 99精品在线免费观看 | 亚洲在线免费视频 | 久久人人爽人人爽人人片av免费 | 欧美日韩一区二区在线观看 | 国内外成人在线 | 色视频在线免费 | 日韩视频中文字幕 | 91网在线观看 | 久久久麻豆精品一区二区 | 欧美在线一二区 | 日韩美视频| 91麻豆免费看 | 日韩电影一区二区三区在线观看 | 国产成人精品久 | 91人人在线 | 欧美最爽乱淫视频播放 | 国产网站av| 精品在线播放视频 | 99久久精品免费看国产免费软件 | 成人国产电影在线观看 | 久久99精品久久久久久秒播蜜臀 | 深夜福利视频一区二区 | 成人国产网站 | 日精品在线观看 | 日韩午夜在线观看 | 日本丶国产丶欧美色综合 | 国产999精品久久久久久绿帽 | 少妇性色午夜淫片aaaze | 国产成人一区二区三区在线观看 | 婷婷在线视频 | 97精品国产97久久久久久粉红 | 久久久999 | www操操操 | 91香蕉国产 | 精品99在线观看 | 日本91在线 | 视频国产区| 丁香激情视频 | 草免费视频 | 91在线入口 | 在线观看a视频 | 8090yy亚洲精品久久 | 国产二区视频在线观看 | 亚洲一区久久久 | 美女黄色网在线播放 | 91在线看| 久久久久亚洲国产精品 | 黄色大片网| 91视频成人免费 | 激情综合网五月 | 午夜美女福利 | 欧美精品你懂的 | 视频1区2区 | 狠狠狠狠狠狠狠狠 | 日韩欧美综合在线视频 | www.午夜| 日日干干夜夜 | 四虎影视成人永久免费观看亚洲欧美 | 亚洲视频一区二区三区在线观看 | 久久人人爽人人 | 日韩有码专区 | 一区二区伦理 | 黄在线免费观看 | 精品久久久久久亚洲综合网 | 婷婷在线综合 | 亚洲japanese制服美女 | 日日夜夜狠狠 | 三级av在线免费观看 | 亚洲欧美日本一区二区三区 | 伊人婷婷色 | 国产在线 一区二区三区 | 综合色在线观看 | 国内丰满少妇猛烈精品播放 | 伊人天天色| 久久夜色精品国产欧美一区麻豆 | 国产在线不卡一区 | 西西www4444大胆在线 | 中文字幕av一区二区三区四区 | 国产精品久久久久久久久免费 | 综合色天天 | 久久国产麻豆 | 91伊人久久大香线蕉蜜芽人口 | 91精品在线看 | 韩日在线一区 | 色婷婷狠狠五月综合天色拍 | 中文字幕国语官网在线视频 | 国产中文字幕视频在线观看 | 天天射天天射天天 | 免费在线观看午夜视频 | 97在线观看免费观看高清 | 黄色的网站在线 | 超级碰99 | 国内免费久久久久久久久久久 | 亚色视频在线观看 | 国产一线二线三线在线观看 | 久久免费在线 | 久久这里有精品 | 国产对白av | 国产精品欧美久久久久久 | 日韩欧美在线观看一区二区 | 亚洲在线色 | 中文字幕 91 | 欧美精品九九 | 国产成人黄色av | 视频一区视频二区在线观看 | 成人久久久久久久久 | 国产一区二区三区免费观看视频 | 国产99久久久精品视频 | 亚洲精品五月 | 午夜视频在线观看一区二区三区 | 天天射天天拍 | 亚洲精品视频网址 | 日日干夜夜骑 | 一级黄色片在线播放 | 亚洲午夜精品福利 | 久草久草在线观看 | 中文字幕在线观看免费高清完整版 | 九九免费在线观看视频 | 国产r级在线观看 | 99久热在线精品视频成人一区 | 99精品视频在线看 | 麻豆传媒视频在线播放 | www久| 国产高清视频在线观看 | 九九综合九九综合 | 国产视频欧美视频 | 一区二区视频免费在线观看 | 天天色.com | 亚洲狠狠 | 日韩在线视频播放 | 国产老太婆免费交性大片 | 三级黄色免费 | 国产视频久久久 | 97超碰精品 | 免费一级特黄毛大片 | 成人教育av | 精品日韩视频 | 中字幕视频在线永久在线观看免费 | 欧美日韩午夜在线 | 久久理论视频 | 在线免费色 | 91看片一区二区三区 | 国产精品欧美久久久久无广告 | 天天射天天干 | 中文字幕久久精品亚洲乱码 | 在线观看国产高清视频 | 日韩亚洲在线观看 | 色在线高清 | 伊人一级| 黄色免费视频在线观看 | 亚洲天堂香蕉 | 国产福利网站 | 美女视频黄色免费 | 国产在线观看黄 | 91精品欧美一区二区三区 | www.色国产| 成人黄色小说在线观看 | 欧美在一区 | 国产一级久久久 | 久久老司机精品视频 | 在线视频观看成人 | 国产成人av电影在线观看 | 成人h视频在线播放 | 日日干夜夜草 | 亚洲成人在线免费 | 色wwwww| 国产破处视频在线播放 | 少妇av网 | 免费在线观看91 | 视色网站 | 午夜骚影| 亚洲伊人色 | 99久久久国产精品免费99 | 在线观看亚洲视频 | av中文字幕网址 | 四虎www.| 美女搞黄国产视频网站 | 四虎免费在线观看视频 | 国产91全国探花系列在线播放 | 免费看精品久久片 | 亚洲欧洲国产精品 | 国产亚洲精品久久久久秋 | 亚洲精品国产精品国自产 | 久久一区二区三区超碰国产精品 | 中文字幕精品一区二区三区电影 | 99精品免费久久久久久日本 | 深夜激情影院 | 一区二区三区在线观看免费视频 | 日韩在线观看视频网站 | 免费观看v片在线观看 | 日韩高清国产精品 | 国产精品免费高清 | 韩国av免费观看 | 97成人免费视频 | 中文av字幕在线观看 | 久久福利小视频 | 久草在线网址 | 欧美日韩在线免费视频 | 成人免费在线视频观看 | 欧美电影在线观看 | 精品久久国产 | 精品久久五月天 | 2000xxx影视| 91成人网在线观看 | 久久综合狠狠综合久久激情 | 美女网站在线播放 | 青青河边草免费观看 | 久久伊人婷婷 | 97在线视频免费观看 | 精品自拍av | 一区二区中文字幕在线播放 | 日韩激情第一页 | 亚洲色图激情文学 | 天天草天天操 | 久久久久女教师免费一区 | 亚洲一级免费观看 | 久草视频2 | 97在线视频观看 | 国产91精品一区二区绿帽 | 日韩av中文 | 麻豆观看| 日韩大片在线免费观看 | 一级性生活片 | 黄污在线看 | 色综合天天视频在线观看 | 日日操天天操狠狠操 | 免费在线色视频 | 国产在线不卡一区 | 亚洲色图av | 免费观看国产精品视频 | 中文字幕av免费在线观看 | 国产免费观看久久黄 | 国产精品 视频 | 久久久久久久毛片 | 亚洲精品在线观看网站 | 天天摸天天干天天操天天射 | 久久一级电影 | 狠狠干.com | 国产最新精品视频 | 国产精品久久久久久久午夜片 | 在线视频日韩 | 中文字幕综合在线 | 久久精品91久久久久久再现 | 午夜久久久久久久久久影院 | 国产在线1区 | 欧美日韩在线播放一区 | 国产精品久久一区二区无卡 | 色综合网在线 | 波多野结衣网址 | 成人久久18免费网站麻豆 | 亚洲视频在线免费看 | 国产大片免费久久 | 一区二区三区动漫 | 天海冀一区二区三区 | 91免费视频国产 | 亚洲国产中文在线 | 久久午夜电影院 | 欧美性黑人 | 欧美午夜精品久久久久久浪潮 | 日韩a在线看 | 亚洲免费不卡 | 久久乐九色婷婷综合色狠狠182 | 中文字幕在线观 | 中文字幕视频网站 | 中文字幕亚洲欧美 | 国产黄色片免费观看 | 欧美福利精品 | 天天射综合网视频 | 国产精品久久久久aaaa | 久草免费看 | 亚洲91在线| 在线观看黄色小视频 | 日本中文一级片 | 久久刺激视频 | 国产精品自产拍在线观看蜜 | 免费看的黄网站 | www黄色com | 久久五月天色综合 | 狠狠狠狠干 | 久久艹在线| 9999国产精品 | 成人小视频在线观看免费 | 国产免费专区 | 亚洲91网站 | 永久免费的啪啪网站免费观看浪潮 | 日韩精选在线 | 天天射天天干天天插 | 日韩中文字幕在线观看 | 最新日韩中文字幕 | 欧美一级艳片视频免费观看 | 久久久精品欧美 | av福利第一导航 | 波多野结衣一区二区三区中文字幕 | 国产午夜三级一区二区三 | 亚洲精品国产高清 | 国产福利91精品张津瑜 | 毛片一区二区 | 看片一区二区三区 | 亚洲日本三级 | 超碰免费久久 | 久久综合桃花 | 在线观看日韩av | 天天操夜夜干 | 久久私人影院 | a久久久久久 | 久久免费视频在线观看 | 91中文字幕永久在线 | 亚洲在线精品视频 | 国产 视频 高清 免费 | 日韩成人av在线 | 91视频下载 | 欧美日韩aa| 国产成人精品一区二区三区免费 | 欧亚久久 | 亚洲午夜久久久久 | 国产精品九九视频 | 欧美日韩在线网站 | 久久有精品 | 欧美日韩国产一二 | 久久精久久精 | 国产精品久久久久久久妇 | 亚洲精品国产成人 | 黄色毛片视频免费 | 国产又黄又爽又猛视频日本 | 日韩网站在线免费观看 | 欧美日韩国语 | 九九视频这里只有精品 | 97超碰福利久久精品 | 91tv国产成人福利 | 人人澡超碰碰 | 久久电影中文字幕视频 | 日韩av成人在线观看 | 久久99精品久久久久久久久久久久 | 国产精品一区二区在线 | 欧美性生活大片 | 国产日韩精品在线观看 | 青春草视频 | 久久香蕉电影 | 亚洲综合在 | 亚洲国产高清视频 | 91精品国产高清自在线观看 | 久久久精品电影 | 夜夜躁狠狠躁 | 国产美腿白丝袜足在线av | 欧美日韩另类在线观看 | 99久高清在线观看视频99精品热在线观看视频 | 最近最新中文字幕视频 | 天堂激情网| 91成人精品 | 91精品蜜桃 | 久久久免费精品 | 久久久久国产a免费观看rela | 欧美国产日韩久久 |