前端面試常見考題的解題技巧(1-2 年)
在這篇文章中,我深入探討了網頁生命週期的各個階段,從用戶輸入網址到網頁結束,並解釋了如何通過各種前端技術來處理和優化這一過程。我也提到了如何使用不同的 HTTP 方法來執行 CRUD 操作,以及跨瀏覽器兼容性問題的解決方案。此外,我還討論了如何運用 CSS 盒模型來改善頁面布局,以及動畫的實現和性能優化技巧。
1. 生命週期
- 輸入網址或點擊超連結
- 瀏覽器向伺服器送出 request
- 伺服器回傳回應頁面(HTML, CSS, 和 JavaScript 檔案)
- 瀏覽器解析回應頁面,建置頁面
- 解析 HTML 並建立 DOM
- 執行 JavaScript 程式,遇到
<script>
這個特殊元素時,瀏覽器會停止解析 DOM 並執行裡面的 JavaScript 程式。
- 瀏覽器監看 event queue,處理互動事件
- 使用者關閉網頁,結束生命週期
沒用前端框架前我們都是直接操作 DOM,這種開發模式下,是沒有生命週期這個概念的
Vue、React 是前端框架,他們提供了一種新的開發理念:在框架下,每個頁面,頁面上的一個部分都是一個組件或者實例,這個實例都是由 JavaScript 創造出來的。這些個實例具有創建,掛載,更新,銷毀的生命週期。
Vue、React 的 SPA(單頁面應用)其實非常類似於遊戲開發,頁面就是遊戲中的場景,裡面的每一個組件就是遊戲中的節點。
遊戲中,節點還可以由預製資源生成。前端框架中,組件也可以繼承一個原始的組件。一個預製資源,我們可以生成好多個節點,他們彼此獨立。一個組件,我們可以多次引用,他們彼此獨立。我們可以方便的複用。
舉個例子:我們畫面中有無數個彩色的小球,我們可以定義一個小球類,每次生產小球,給他傳入不同的顏色,大小就可以了,然後生產出這無數個小球,而不用每次重新定義小球共同的屬性,動作。其中的每個小球,都有自己的生命週期,他們創建,掛載,銷毀。並且在他們每個生命週期裡,我們可以做一些自定義的事情,在各自生命週期到達的時候,可以自動去做。其實就是觸發回調。
2. HTTP Method
最常見的有 CRUD
- 創建 (Create): POST Method
- 讀取 (Read): GET Method
- 更新 (Update): PUT Method
- 刪除 (Delete): DELETE Method
至於全部有
- GET:向指定的資源發出「顯示」請求
- POST:向指定資源提交資料,並且 Body 中可帶傳輸的資料
- PUT:上傳或取代指定的資源
- DELETE:刪除指定的資源
- HEAD:與 GET 相似,但只會取得標頭與 HTTP 狀態
- CONNECT:通常用在 Proxy
- OPTIONS:回傳這個伺服器支援的所有 HTTP Method
- TRACE:回傳收到的請求內容
3. 跨瀏覽器相關問題
- 手動添加瀏覽器前綴 postcss
- 在 gulp / wepback 安裝 PostCSS 的 Autoprefixer 外掛
※ precss: 從 SASS 被轉成 CSS 的過程
4. Box Model
所有 HTML 元素都可以視為方框。在 CSS 中,在談論設計和佈局時,會使用術語盒模型或框模型。 CSS 盒模型 box model 實質上是一個包圍每個 HTML 元素的框。
預設是 Box-sizing: context-box
在這種盒模型下,我們所說的元素的 width ,實際上只包含 content。
盒子總寬度 = margin + border + padding + width
5. animation 的參數設定
animation:name duration | timing-function | delay | iteration-count | direction | fill-mode | play-state;
- name
- 動畫名稱
- duration
- 動畫持續時間,預設 0,單位 s 或 ms
- delay
- 動畫延遲播放時間,預設 0,單位 s 或 ms
- iteration-count
- 動畫播放次數,預設 1
其他還有 infinite
- 動畫播放次數,預設 1
- timing-function
- 動畫加速度函式,預設 ease
其他還有: linear、ease-in、ease-out、ease-in-out
step-start、step-end、steps(int,start/end)、cubic-bezier(n,n,n,n)
- 動畫加速度函式,預設 ease
- direction
- 動畫播放方向,預設 normal其他還有 reverse、alternate、alternate-reverse
- fill-mode
- 動畫播放前後模式,預設 none其他還有 forwards、backwards、both
- play-state
- 動畫播放或暫停狀態,預設 running
其他還有 paused
- 動畫播放或暫停狀態,預設 running
Codepen 連結
div {
width:50px;
height:50px;
position:absolute;
animation: boison 5s;
}
@keyframes boison{
0%{
left:0;
background:#f00;
}
50%{
left:100px;
background:#00f;
}
100%{
left:200px;
background:#000;
}
}
6. 監聽捕獲 capture 階段設定
- type
- 事件種類,e.g. click, mouseenter, keydown, etc.可參考:Event reference
- listener
- 當指定類型的事件發生時,接收通知的對象
- options
- 監聽對象的事件監聽器特徵
- capture
- 如果設為true,事件會在捕捉階段觸發listener,預設false
- once
- 如果設為true,在觸發監聽事件後,事件監聽器會被移除
- passive
- 如果為true,則表示監聽器指定的函數(listener)將永遠不會調用
preventDefault()
- 如果為true,則表示監聽器指定的函數(listener)將永遠不會調用
- capture
- 監聽對象的事件監聽器特徵
document.queryselector("div").addEventListener('click', function() {
capture: true,
once: false
}));
7. 簡單理解 Webpack
Webpack 是一個模組整合工具 module bundler
Webpack 是一個非常全能的工具,它提供了許多功能,像是打包你的檔案讓其能在網頁運作的同時也優化你的程式碼,讓你有更高效率 & 超快的網頁。
Webpack 運作的方式是透過指定一個單一檔案作為你的進入點。
這個檔案會是 tree 的 root,然後你每次 require 一個檔案從其他檔案並把它加入到 tree,當你執行 Webpack,所有的檔案和 module 都會被 bundle 成一個檔案。
Webpack 的功能
- 將你的 js 檔案 Bundle 變成單一的檔案
- 讓你可以撰寫模組化的 JavaScript,但是你不需要 include 每個 JavaScript