“每18至24個月,前端都會難一倍”
——赫門 “2015深JS大會《前端服務化之路》主題演講”
題目&答案
- 你遇到過比較難的技術問題是什么?你是如何解決的?
- 是否知道關于設計模式中的Singleton,Factory,Strategy,Decrator?
- 常使用的庫有哪些?常使用的前端開發工具有哪些?開發過什么應用或組件?
- 頁面重構怎么操作?
網站重構:
在不改變外部行為的前提下,簡化結構、添加可讀性,而在網站前端保持一致的行為。
也就是說在不改變UI的情況下,對網站進行優化,在擴展的同時保持一致的UI。
//
傳統網站的重構通常是:
表格(table)布局改為 div+css
使網站前端兼容于現代瀏覽器(針對于不合規范的css)
對于移動平臺的優化
針對SEO進行優化
//
深層次的網站重構應該考慮的方面:
減少代碼間的耦合
讓代碼保持彈性
嚴格按規范編寫代碼
設計可擴展的API
代替舊有的框架、語言(如 VB)
增強用戶體驗
//
通常來說對于速度的優化也包含在重構中
壓縮js、css、image等前端資源(通常由服務器來解決)
程序的性能優化(如數據讀寫)
采用CDN來加速資源加載
對于js、DOM的優化
HTTP服務器的文件緩存
- 列舉IE與其他瀏覽器不一樣的特性
觸發事件的元素被認為是目標(target)。而在IE中,目標包含在event對象的srcElement屬性;
獲取字符代碼、如果按鍵代表一個字符(shift、ctrl、alt除外),IE的keyCode會返回字符代碼(Unicode),DOM中按鍵的代碼和字符是分離的,要獲取字符代碼,需要使用charCode屬性;
阻止某個事件的默認行為,IE 中阻止某個事件的默認行為,必須將 returnValue 屬性設置為 false,Mozilla 中,需要調用 preventDefault() 方法;
停止事件冒泡,IE 中阻止事件進一步冒泡,需要設置 cancelBubble 為 true,Mozzilla 中,需要調用 stopPropagation();
- “99%的網站都需要被重構”是哪本書上寫的?
《網站重構:應用Web標準進行設計(第2版)》
- 什么叫優雅降級和漸進增強?
優雅降級:
Web站點在所有新式瀏覽器中都能正常工作,如果用戶使用的是老式瀏覽器,則代碼會針對舊版本的IE進行降級處理了,使之在舊式瀏覽器上以某種形式降級體驗卻不至于完全不能用。
如:border-shadow
//
漸進增強:
從被所有瀏覽器支持的基本功能開始,逐步地添加那些只有新版本瀏覽器才支持的功能,向頁面增加不影響基礎瀏覽器的額外樣式和功能的。當瀏覽器支持時,它們會自動地呈現出來并發揮作用。
如:默認使用flash上傳,但如果瀏覽器支持 HTML5 的文件上傳功能,則使用HTML5實現更好的體驗;
- 是否了解公鑰加密和私鑰加密?
一般情況下私鑰用于對數據進行簽名,公鑰用于對簽名進行驗證;
HTTP網站在瀏覽器端用公鑰加密敏感數據,然后在服務器端再用私鑰解密。
- Web應用從服務器主動推送Data到客戶端有哪些方式?
HTML5提供的WebSocket
不可見的iframe
WebSocket通過Flash
XHR長時間連接
XHR Multipart Streaming
<script>標簽的長時間連接(可跨域)
- 對Node的優點和缺點提出自己的看法?
優點:
因為Node是基于事件驅動和無阻塞的,所以非常適合處理并發請求,因此構建在Node上的代理服務器相比其他技術實現(如Ruby)的服務器表現要好得多。此外,與Node代理服務器交互的客戶端代碼是由javascript語言編寫的,因此客戶端和服務器端都用同一種語言編寫,這是非常美妙的事情。
//
缺點:
Node是一個相對新的開源項目,所以不太穩定,它總是一直在變,而且缺少足夠多的第三方庫支持。看起來,就像是Ruby/Rails當年的樣子。
- 你用過哪些前端性能優化的方法?
(1)減少http請求次數:CSS Sprites,JS、CSS源碼壓縮、圖片大小控制合適;網頁Gzip,CDN托管,data緩存 ,圖片服務器。
(2)前端模板 JS+數據,減少由于HTML標簽導致的帶寬浪費,前端用變量保存AJAX請求結果,每次操作本地變量,不用請求,減少請求次數.
(3)用innerHTML代替DOM操作,減少DOM操作次數,優化javascript性能。
(4)當需要設置的樣式很多時設置className而不是直接操作style。
(5)少用全局變量、緩存DOM節點查找的結果。減少IO讀取操作。
(6)避免使用CSS Expression(css表達式)又稱Dynamic properties(動態屬性)。
(7)圖片預加載,將樣式表放在頂部,將腳本放在底部 加上時間戳。
(8)避免在頁面的主體布局中使用table,table要等其中的內容完全下載之后才會顯示出來,顯示比div+css布局慢。
//
對普通網站有一個統一的思路,就是盡量向前端優化、減少數據庫請求、減少磁盤I/O。
向前端優化指的是,在不影響功能和體驗的情況下,能在瀏覽器執行的不要在服務端執行,能在緩存服務器上直接返回的不要到應用服務器,程序能直接取得的結果不要到外部取得,本機內能取得的數據不要到遠程取,內存能取到的不要到磁盤取,緩存中有的不要去數據庫查詢。減少數據庫操作指減少更新次數、緩存結果減少查詢次數、將數據庫執行的操作盡可能的讓你的程序完成(例如join查詢),減少磁盤IO指盡量不使用文件系統作為緩存、減少讀寫文件次數等。程序優化永遠要優化慢的部分,換語言是無法“優化”的。
- HTTP 狀態碼有哪些?分別代表什么意思?
完整版
1**(信息類):表示接收到請求并且繼續處理
100——客戶必須繼續發出請求
101——客戶要求服務器根據請求轉換HTTP協議版本
//
2**(響應成功):表示動作被成功接收、理解和接受
200——表明該請求被成功地完成,所請求的資源發送回客戶端
201——提示知道新文件的URL
202——接受和處理、但處理未完成
203——返回信息不確定或不完整
204——請求收到,但返回信息為空
205——服務器完成了請求,用戶代理必須復位當前已經瀏覽過的文件
206——服務器已經完成了部分用戶的GET請求
//
3**(重定向類):為了完成指定的動作,必須接受進一步處理
300——請求的資源可在多處得到
301——本網頁被永久性轉移到另一個URL
302——請求的網頁被轉移到一個新的地址,但客戶訪問仍繼續通過原始URL地址,重定向,新的URL會在response中的Location中返回,瀏覽器將會使用新的URL發出新的Request。
303——建議客戶訪問其他URL或訪問方式
304——自從上次請求后,請求的網頁未修改過,服務器返回此響應時,不會返回網頁內容,代表上次的文檔已經被緩存了,還可以繼續使用
305——請求的資源必須從服務器指定的地址得到
306——前一版本HTTP中使用的代碼,現行版本中不再使用
307——申明請求的資源臨時性刪除
//
4**(客戶端錯誤類):請求包含錯誤語法或不能正確執行
400——客戶端請求有語法錯誤,不能被服務器所理解
401——請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用
HTTP 401.1 - 未授權:登錄失敗
HTTP 401.2 - 未授權:服務器配置問題導致登錄失敗
HTTP 401.3 - ACL 禁止訪問資源
HTTP 401.4 - 未授權:授權被篩選器拒絕
HTTP 401.5 - 未授權:ISAPI 或 CGI 授權失敗
402——保留有效ChargeTo頭響應
403——禁止訪問,服務器收到請求,但是拒絕提供服務
HTTP 403.1 禁止訪問:禁止可執行訪問
HTTP 403.2 - 禁止訪問:禁止讀訪問
HTTP 403.3 - 禁止訪問:禁止寫訪問
HTTP 403.4 - 禁止訪問:要求 SSL
HTTP 403.5 - 禁止訪問:要求 SSL 128
HTTP 403.6 - 禁止訪問:IP 地址被拒絕
HTTP 403.7 - 禁止訪問:要求客戶證書
HTTP 403.8 - 禁止訪問:禁止站點訪問
HTTP 403.9 - 禁止訪問:連接的用戶過多
HTTP 403.10 - 禁止訪問:配置無效
HTTP 403.11 - 禁止訪問:密碼更改
HTTP 403.12 - 禁止訪問:映射器拒絕訪問
HTTP 403.13 - 禁止訪問:客戶證書已被吊銷
HTTP 403.15 - 禁止訪問:客戶訪問許可過多
HTTP 403.16 - 禁止訪問:客戶證書不可信或者無效
HTTP 403.17 - 禁止訪問:客戶證書已經到期或者尚未生效
404——一個404錯誤表明可連接服務器,但服務器無法取得所請求的網頁,請求資源不存在。eg:輸入了錯誤的URL
405——用戶在Request-Line字段定義的方法不允許
406——根據用戶發送的Accept拖,請求資源不可訪問
407——類似401,用戶必須首先在代理服務器上得到授權
408——客戶端沒有在用戶指定的餓時間內完成請求
409——對當前資源狀態,請求不能完成
410——服務器上不再有此資源且無進一步的參考地址
411——服務器拒絕用戶定義的Content-Length屬性請求
412——一個或多個請求頭字段在當前請求中錯誤
413——請求的資源大于服務器允許的大小
414——請求的資源URL長于服務器允許的長度
415——請求資源不支持請求項目格式
416——請求中包含Range請求頭字段,在當前請求資源范圍內沒有range指示值,請求也不包含If-Range請求頭字段
417——服務器不滿足請求Expect頭字段指定的期望值,如果是代理服務器,可能是下一級服務器不能滿足請求長。
//
5**(服務端錯誤類):服務器不能正確執行一個正確的請求
HTTP 500 - 服務器遇到錯誤,無法完成請求
HTTP 500.100 - 內部服務器錯誤 - ASP 錯誤
HTTP 500-11 服務器關閉
HTTP 500-12 應用程序重新啟動
HTTP 500-13 - 服務器太忙
HTTP 500-14 - 應用程序無效
HTTP 500-15 - 不允許請求 global.asa
Error 501 - 未實現
HTTP 502 - 網關錯誤
HTTP 503:由于超載或停機維護,服務器目前無法使用,一段時間后可能恢復正常
- 一個頁面從輸入URL到頁面加載顯示完成,這個過程中都發生了什么?(流程說的越詳細越好)
注:這道題勝在區分度高,知識點覆蓋廣,再不懂的人也能答出一些。高手可以根據自己擅長的領域自由發揮,從URL規范、HTTP協議、DNS、CDN、數據查詢、瀏覽器流式解析、CSS規則構建、layout、paint、onload/domready、JS執行、JS API綁定等等;
//
詳細版:
(1)瀏覽器會開啟一個線程來處理這個請求,對 URL 分析判斷,如果是 http 協議就按照 web 方式來處理;
(2)調用瀏覽器內核中的對應方法,比如 WebView 中的 loadUrl 方法;
(3)通過 DNS 解析獲取網址的 IP 地址,設置 UA 等信息發出第二個 GET 請求;
(4)進行 HTTP 協議會話,客戶端發送報頭(請求報頭);
(5)進入到 web 服務器上的 Web Server,如 Apache、Tomcat、Node.js 等服務器;
(6)進入部署好的后端應用,如 PHP、Java、JavaScript、Python 等,找到對應的請求處理;
(7)處理結束回饋報頭,此處如果瀏覽器訪問過,緩存上有對應資源,會與服務器最后修改事件對比,一致則返回304;
(8)瀏覽器開始下載 html 文檔(響應報頭,狀態碼200),同時使用緩存;
(9)文檔樹建立,根據標記請求所需指定 MIME 類型的文件(比如css、js),同時設置 cookie;
(10)頁面開始渲染 DOM ,JS 根據 DOM API 操作 DOM ,執行事件綁定等,頁面顯示完成;
//
簡潔版:
瀏覽器根據請求的 URL 交給 DNS 域名解析,找到真實 IP ,向服務器發起請求;
服務器交給后臺處理完成后返回數據,瀏覽器接收文件(HTML、CSS、JS、image等);
瀏覽器對加載到的資源(HTML、CSS、JS等)進行語法解析,建立相應的內部數據結構(如 HTML 的 DOM );
載入解析到的資源文件,渲染頁面,完成。
- 對前端工程師這個職位是怎么理解的?它的前景怎么樣?
前端是最貼近用戶的開發人員,比后端、數據庫、產品經理、經營、安全都近。
(1)實現界面交互
(2)提升用戶體驗
(3)有了 Node.js ,前端可以實現服務器端的一些事情
//
前端是最貼近用戶的程序員,前端的能力就是能讓產品從 90分進化到 100 分,甚至更好。
參與項目,快速高質量完成實現效果圖,精確到1px;
與團隊成員,UI設計,產品經理的溝通;
做好的頁面結構,頁面重構和用戶體驗;
處理hack,兼容、寫出優美的代碼格式;
針對服務器的優化、擁抱最新前端技術。
- 平時如何管理你的開發項目?
前期團隊必須確定好全局樣式(globe.css),編碼模式(utf-8)等;
編寫習慣必須一致(例如都采用繼承式的寫法,單樣式都寫成一行);
標注樣式編寫人,各模塊都及時標注(標注關鍵樣式調用的地方);
頁面進行標注(例如 頁面、模塊、開始和結束);
CSS 跟 HTML 分文件夾并行存放,命名都得統一(例如 style.css);
JS 分文件夾存放,命名以該 JS 功能為準的英文翻譯;
圖片采用整合的 images.png png8 格式文件使用,盡量整合在一起使用以方便將來的管理。
- 移動端(Android iOS)怎么做好用體驗?
清晰的視覺縱線
信息的分組、極致的減法
利用選擇代替輸入
標簽及文字的排布方式
依靠明文確認密碼
合理的鍵盤利用
- 你對加班的看法?
加班就想借錢,原則應當是——救急不救窮!
- 從打開 App 到刷新出內容,整個過程中都發生了什么,如果感覺慢,怎么定位問題,怎么解決?
- 除了前端以外還了解什么其他技術?你最厲害的技能是什么?
- 你怎么看待 Web App、Hybrid App、Native App?
- 談談你對移動前端開發的理解。(和Web前端開發的主要區別是什么)
- 說說最近流行的一些東西吧?
ES6\Node\WebAssembly\MVVM\Web Components\React\React Native\Angular2.0\Webpack
- 知道什么是 SEO 嗎?怎么優化?各種 meta data 是什么含義?
- 談談你對 “全端工程師” 和 “全棧工程師” 的理解。
全端是橫向的,全棧是縱向的。
//
全端即所有的終端說白了都是前端,因為都關乎到用戶體驗,直接和用戶接觸。適應多終端的開發,要求你在web前端的基礎上,可能還要擴展Android開發和iOS開發的知識,好在由于hybrid開發方式的流行,對使用native語言開發的技能會要求的不那么深。
全棧可以說是最適合初創公司的一種發展類型,廣義上認為是從前端干到后端,從開發干到運維;而狹義上的全棧特指使用js語言從前端寫到假設在NodeJS上的后端,前后端統一語言,統一編程模型,甚至共用同一套代碼。
- 是否了解 Web 注入攻擊,說下原理,最常見的兩種攻擊(XSS 和 CSRF)了解到什么程度?
- 項目中遇到過哪些印象深刻的技術難題?具體是什么問題?怎么解決的?
- 最近在學什么東西?
- 你的優點是什么?缺點是什么?
- 能談談未來3、5年給自己的規劃嗎?
系列:
前端開發面試題之HTML
前端開發面試題之CSS
前端開發面試題之JavaScript
資料搜集整理自 網絡
同時發布在 GitHub-前端開發面試題之綜合篇、GitBook-《WEB-DE》前端開發面試題之綜合篇