筆者畢業於東北大學,大學畢業社招進入環球網,前端開發工程師一職。技術棧:React+node,Github 地址javascript
來到杭州的目標很是的明確,大廠。其實就是網易、阿里和滴滴。好在基本三家都拿到了offer。最終決定選擇阿里p6。css
大廠流程比較長,好比阿里就面試了將近三週。因此期間也面試了不少別的公司,創業公司or上市公司。這裏我把我所被問到的面試題總結梳理一下。簡單深刻的都有。筆者我的工做經驗不豐富,如若回答很差的地方歡迎指正。html
css編寫注意事項
這個考驗我的平時編碼的總結和約束。問題較爲開放,能夠結合我的開發體驗和團隊約束來回答。好比0後面不帶單位、儘可能使用簡寫、使用子選擇器、合理使用id等。前端
es6用過麼?說說promise的實現
關於es6的知識點這裏再也不贅述。Promise的實現主要是pub-sub模式。狀態和行爲相分離的難點。
java
react的DIFF算法和virtual dom瞭解多少?node
React的render函數返回的是一個DOM描述,結果僅僅是輕量級的js對象,reactjs在調用setState的時候會更新DOM,並且是先更新virtual dom,而後和實際dom比較,最後更新dom。React厲害的地方不是說他比真實的dom速度快,而是你不敢數據怎麼變化,我都以最小的代價來更新視圖。方法就是我在內存當中使用新的數據來構建一個virtual dom,而後和舊DOM進行比較,找出差別,而後更新到DOM節點上。當咱們修改dom上的一個節點對應的state,react會當即將他標記爲「髒狀態」,在事件循環的最後才從新渲染全部的髒節點。在實際的代碼中,會對新舊兩棵樹進行一次深度優先遍歷,這樣每個節點都會有一個惟一的標記,沒遍歷到一個節點,就把該節點和新的樹進行比較,若是有差別就記錄到一個對象中,最後把差別應用到真正的DOM樹上。算法實現步驟爲:用js對象模擬DOM樹,比較兩顆虛擬DOM的差別,把差別應用到真正的DOM樹上,DOM DIFF採用的是增量更新的方式,相似於打補丁。React須要爲節點添加key來保證算法的效率。Key屬性能夠幫助react定位到正確的節點進行比較。從而大幅度減小DOM操做,提升性能。react
Modal層表明數據模型,能夠再modal層定義修改和操做數據的邏輯,view表明UI層,負責將數據轉換成UI展示出來,viewModal是同步view和modal的對象。用戶操做view層,view數據變化會同步到modal上,modal數據變化會當即反應到view中,viewModal經過實現雙向綁定來將view和modal鏈接到一塊兒。而雙向綁定,咱們能夠從髒檢查到標記更新來回答。webpack
react SSR瞭解麼
react ssr有不少種實現方式,可是原理不變,目的就是爲了減小首屏白屏時間以及有好的SEO。對於實現方式咱們能夠從next.js以及webpack-isomorphic-tools來講實現。git
http三次握手後拿到HTML是如何進行加載的?es6
考覈的主要是瀏覽器加載頁面的機制。大概能夠從瀏覽器拿到HTML,自上而下開始解析,大體分爲解析DOM,解析CSSOM,構建渲染樹,佈局階段以及繪製階段來講明。其實儘量的詳細說明,好比構建DOM的時候分別經過Bytes、characters、tokens、Nodes最終到DOM等。回答也能夠擴展repaint和reflow等瀏覽器優化。
簡述瀏覽器優化
200 From cache和200 OK有什麼區別?
顧名思義是form cache是強緩存,不會和服務器通訊,而200OK即爲服務器處理結果正確。以此能夠從瀏覽器緩存、輸入url回車、刷新頁面以及強制刷新等方面展開緩存方面的講解。
一、2採用二進制而非文本格式,二進制協議解析起來更高效。
二、採用多路複用,即爲同一個tcp鏈接上能夠創建多個http鏈接,那樣的話,咱們雪碧圖就沒有必要了。
三、使用報文頭壓縮,下降了開銷。
4.可讓服務器主動向瀏覽器推送消息,支持服務端推送,也就是服務端能夠對客戶端有多個響應。
1 、GET把參數包含在URL中,POST經過request body傳遞參數。
二、GET在瀏覽器回退時是無害的,而POST會再次提交請求。 GET產生的URL地址能夠被Bookmark,而POST不能夠。 GET請求會被瀏覽器主動cache,而POST不會,除非手動設置。 GET請求只能進行url編碼,而POST支持多種編碼方式。 GET請求參數會被完整保留在瀏覽器歷史記錄裏,而POST中的參數不會被保留。 GET請求在URL中傳送的參數是有長度限制的,而POST麼有。 對參數的數據類型,GET只接受ASCII字符,而POST沒有限制。 GET比POST更不安全,由於參數直接暴露在URL上,因此不能用來傳遞敏感信息。 GET參數經過URL傳遞,POST放在Request body中。
三、GET和POST是什麼?HTTP協議中的兩種發送請求的方法。
四、HTTP是什麼?HTTP是基於TCP/IP的關於數據如何在萬維網中如何通訊的協議。五、HTTP的底層是TCP/IP。因此GET和POST的底層也是TCP/IP,也就是說,GET/POST都是TCP連接。GET和POST能作的事情是同樣同樣的。你要給GET加上request body,給POST帶上url參數,技術上是徹底行的通的。
六、在我大萬維網世界中,還有另外一個重要的角色:運輸公司。不一樣的瀏覽器(發起http請求)和服務器(接受http請求)就是不一樣的運輸公司。 雖然理論上,你能夠在車頂上無限的堆貨物(url中無限加參數)。可是運輸公司可不傻,裝貨和卸貨也是有很大成本的,他們會限制單次運輸量來控制風險,數據量太大對瀏覽器和服務器都是很大負擔。業界不成文的規定是,(大多數)瀏覽器一般都會限制url長度在2K個字節,而(大多數)服務器最多處理64K大小的url。超過的部分,恕不處理。若是你用GET服務,在request body偷偷藏了數據,不一樣服務器的處理方式也是不一樣的,有些服務器會幫你卸貨,讀出數據,有些服務器直接忽略,因此,雖然GET能夠帶request body,也不能保證必定能被接收到哦。
七、GET產生一個TCP數據包;POST產生兩個TCP數據包。
八、對於GET方式的請求,瀏覽器會把http header和data一併發送出去,服務器響應200(返回數據);而對於POST,瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,服務器響應200 ok(返回數據)。也就是說,GET只須要汽車跑一趟就把貨送到了,而POST得跑兩趟,第一趟,先去和服務器打個招呼「嗨,我等下要送一批貨來,大家打開門迎接我」,而後再回頭把貨送過去。由於POST須要兩步,時間上消耗的要多一點,看起來GET比POST更有效。所以Yahoo團隊有推薦用GET替換POST來優化網站性能。但這是一個坑!跳入需謹慎。爲何?1. GET與POST都有本身的語義,不能隨便混用。2. 據研究,在網絡環境好的狀況下,發一次包的時間和發兩次包的時間差異基本能夠無視。而在網絡環境差的狀況下,兩次包的TCP在驗證數據包完整性上,有很是大的優勢。3. 並非全部瀏覽器都會在POST中發送兩次包,Firefox就只發送一次。
Webpack 的運行流程是一個串行的過程,從啓動到結束會依次執行如下流程,一、初始化參數:從配置文件和 Shell 語句中讀取與合併參數,得出最終的參數;二、開始編譯:用上一步獲得的參數初始化 Compiler 對象,加載全部配置的插件,執行對象的 run 方法開始執行編譯;三、肯定入口:根據配置中的 entry 找出全部的入口文件;四、編譯模塊:從入口文件出發,調用全部配置的 Loader 對模塊進行翻譯,再找出該模塊依賴的模塊,再遞歸本步驟直到全部入口依賴的文件都通過了本步驟的處理;五、完成模塊編譯:在通過第4步使用 Loader 翻譯完全部模塊後,獲得了每一個模塊被翻譯後的最終內容以及它們之間的依賴關係;六、輸出資源:根據入口和模塊之間的依賴關係,組裝成一個個包含多個模塊的 Chunk,再把每一個 Chunk 轉換成一個單獨的文件加入到輸出列表,這步是能夠修改輸出內容的最後機會;七、輸出完成:在肯定好輸出內容後,根據配置肯定輸出的路徑和文件名,把文件內容寫入到文件系統。在以上過程當中,Webpack 會在特定的時間點廣播出特定的事件,插件在監聽到感興趣的事件後會執行特定的邏輯,而且插件能夠調用 Webpack 提供的 API 改變 Webpack 的運行結果。
編寫過webpack插件嗎
一、Webpack 經過 Plugin 機制讓其更加靈活,以適應各類應用場景。 在 Webpack 運行的生命週期中會廣播出許多事件,Plugin 能夠監聽這些事件,在合適的時機經過 Webpack 提供的 API 改變輸出結果。二、Webpack 啓動後,在讀取配置的過程當中會先執行 new BasicPlugin(options) 初始化一個 BasicPlugin 得到其實例。 在初始化 compiler 對象後,再調用 basicPlugin.apply(compiler) 給插件實例傳入 compiler 對象。 插件實例在獲取到 compiler 對象後,就能夠經過 compiler.plugin(事件名稱, 回調函數) 監聽到 Webpack 廣播出來的事件。 而且能夠經過 compiler 對象去操做 Webpack。三、在開發 Plugin 時最經常使用的兩個對象就是 Compiler 和 Compilation,它們是 Plugin 和 Webpack 之間的橋樑。 Compiler 和 Compilation 的含義以下:Compiler 對象包含了 Webpack 環境全部的的配置信息,包含 options,loaders,plugins 這些信息,這個對象在 Webpack 啓動時候被實例化,它是全局惟一的,能夠簡單地把它理解爲 Webpack 實例;Compilation 對象包含了當前的模塊資源、編譯生成資源、變化的文件等。當 Webpack 以開發模式運行時,每當檢測到一個文件變化,一次新的 Compilation 將被建立。Compilation 對象也提供了不少事件回調供插件作擴展。經過 Compilation 也能讀取到 Compiler 對象。四、Compiler 和 Compilation 的區別在於:Compiler 表明了整個 Webpack 從啓動到關閉的生命週期,而 Compilation 只是表明了一次新的編譯。五、開發插件時須要注意:只要能拿到 Compiler 或 Compilation 對象,就能廣播出新的事件,因此在新開發的插件中也能廣播出事件,給其它插件監聽使用、傳給每一個插件的 Compiler 和 Compilation 對象都是同一個引用。也就是說在一個插件中修改了 Compiler 或 Compilation 對象上的屬性,會影響到後面的插件、有些事件是異步的,這些異步的事件會附帶兩個參數,第二個參數爲回調函數,在插件處理完任務時須要調用回調函數通知 Webpack,纔會進入下一處理流程。
開發過webpack loader麼
一、一個 Loader 的職責是單一的,只須要完成一種轉換。 若是一個源文件須要經歷多步轉換才能正常使用,就經過多個 Loader 去轉換。 在調用多個 Loader 去轉換一個文件時,每一個 Loader 會鏈式的順序執行, 第一個 Loader 將會拿到需處理的原內容,上一個 Loader 處理後的結果會傳給下一個接着處理,最後的 Loader 將處理後的最終結果返回給 Webpack。二、因此,在你開發一個 Loader 時,請保持其職責的單一性,你只需關心輸入和輸出。
以上問題包括但不全面對於此次杭州的求職。總的來講,你的簡歷就是你給面試官的考綱,因此簡歷必定要真實,及時面試過程當中遇到不會的題目,也要沉着冷靜思考,不會也要主動認可,而後最好可以提出本身的思考和猜想。千萬別不懂裝懂!千萬別不懂裝懂!千萬別不懂裝懂!
前端,我的仍是以爲基礎很重要,從基礎到框架,從框架就到原理,從原理到源碼,一步一腳印。必定要自信,直面面試官,表現出本身最好的狀態。同事別太咄咄逼人,必定要尊敬面試官,禮貌。
最後,仍是但願每個求職者,都可以進入本身如願以償的公司拿到心儀的offer~
ps:如若文章有不當之處,歡迎你們指正。謝謝~
關注公衆號: 【全棧前端精選】 每日獲取好文推薦。
公衆號內回覆 【1】,加入全棧前端學習羣,一塊兒交流。