noah的前端面試題(二)|掘金技術徵文

麻醬愛我發表於2018-04-08

上一篇 前端面試題(一)

1. 你們公司有什麼來專案監控

阿里中介軟體ARMS前端監控和sourcemap產生的報錯報給sensry

2. 錯誤處理有哪些

  1. try, catch方案。你可以針對某個程式碼塊使用try,catch包裝,這個程式碼塊執行時出錯時能在catch塊裡邊捕捉到。
  2. window.onerror方案。也可以通過window.addEventListener(“error”, function(evt){}),這個方法能捕捉到語法錯誤跟執行時錯誤,同時還能知道出錯的資訊,以及出錯的檔案,行號,列號。
  3. Resource Timing API 和 Performance Timing API來進行效能檢測和記憶體檢測;
  4. 擴充套件XHR原型,檢測返回的狀態碼,如404等,來檢測ajax請求失敗、錯誤
  5. 頁面的死連結可以通過Nodejs的第三方模組,如request等,來檢測


3.網路安全談談XSS與CSRF以及解決方案

XSS:跨站指令碼(Cross-site scripting,通常簡稱為XSS)是一種網站應用程式的安全漏洞攻擊,是程式碼注入的一種。它允許惡意使用者將程式碼注入到網頁上,其他使用者在觀看網頁時就會受到影響。這類攻擊通常包含了HTML以及使用者端指令碼語言解決方案如下:

a:HttpOnly 瀏覽器禁止頁面的JS訪問帶有HttpOnly屬性的Cookie。
b:輸入檢查 XSS Filter 對輸入內容做格式檢查,類似“白名單”,可以讓一些基於特殊字元的攻擊失效。在客戶端JS和伺服器端程式碼中實現相同的輸入檢查(伺服器端必須有)。
c:輸出檢查 在變數輸出到html頁面時,可以使用編碼或轉義的方式來防禦XSS攻擊 HtmlEncode:將字元轉成HTMLEntities,對應的標準是ISO-8859-1。
& --> &amp; < --> &lt; > -->&gt; " --> &quot; ' --> &#x27; / --> &#x2F;
JS中可以使用JavascriptEncode。需要對“\”對特殊字元轉義,輸出的變數的必須在引號內部。
d:XSS的本質是“HTML注入”,使用者的資料被當成了HTML程式碼一部分來執行,從而混淆了原本的語義,產生了新的語義。


CSRF:跨站請求偽造(英語:Cross-site request forgery),也被稱為 one-click attack 或者 session riding,通常縮寫為 CSRF 或者 XSRF, 是一種挾制使用者在當前已登入的Web應用程式上執行非本意的操作的攻擊方法

通用方法:Token 使用Anti-CSRF Token 在URL中保持原引數不變,新增一個引數Token。Token的值是隨機的(必須使用足夠安全的隨機數生成演算法,或者採用真隨機數生成器),其為使用者與伺服器所共同持有,可以放在使用者的Session中,或者瀏覽器的Cookie中。 注意保密,儘量把Token放在表單中(構造一個隱藏的input元素),以POST提交,避免Token洩露


4.重排和重繪

  • 部分渲染樹(或者整個渲染樹)需要重新分析並且節點尺寸需要重新計算。這被稱為重排。注意這裡至少會有一次重排-初始化頁面佈局。
  • 由於節點的幾何屬性發生改變或者由於樣式發生改變,例如改變元素背景色時,螢幕上的部分內容需要更新。這樣的更新被稱為重繪。

5.什麼情況會觸發重排和重繪?

  • 新增、刪除、更新 DOM 節點
  • 通過 display: none 隱藏一個 DOM 節點-觸發重排和重繪
  • 通過 visibility: hidden 隱藏一個 DOM 節點-只觸發重繪,因為沒有幾何變化
  • 移動或者給頁面中的 DOM 節點新增動畫
  • 新增一個樣式表,調整樣式屬性
  • 使用者行為,例如調整視窗大小,改變字號,或者滾動。

6. POST 提交資料方式有幾種

  • application/x-www-form-urlencoded
  • multipart/form-data
  • application/json
  • text/xml

7. webpack  Babel的一個外掛:transform-runtime babel-polyfill以及stage-2,你說一下他們的作用

目前瀏覽器對 ES2015 語法的支援都不太好,所以當我們需要使用 PromiseSetMap 等功能時就需要 babel-polyfill 來提供。

在轉換 ES2015 語法為 ECMAScript 5 的語法時,babel 會需要一些輔助函式,例如 _extend。babel 預設會將這些輔助函式內聯到每一個 js 檔案裡,這樣檔案多的時候,專案就會很大。

所以 babel 提供了 transform-runtime 來將這些輔助函式“搬”到一個單獨的模組 babel-runtime 中,這樣做能減小專案檔案的大小。

8. 談談webpack程式碼分割

有三種常用的程式碼分離方法:

  • 入口起點:使用 entry 配置手動地分離程式碼。
  • 防止重複:使用 CommonsChunkPlugin 去重和分離 chunk。
  • 動態匯入:通過模組的行內函數呼叫來分離程式碼。

9. ddllplugin commonschunkplugin 區別

(1)由於dll包和業務chunk包是分開進行打包的,每一次修改程式碼時只需要對業務chunk重新打包,webpack的編譯速度得到極大的提升,因此相比於CommonChunkPlugin,DllPlugin進行程式碼分割可以顯著的提升開發效率。

(2)使用DllPlugin進行程式碼分割,dll包和業務chunk相互獨立,其chunkhash互不影響,dll包很少變動,因此可以更充分的利用瀏覽器的快取系統。而使用CommonChunk打包出的程式碼,由於公有chunk中包含了webpack的runtime(執行時),公有chunk和業務chunk的chunkhash會互相影響,必須將runtime單獨提取出來,才能對公有chunk充分地使用瀏覽器的快取。

10 如何優化Webpack 構建速度

webpack 構建效能優化策略小結

11 現在有一個陣列存放字串資料:

['item1', 'item2', 'item3', 'item4', 'item5']
複製程式碼

有另外一個陣列存放一組物件:

[
  { content: 'section1', index: 0 },
  { content: 'section2', index: 2 }
]
複製程式碼

它每個物件表示的是會往原來的陣列的 index 座標插入 content 資料(index 不會重複):

       0      1      2      3      4
     item1  itme2  item3  item4  item5
    ^             ^ 
    |             |
 section1     section2  
 
最後結果是:['section1', 'item1', 'item2', 'section2', 'item3', 'item4', 'item5']
複製程式碼

請你完成 injectSections 函式,可以達到上述的功能:

injectSections(
  ['item1', 'item2', 'item3', 'item4', 'item5'],
  [
    { content: 'section1', index: 0 },
    { content: 'section2', index: 2 }
  ]
) // => ['section1', 'item1', 'item2', 'section2', 'item3', 'item4', 'item5']複製程式碼

const injectSections = (items, sections) => {  sections.sort((a,b) => b.index - a.index)  sections.forEach((m)=>{ items.splice(m.index, 0, m.content) }) return items }

相關文章