當前位置:首頁 » 網頁前端 » 前端重排
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

前端重排

發布時間: 2022-10-24 03:59:19

A. 前端學習筆記style,currentStyle,getComputedStyle的區別和用法

想必大家都知道,JavaScrip是全棧開發語言,瀏覽器,手機,伺服器端都可以看到JS的身影。 本文會分享一些高效的JavaScript的最佳實踐,提高大家對JS的底層和實現原理的理解。 數據存儲 計算機學科中有一個經典問題是通過改變數據存儲的位置來獲得最佳的讀寫性能,在JavaScript中,數據存儲的位置會對代碼性能產生重大影響。 – 能使用{}創建對象就不要使用new Object,能使用[]創建數組就不要使用new Array。JS中字面量的訪問速度要高於對象。 – 變數在作用域鏈中的位置越深,訪問所需實踐越長。對於這種變數,可以通過緩存使用局部變數保存起來,減少對作用域鏈訪問次數 – 使用點表示法(object.name)和操作符(object[name])操作並沒有太多區別,只有Safari會有區別,點始終更快 循環 在JS中常見的循環有下面幾種: for(var i = 0; i < 10; i++) { // do something} for(var prop in object) { // for loop object} [1,2].forEach(function(value, index, array) { // 基於函數的循環}) 毋庸質疑,第一種方式是原生的,性能消耗最低的,速度也最快。第二種方式for-in每次迭代都回產生更多的開銷(局部變數),它的速度只有第一種 的1/7 第三種方式明顯提供了更便利的循環方式,但是他的速度只有普通循環的1/8。所以可以根據自己項目情況,選擇合適的循環方式。 事件委託 試想一下頁面上每一個A標簽添加一個事件,我們會不會給每一個標簽都添加一個onClick呢。 當頁面中存在大量元素都需要綁定同一個事件處理的時候,這種情況可能會影響性能。每綁定一個事件都加重了頁面或者是運行期間的負擔。對於一個富前端的應 用,交互重的頁面上,過多的綁定會佔用過多內存。 一個簡單優雅的方式就是事件委託。它是基於事件的工作流:逐層捕獲,到達目標,逐層冒泡。既然事件存在冒泡機制,那麼我們可以通過給外層綁定事件,來處理 所有的子元素出發的事件。 document.getElementById('content').onclick = function(e) { e = e window.event; var target = e.target e.srcElement; //如果不是 A標簽,我就退出 if(target.nodeNmae !=== 'A') { return } //列印A的鏈接地址 console.log(target.href) } 重繪與重排 瀏覽器下載完HTMl,CSS,JS後會生成兩棵樹:DOM樹和渲染樹。 當Dom的幾何屬性發生變化時,比如Dom的寬高,或者顏色,position,瀏覽器需要重新計算元素的幾何屬性,並且重新構建渲染樹,這個過程稱之為重繪重排。 bodystyle = document.body.style; bodystyle.color = red; bodystyle.height = 1000px; bodystyke.width = 100%; 上述方式修改三個屬性,瀏覽器會進行三次重排重繪,在某些情況下,減少這種重排可以提高瀏覽器渲染性能。 推薦方式如下,只進行一次操作,完成三個步驟: bodystyle = document.body.style; bodystyle.cssText 'color:red;height:1000px;width:100%'; JavaScript載入 IE8,Firefox3.5,Chrome2都允許必行下載JavaScript文件。所以<script>不會阻塞其他標簽下載。 遺憾的是,JS下載過程依然會阻塞其他資源的下載,比如圖片。盡管最新的瀏覽器通過允許並行下載提高了性能,但是腳本阻塞任然是一個問題。 因此,推薦將所有的<script>標簽放在<body>標簽的底部,以盡量減少對整個頁面渲染的影響,避免用戶看到一片空白 JS文件高性能部署 既然大家已經知道多個<script>標簽會影響頁面渲染速度,那麼就不難理解「減少頁面渲染所需的 HTTP」是網站提速的一條經典法則。 所以,在產品環境下合並所有的JS文件會減少請求數,從而加快頁面渲染速度。 除了合並JS文件,我們還可以壓縮JS文件。壓縮是指將文件中與運行無關的部分進行剝離。剝離內容包括空白字元,和注釋。改過程通常可以將文件大小減半。 還有一些壓縮工具會將局部變數的長度減小,比如: var myName = "foo" + "bar"; //壓縮後變成 var a = "foobar"; 緩存JS文件 緩存HTTP組件能極大提高網站回訪的用戶體驗。Web伺服器通過「Expires HTTP響應頭」來告訴客戶端一個資源應該緩存多長時間。當然,緩存也有自己的缺陷: 當應用升級時,你需要確保用戶下載到最新的靜態內容。這個問題可以通過改變靜態資源的文件名來解決。 你可能在產品環境看到瀏覽器引用jsapplication-20151123201212.js,這種就是以時間戳的方式保存新的JS文件,從而解決緩存不更新問題。 總結 當然,高效的JS不僅僅只有這些可以改進的地方,如果能夠減少一些性能的損耗,我們就能更高效的使用JavaScript進行開發了。

B. 如何進行前端優化

1.減少 HTTP 請求....

2.使用 HTTP2

3.使用服務端渲染

4.靜態資源使用 CDN

5.將 CSS 放在文件頭部,JavaScript 文件放 ...

6.使用字體圖標 iconfont 代替圖片圖標

7.善用緩存,不重復載入相同的資源

8.壓縮文件

9.圖片優化

(1).圖片延遲載入

(2). 響應式圖片

(3). 調整圖片大小

(4). 降低圖片質量

(5). 盡可能利用 CSS3 效果代替圖片

(6). 使用 webp 格式的圖片

10. 通過 webpack 按需載入代碼,提取第三庫代碼,減少 ES6 轉為 ES5 的冗餘代碼

11. 減少重繪重排

12. 使用事件委託

13. 注意程序的局部性

14. if-else 對比 switch

15. 查找表

16. 避免頁面卡頓

17. 使用 requestAnimationFrame 來實現視覺變化

18. 使用 Web Workers

19. 使用位操作

20. 不要覆蓋原生方法

21. 降低 CSS 選擇器的復雜性

(1). 瀏覽器讀取選擇器,遵循的原則是從選擇器的右邊到左邊讀取。

(2). CSS 選擇器優先順序

22. 使用 flexbox 而不是較早的布局模型

23. 使用 transform 和 opacity 屬性更改來實現動畫

24. 合理使用規則,避免過度優化

性能優化主要分為兩類:

    • 載入時優化

    • 運行時優化

C. 整理涵蓋很全很廣的前端知識點

HTML、CSS相關

html5新特性、語義化

瀏覽器渲染機制、重繪、重排

網頁生成過程:

重排(也稱迴流): 當 DOM 的變化影響了元素的幾何信息( DOM 對象的位置和尺寸大小),瀏覽器需要重新計算元素的幾何屬性,將其安放在界面中的正確位置,這個過程叫做重排。 觸發:

重繪: 當一個元素的外觀發生改變,但沒有改變布局,重新把元素外觀繪制出來的過程,叫做重繪。 觸發:

重排優化建議:

transform 不重繪,不迴流 是因為 transform 屬於合成屬性,對合成屬性進行 transition/animate 動畫時,將會創建一個合成層。這使得動畫元素在一個獨立的層中進行渲染。當元素的內容沒有發生改變,就沒有必要進行重繪。瀏覽器會通過重新復合來創建動畫幀。

css盒子模型

所有 HTML 元素可以看作盒子,在CSS中, "box model" 這一術語是用來設計和布局時使用。 CSS 盒模型本質上是一個盒子,封裝周圍的 HTML 元素,它包括:邊距,邊框,填充,和實際內容。 盒模型允許我們在其它元素和周圍元素邊框之間的空間放置元素。

css樣式優先順序

!important>style>id>class

什麼是BFC?BFC的布局規則是什麼?如何創建BFC?BFC應用?

BFC 是 Block Formatting Context 的縮寫,即塊格式化上下文。 BFC 是CSS布局的一個概念,是一個環境,裡面的元素不會影響外面的元素。 布局規則:Box是CSS布局的對象和基本單位,頁面是由若干個Box組成的。元素的類型和display屬性,決定了這個Box的類型。不同類型的Box會參與不同的 Formatting Context 。 創建:浮動元素 display:inline-block position:absolute 應用: 1.分屬於不同的 BFC 時,可以防止 margin 重疊 2.清除內部浮動 3.自適應多欄布局

DOM、BOM對象

BOM(Browser Object Model) 是指瀏覽器對象模型,可以對瀏覽器窗口進行訪問和操作。使用 BOM,開發者可以移動窗口、改變狀態欄中的文本以及執行其他與頁面內容不直接相關的動作。 使 JavaScript 有能力與瀏覽器"對話"。 DOM (Document Object Model) 是指文檔對象模型,通過它,可以訪問 HTML 文檔的所有元素。 DOM 是 W3C (萬維網聯盟)的標准。 DOM 定義了訪問 HTML 和 XML 文檔的標准: "W3C 文檔對象模型(DOM)是中立於平台和語言的介面,它允許程序和腳本動態地訪問和更新文檔的內容、結構和樣式。" W3C DOM 標准被分為 3 個不同的部分:

什麼是 XML DOM ? XML DOM 定義了所有 XML 元素的對象和屬性,以及訪問它們的方法。 什麼是 HTML DOM? HTML DOM 定義了所有 HTML 元素的對象和屬性,以及訪問它們的方法。

JS相關

js數據類型、typeof、instanceof、類型轉換

閉包(高頻)

閉包是指有權訪問另一個函數作用域中的變數的函數 ——《JavaScript高級程序設計》

當函數可以記住並訪問所在的詞法作用域時,就產生了閉包,

即使函數是在當前詞法作用域之外執行 ——《你不知道的JavaScript》

原型、原型鏈(高頻)

原型: 對象中固有的 __proto__ 屬性,該屬性指向對象的 prototype 原型屬性。

原型鏈: 當我們訪問一個對象的屬性時,如果這個對象內部不存在這個屬性,那麼它就會去它的原型對象里找這個屬性,這個原型對象又會有自己的原型,於是就這樣一直找下去,也就是原型鏈的概念。原型鏈的盡頭一般來說都是 Object.prototype 所以這就是我們新建的對象為什麼能夠使用 toString() 等方法的原因。

特點: JavaScript 對象是通過引用來傳遞的,我們創建的每個新對象實體中並沒有一份屬於自己的原型副本。當我們修改原型時,與之相關的對象也會繼承這一改變。

this指向、new關鍵字

this 對象是是執行上下文中的一個屬性,它指向最後一次調用這個方法的對象,在全局函數中, this 等於 window ,而當函數被作為某個對象調用時,this等於那個對象。 在實際開發中, this 的指向可以通過四種調用模式來判斷。

new

作用域、作用域鏈、變數提升

繼承(含es6)、多種繼承方式

(1)第一種是以 原型鏈的方式來實現繼承 ,但是這種實現方式存在的缺點是,在包含有引用類型的數據時,會被所有的實例對象所共享,容易造成修改的混亂。還有就是在創建子類型的時候不能向超類型傳遞參數。

(2)第二種方式是使用 借用構造函數 的方式,這種方式是通過在子類型的函數中調用超類型的構造函數來實現的,這一種方法解決了不能向超類型傳遞參數的缺點,但是它存在的一個問題就是無法實現函數方法的復用,並且超類型原型定義的方法子類型也沒有辦法訪問到。

(3)第三種方式是 組合繼承 ,組合繼承是將原型鏈和借用構造函數組合起來使用的一種方式。通過借用構造函數的方式來實現類型的屬性的繼承,通過將子類型的原型設置為超類型的實例來實現方法的繼承。這種方式解決了上面的兩種模式單獨使用時的問題,但是由於我們是以超類型的實例來作為子類型的原型,所以調用了兩次超類的構造函數,造成了子類型的原型中多了很多不必要的屬性。

(4)第四種方式是 原型式繼承 ,原型式繼承的主要思路就是基於已有的對象來創建新的對象,實現的原理是,向函數中傳入一個對象,然後返回一個以這個對象為原型的對象。這種繼承的思路主要不是為了實現創造一種新的類型,只是對某個對象實現一種簡單繼承,ES5 中定義的 Object.create() 方法就是原型式繼承的實現。缺點與原型鏈方式相同。

(5)第五種方式是 寄生式繼承 ,寄生式繼承的思路是創建一個用於封裝繼承過程的函數,通過傳入一個對象,然後復制一個對象的副本,然後對象進行擴展,最後返回這個對象。這個擴展的過程就可以理解是一種繼承。這種繼承的優點就是對一個簡單對象實現繼承,如果這個對象不是我們的自定義類型時。缺點是沒有辦法實現函數的復用。

(6)第六種方式是 寄生式組合繼承 ,組合繼承的缺點就是使用超類型的實例做為子類型的原型,導致添加了不必要的原型屬性。寄生式組合繼承的方式是使用超類型的原型的副本來作為子類型的原型,這樣就避免了創建不必要的屬性。

EventLoop

JS 是單線程的,為了防止一個函數執行時間過長阻塞後面的代碼,所以會先將同步代碼壓入執行棧中,依次執行,將非同步代碼推入非同步隊列,非同步隊列又分為宏任務隊列和微任務隊列,因為宏任務隊列的執行時間較長,所以微任務隊列要優先於宏任務隊列。微任務隊列的代表就是, Promise.then , MutationObserver ,宏任務的話就是 setImmediate setTimeout setInterval

原生ajax

ajax 是一種非同步通信的方法,從服務端獲取數據,達到局部刷新頁面的效果。 過程:

事件冒泡、捕獲(委託)

event.stopPropagation() 或者 ie下的方法 event.cancelBubble = true; //阻止事件冒泡

ES6

Vue

簡述MVVM

MVVM 是 Model-View-ViewModel 縮寫,也就是把 MVC 中的 Controller 演變成 ViewModel。Model 層代表數據模型, View 代表UI組件, ViewModel 是 View 和 Model 層的橋梁,數據會綁定到 viewModel 層並自動將數據渲染到頁面中,視圖變化的時候會通知 viewModel 層更新數據。

談談對vue生命周期的理解?

每個 Vue 實例在創建時都會經過一系列的初始化過程, vue 的生命周期鉤子,就是說在達到某一階段或條件時去觸發的函數,目的就是為了完成一些動作或者事件

computed與watch

watch 屬性監聽 是一個對象,鍵是需要觀察的屬性,值是對應回調函數,主要用來監聽某些特定數據的變化,從而進行某些具體的業務邏輯操作,監聽屬性的變化,需要在數據變化時執行非同步或開銷較大的操作時使用

computed 計算屬性 屬性的結果會被緩存,當 computed 中的函數所依賴的屬性沒有發生改變的時候,那麼調用當前函數的時候結果會從緩存中讀取。除非依賴的響應式屬性變化時才會重新計算,主要當做屬性來使用 computed 中的函數必須用 return 返回最終的結果 computed 更高效,優先使用

使用場景 computed :當一個屬性受多個屬性影響的時候使用,例:購物車商品結算功能 watch :當一條數據影響多條數據的時候使用,例:搜索數據

v-for中key的作用

vue組件的通信方式

父子組件通信

父->子 props ,子->父 $on、$emit` 獲取父子組件實例 parent、 parent 、children Ref 獲取實例的方式調用組件的屬性或者方法 Provide、inject` 官方不推薦使用,但是寫組件庫時很常用

兄弟組件通信

Event Bus 實現跨組件通信 Vue.prototype.$bus = new Vue() Vuex

跨級組件通信

$attrs、$listeners Provide、inject

常用指令

雙向綁定實現原理

當一個 Vue 實例創建時,Vue會遍歷data選項的屬性,用 Object.defineProperty 將它們轉為 getter/setter並且在內部追蹤相關依賴,在屬性被訪問和修改時通知變化。每個組件實例都有相應的 watcher 程序實例,它會在組件渲染的過程中把屬性記錄為依賴,之後當依賴項的 setter 被調用時,會通知 watcher重新計算,從而致使它關聯的組件得以更新。

v-model的實現以及它的實現原理嗎?

nextTick的實現

vnode的理解,compiler和patch的過程

new Vue後整個的流程

思考:為什麼先注入再提供呢??

答:1、首先來自祖輩的數據要和當前實例的data,等判重,相結合,所以注入數據的initInjections一定要在 InitState 的上面。2. 從上面注入進來的東西在當前組件中轉了一下又提供給後代了,所以注入數據也一定要在上面。

vm.[Math Processing Error]mount(vm.mount(vm.options.el) :掛載實例。

keep-alive的實現

作用:實現組件緩存

鉤子函數:

原理: Vue.js 內部將 DOM 節點抽象成了一個個的 VNode 節點, keep-alive 組件的緩存也是基於 VNode 節點的而不是直接存儲 DOM 結構。它將滿足條件 (pruneCache與pruneCache) 的組件在 cache 對象中緩存起來,在需要重新渲染的時候再將 vnode 節點從 cache 對象中取出並渲染。

配置屬性:

include 字元串或正則表達式。只有名稱匹配的組件會被緩存

exclude 字元串或正則表達式。任何名稱匹配的組件都不會被緩存

max 數字、最多可以緩存多少組件實例

vuex、vue-router實現原理

vuex 是一個專門為vue.js應用程序開發的狀態管理庫。 核心概念:

你怎麼理解Vue中的diff演算法?

在js中,渲染真實 DOM 的開銷是非常大的, 比如我們修改了某個數據,如果直接渲染到真實 DOM , 會引起整個 dom 樹的重繪和重排。那麼有沒有可能實現只更新我們修改的那一小塊dom而不要更新整個 dom 呢?此時我們就需要先根據真實 dom 生成虛擬 dom , 當虛擬 dom 某個節點的數據改變後會生成有一個新的 Vnode , 然後新的 Vnode 和舊的 Vnode 作比較,發現有不一樣的地方就直接修改在真實DOM上,然後使舊的 Vnode 的值為新的 Vnode 。

diff 的過程就是調用 patch 函數,比較新舊節點,一邊比較一邊給真實的 DOM 打補丁。在採取 diff 演算法比較新舊節點的時候,比較只會在同層級進行。 在 patch 方法中,首先進行樹級別的比較 new Vnode 不存在就刪除 old Vnode old Vnode 不存在就增加新的 Vnode 都存在就執行diff更新 當確定需要執行diff演算法時,比較兩個 Vnode ,包括三種類型操作:屬性更新,文本更新,子節點更新 新老節點均有子節點,則對子節點進行 diff 操作,調用 updatechidren 如果老節點沒有子節點而新節點有子節點,先清空老節點的文本內容,然後為其新增子節點 如果新節點沒有子節點,而老節點有子節點的時候,則移除該節點的所有子節點 老新老節點都沒有子節點的時候,進行文本的替換

updateChildren 將 Vnode 的子節點Vch和oldVnode的子節點oldCh提取出來。 oldCh和vCh 各有兩個頭尾的變數 StartIdx和EndIdx ,它們的2個變數相互比較,一共有4種比較方式。如果4種比較都沒匹配,如果設置了 key ,就會用 key 進行比較,在比較的過程中,變數會往中間靠,一旦 StartIdx>EndIdx 表明 oldCh和vCh 至少有一個已經遍歷完了,就會結束比較。

你都做過哪些Vue的性能優化?

你知道Vue3有哪些新特性嗎?它們會帶來什麼影響?

更小巧、更快速 支持自定義渲染器 支持搖樹優化:一種在打包時去除無用代碼的優化手段 支持Fragments和跨組件渲染

模板語法99%保持不變 原生支持基於class的組件,並且無需藉助任何編譯及各種stage階段的特性 在設計時也考慮TypeScript的類型推斷特性 重寫虛擬DOM 可以期待更多的編譯時提示來減少運行時的開銷 優化插槽生成 可以單獨渲染父組件和子組件 靜態樹提升 降低渲染成本 基於Proxy的觀察者機制 節省內存開銷

檢測機制 更加全面、精準、高效,更具可調試式的響應跟蹤

實現雙向綁定 Proxy 與 Object.defineProperty 相比優劣如何?

React

1、react中key的作用,有key沒key有什麼區別,比較同一層級節點什麼意思?

2、你對虛擬dom和diff演算法的理解,實現render函數

虛擬DOM 本質上是 JavaScript 對象,是對 真實DOM 的抽象表現。 狀態變更時,記錄新樹和舊樹的差異 最後把差異更新到真正的 dom 中 render函數:

3、React組件之間通信方式?

Context 提供了一個無需為每層組件手動添加 props ,就能在組件樹間進行數據傳遞的方法.如果你只是想避免層層傳遞一些屬性,組件組合( component composition )有時候是一個比 context 更好的解決方案。 5. 組件組合缺點:會使高層組件變得復雜

4、如何解析jsx

5、生命周期都有哪幾種,分別是在什麼階段做哪些事情?為什麼要廢棄一些生命周期?

componentWillMount、componentWillReceiveProps、componentWillUpdate在16版本被廢棄,在17版本將被刪除,需要使用UNSAVE_前綴使用,目的是向下兼容。

6、關於react的優化方法

使用return null而不是CSS的display:none來控制節點的顯示隱藏。保證同一時間頁面的DOM節點盡可能的少。

不要使用數組下標作為key 利用 shouldComponentUpdate 和 PureComponent 避免過多 render function ; render 裡面盡量減少新建變數和bind函數,傳遞參數是盡量減少傳遞參數的數量。 盡量將 props 和 state 扁平化,只傳遞 component 需要的 props (傳得太多,或者層次傳得太深,都會加重 shouldComponentUpdate 裡面的數據比較負擔),慎將 component 當作 props 傳入

使用 babel-plugin-import 優化業務組件的引入,實現按需載入 使用 SplitChunksPlugin 拆分公共代碼 使用動態 import ,懶載入 React 組件

7、綁定this的幾種方式

8、對fiber的理解

9、setState是同步還是非同步的

10、Rex、React-Rex

Rex的實現流程

用戶頁面行為觸發一個 Action ,然後 Store 調用 Recer ,並且傳入兩個參數:當前 State 和收到的 Action 。 Recer 會返回新的 State 。每當 state 更新之後, view 會根據 state 觸發重新渲染。

React-Rex:

Provider :從最外部封裝了整個應用,並向 connect 模塊傳遞 store 。 Connect :

11、對高階組件的理解

高階組件是參數為組件,返回值為新組件的函數。 HOC 是純函數,沒有副作用。 HOC 在 React 的第三方庫中很常見,例如 Rex 的 connect 組件。

高階組件的作用:

12、可以用哪些方式創建 React 組件?

React.createClass()、ES6 class 和無狀態函數

13、 React 元素與組件的區別?

組件是由元素構成的。元素數據結構是普通對象,而組件數據結構是類或純函數。

Vue與React對比?

數據流:

react 主張函數式編程,所以推崇純組件,數據不可變,單向數據流,

vue 的思想是響應式的,也就是基於是數據可變的,通過對每一個屬性建立Watcher來監聽,當屬性變化的時候,響應式的更新對應的虛擬dom。

監聽數據變化實現原理

組件通信的區別:jsx和.vue模板。

性能優化

vuex 和 rex 之間的區別?

從實現原理上來說,最大的區別是兩點:

Rex 使用的是不可變數據,而 Vuex 的數據是可變的。 Rex 每次都是用新的 state 替換舊的 state ,而 Vuex 是直接修改

Rex 在檢測數據變化的時候,是通過 diff 的方式比較差異的,而 Vuex 其實和Vue的原理一樣,是通過 getter/setter 來比較的(如果看 Vuex 源碼會知道,其實他內部直接創建一個 Vue 實例用來跟蹤數據變化)

瀏覽器從輸入url到渲染頁面,發生了什麼?

網路安全、HTTP協議

TCP UDP 區別

Http和Https區別(高頻)

GET和POST區別(高頻)

理解xss,csrf,ddos攻擊原理以及避免方式

XSS ( Cross-Site Scripting , 跨站腳本攻擊 )是一種代碼注入攻擊。攻擊者在目標網站上注入惡意代碼,當被攻擊者登陸網站時就會執行這些惡意代碼,這些腳本可以讀取 cookie,session tokens ,或者其它敏感的網站信息,對用戶進行釣魚欺詐,甚至發起蠕蟲攻擊等。

CSRF ( Cross-site request forgery ) 跨站請求偽造 :攻擊者誘導受害者進入第三方網站,在第三方網站中,向被攻擊網站發送跨站請求。利用受害者在被攻擊網站已經獲取的注冊憑證,繞過後台的用戶驗證,達到冒充用戶對被攻擊的網站執行某項操作的目的。

XSS避免方式:

CSRF 避免方式:

DDoS 又叫分布式拒絕服務,全稱 Distributed Denial of Service ,其原理就是利用大量的請求造成資源過載,導致服務不可用。

D. Web前端工程師需要掌握的知識點有哪些

今天小編要跟大家分享的文章是關於Web前端工程師需要掌握的知識點有哪些?想要成為一名優秀的web前端工程師掌握必要的技能是必不可少的。為了幫助大家更好的成為web前端工程師,小編為大家整理了一些前端工程師需要掌握的知識點,下面我們一起來看一看吧!

1、HTML部分


首先是要掌握一些常用標簽的使用和他們的各個屬性,這些常用的標簽我總結了一下有以下這些:


§html:頁面的根元素。


§head:頁面的頭部標簽,是所有頭部元素的容器。


§body:頁面的主體標簽,頁面展現的內容就放置在這裡面。


§title:頁面的標題。


§meta:位於文檔的頭部,提供頁面的元信息,包括關鍵字、描述等等。


§link:定義文檔與外部資源的關系,最常用的用途就是引入樣式表。


§script:腳本標簽,可以把js腳本代碼放置在這個標簽內,也可以使用這個標簽的src屬性引入一個外部標簽。


§style:樣式標簽,可以把css代碼寫在這個標簽中。


§a:超鏈接,href屬性代表要鏈接到的地方,target屬性代表打開方式。


§img:圖像標簽,src屬性表示圖片的位置。


§form:表單元素,它內部的input、select、textarea等標簽都是比較重要的。


§div:定義文檔中的分區或節,可以使用div來進行頁面的布局等操作。


§
另外還有ul、li、p、button、iframe、p、table等標簽也很常用,nav、section、article、header、aside、footer等語義化標簽也需要了解一下。


除了要了解上面這一些標簽之外,還需要對一些新的HTML5的API有一定的了解:


·audio、video標簽。


·Canvas:定義圖形,比如圖表和其他圖像。


·input標簽的accept屬性,email、phone、url等類型。


·getElementByClassName根據class名來獲取一個元素結點。


·Multiplefileselection多文件選擇屬性。


·html的import、template


·process標簽,webGL等內容。


還有一些要知道的知識點:


1.doctype的作用。2.unicode、utf8等編碼的原理和區別。3.如何進行頁面性能優化。4.png、jpg、webp、gif等圖片格式的不同的優勢。5.HTML行內元素與塊級元素的區別。6.移動web端開發常用head標簽。7.web語義化。8.瀏覽器中的緩存原理


2、CSS部分


關於css這一塊,我的看法就是網上下載一個chm格式的css的參考手冊,然後根據手冊裡面寫的一個個的都敲一下。


css大體分為下面這幾塊知識點:


①定位布局


1.position屬性的7個值(static|relative|absolute|fixed|center|page|
sticky)分別有什麼作用和不同?


2.實現品字形布局或者是三欄布局(左右寬度固定,中間適應屏幕)。


3.浮動與清除浮動的方法,flex布局,grid布局。


②盒子模型


1.margin、padding、border這三個屬性。


2.伸縮盒相關內容。


3.Multi-columnLayoutMole多列布局模型。


③文本字體


1.強制換行與不換行,清除空白。


2.文本對齊、大小(如何設置chrome小於12px的字體)、縮進、轉換。


3.單位(em、rem、px等),顏色(rgb、rgba,hls)。


④變換、過渡和動畫


1.transform的各種取值的作用與兼容性。


2.transition過渡的動畫類型,貝塞爾曲線的原理。


3.animation動畫的各種設置,@keyframes規則。


4.瀏覽器的重繪與重排。


⑤選擇器


1.選擇器的分類,權值和優先順序。


2.有哪些屬性可以被繼承,哪些屬性沒法繼承。


3.偽類和偽元素分別是什麼,有什麼作用。


上面這些都是基礎的東西,除了這些基礎的內容之外需要了解Less、Sass、stylus等css預處理器,這將會大幅度提升你的css開發效率,也需要了解一下Autoprefixer、PostCSS等css後處理器。


3、JavaScript部分


在這里就不說js的基礎知識了,我把js按照語法的層次和使用的層次分為了兩大塊。


按照語法的層次來說:


首先是javascript的面向對象方面的內容:在javascript中實現封裝、繼承和多態。


①封裝:在js中可以通過閉包、作用域和作用域鏈來實現封裝,ES6的const、let的作用。



繼承:基於原型鏈的繼承、基於構造函數的繼承、組合式繼承、寄生式繼承等,外加ES6的class關鍵字,prototype和__proto__。



多態:在javascript中多態是使用arguments來實現的,關於arguments會引申出來很多內容:1.arguments的caller、callee等方法的作用。2.方法的apply和call的作用和不同。3.使用Array.prototype.slice.call來把一個數組對象轉化為數組。4.array的各種方法,如shift、splice、push、filter、map、rece、forEach等等。


然後是Js的設計模式,比如說那三種工廠模式啊,建造者模式啊等等。


最後是在不同情況下的this分別都代表什麼。


按照使用的層次來說:


首先最主要的就是ajax,ajax的原理,ajax跨域的方法:jsonp、使用iframe的location.hash、postMessageAPI、websocket、伺服器代理等等。


然後是tcp協議、udt協議以及http協議的協議頭、狀態碼等內容。瀏覽器的緩存,客戶端存儲方面的內容:localstorage、sessionstorage、indexDB、cookie等等。


最後是一些新的js的API,例如文件讀取(fileReader)、fetch、Promise、Web
Sockets等等內容,可以去caniuse上面看一下有哪些新的東西。


上面我所說的這些只是一些比較籠統的概念,把前端html、css和javascript所需要掌握的部分內容列舉了一下,在前端領域還有很多需要我們知道的知識,這需要大家在學習工作的過程中去自己總結。


以上就是小編今天為大家分享的關於Web前端工程師需要掌握的知識點有哪些的文章,希望本篇文章能夠對正在學習web前端知識的小夥伴們有所幫。想要了解更多web前端相關知識的小夥伴們記得關注北大青鳥web培訓官網。最後祝願小夥伴們工作順利!


E. Web前端性能優化的實用技巧匯總

今天小編要跟大家分享的文章是關於Web前端性能優化的實用技巧匯總。javascript在瀏覽器中運行的性能,可以認為是開發者所面臨的最嚴重的可用性問題。這個問題因為javascript的阻塞性而變得復雜,事實上,多數瀏覽器使用單一進程來處理用戶界面和js腳本執行,所以同一時刻只能做一件事。js執行過程耗時越久,瀏覽器等待響應的時間越長。

一.提高載入性能


1.IE8,FF,3.5,Safari4和Chrome都允許並行下載js文件,當script下載資源時不會阻塞其他script的下載。但是js下載仍然會阻塞其他資源的下載,如圖片。盡管腳本下載不會互相影響,但頁面仍然必須等待所有js代碼下載並執行完才能繼續。因此仍然存在腳本阻塞問題.推薦將所有js文件放在body標簽底部以減少對整個頁面的影響。


2.減少頁面外鏈腳本文件的數量將會提高頁面性能:


http請求會帶來額外的開銷,因此下載單個300k的文件將比下載10個30k的文件效率更高。


3.動態腳本載入技術:


無論何時啟動下載,文件的下載和執行都不會阻塞頁面其他進程。


functionlaodScript(url,callback){


varscript=document.createElement('script');_


_cript.type='text/javascript'__f(script.readyState){//ie


____cript.onreadystatechange=function(){_____


if(script.readyState=='loaded'||script.readyState=='complete'){_______


_cript.onreadystatechange=null;_______


callback()_____


____


__


}else{//其他瀏覽器___


script.onload=function(){_____


_allback()


___}_


}_


script.src=url;_


document.getElementsByTagName('head')[0].appendChild(script);


}
//使用


loadScript('./a.js',function(){_


loadScript('./b.js',function(){___


loadScript('./c.js',function(){_____


console.log('載入完成')___


})_


})


})


4.無阻塞載入類庫——LABjs,使用方法如下:





//鏈式調用時文件逐個下載,.wait()用來指定文件下載並執行完畢後所調用的函數


$LAB.script('./a.js')_


.script('./b.js')_


.wait(function(){__


_pp.init();


})
//為了保證執行順序,可以這么做,此時a必定在b前執行


$LAB.script('./a.js').wait()_


.script('./b.js')_


.wait(function(){___


_pp.init();


})


二.數據存取與JS性能


1.在js中,數據存儲的位置會對代碼整體性能產生重大影響。數據存儲共有4種方式:字面量,變數,數組項,對象成員。他們有著各自的性能特點。


2.訪問字面量和局部變數的速度最快,相反,訪問數組和對象相對較慢


3.由於局部變數存在於作用域鏈的起始位置,因此訪問局部變數的比訪問跨域作用變數更快


4.嵌套的對象成員會明顯影響性能,應盡量避免


5.屬性和方法在原型鏈位置越深,訪問他的速度越慢


6.通常我們可以把需要多次使用的對象成員,數組元素,跨域變數保存在局部變數中來改善js性能


三.DOM編程


1.訪問DOM會影響瀏覽器性能,修改DOM則更耗費性能,因為他會導致瀏覽器重新計算頁面的幾何變化。<通常的做法是減少訪問DOM的次數,把運算盡量留在JS這一端。


註:如過在一個對性能要求比較高的操作中更新一段HTML,推薦使用innerHTML,因為它在絕大多數瀏覽器中運行的都很快。但對於大多數日常操作而言,並沒有太大區別,所以你更應該根據可讀性,穩定性,團隊習慣,代碼風格來綜合決定使用innerHTML還是createElement()


2.HTML集合優化


HTML集合包含了DOM節點引用的類數組對象,一直與文檔保持連接,每次你需要最新的信息時,都會重復執行查詢操作,哪怕只是獲取集合里元素的個數。


①_優化一——集合轉數組collToArr


functioncollToArr(coll){_


for(vari=0,a=[],len=coll.length;i

a._ush(coll[i]);


__


returna


}


②緩存集合length


③訪問集合元素時使用局部變數(即將重復的集合訪問緩存到局部變數中,用局部變數來操作)


3.遍歷DOM


①使用只返回元素節點的API遍歷DOM,因為這些API的執行效率比自己實現的效率更高:


td{border:1pxsolid#ccc;padding:5px;margin:auto;}
td>p{text-align:left;}
td>pspan{text-align:center;display:block;}


屬性名
被替代屬性


children
childNodes


childElementCount
childNodes.length


firstElementChild
firstChild


lastElementChild
lastChild


nextElementSibling
nextSibling


previousElementSibling
previousSibling


_諮≡衿_PI——querySelectorAll()


querySelectorAll()方法使用css選擇器作為參數並返回一個NodeList——包含著匹配節點的類數組對象,該方法不會返回HTML集合,因此返回的節點不會對應實時文檔結構,著也避免了HTML集合引起的性能問題。


let_rr=_ocument.querySelectorAll('div.warning,_iv.notice>_')


4.重繪和重排


瀏覽器在下載完頁面的所有組件——html,js,css,圖片等之後,會解析並生成兩個內部數據結構——_OM樹,渲染樹.一旦DOM樹和渲染樹構建完成,瀏覽器就開始繪制頁面元素(paint).


①重排發生的條件:


添加或刪除可見的DOM元素位置變化元素尺寸改變內容改變頁面渲染器初始化瀏覽器窗口尺寸變化出現滾動條時會觸發整個頁面的重排_嘏瘧囟ㄖ鞀


5.渲染樹變化的排列和刷新


大多數瀏覽器通過隊列化修改並批量執行來優化重排過程,然而獲取布局信息的操作會導致隊列強制刷新。


offsetTop,offsetWidth...


scrollTop,scrollHeight...


clientTop,clientHeight...


getComputedStyle()


一些優化建議:將設置樣式的操作和獲取樣式的操作分開:


//設置樣式


body.style.color='red'


body.style.fontSize=པpx'


//讀取樣式


letcolor=body.style.color


let_ontSize=_ody.style.fontSize


另外,獲取計算屬性的兼容寫法:


functiongetComputedStyle(el){_


varcomputed=(document.body.currentStyle?el.currentStyle:document.defaultView.getComputedStyle(el,'');_


returncomputed


}


6.最小化重繪和重排


①.批量改變樣式


/*使用cssText
*/el.style.cssText='border-left:1px;_order-right:2px;_adding:20px'


②.批量修改dom的優化方案——使元素脫離文檔流-對其應用多重改變-把元素帶迴文檔


functionappendDataToEl(option){


vartargetEl=option.target||document.body,___


createEl,___


data=option.data||[];_//讓容器脫離文檔流,減少重繪重排_


vartargetEl_display=targetEl.style.display;_


targetEl.style.display='none'
_


//*****創建文檔片段來優化Dom操作****_


varfragment=document.createDocumentFragment();_//給元素填充數據_


for(vari=0,max=data.length;i

createEl=
document.createElement(option.createEl);___


for(varitemindata[i]){_____


if(item.toString()==='text'){_______


createEl.appendChild(document.createTextNode(data[i][item]));________ontinue;___________


_f(item.toString()==='html'){_______


createEl.innerHTML=item,data[i][item];_______


continue;_____


}_____


_reateEl.setAttribute(item,data[i][item]);_______


//****將填充好的node插入文檔片段****___


fragment.appendChild(createEl);___


//****將文檔片段統一插入目標容器****_


targetEl.appendChild(fragment);_


//顯示容器,完成數據填充_


targetEl.style.display=
targetEl_display;


}
//使用


varwrap=document.querySelectorAll('.wrap')[0];


vardata=[_


_name:'xujaing',text:'選景',title:'xuanfij'},_


{name:'xujaing',text:'選景',title:'xuanfij'},_


{name:'xujaing',text:'選景',title:'xuanfij'}];


appendDataToEl({_


target:wrap,_


createEl:'div',


_ata:data


});


上面的優化方法使用了文檔片段:_蔽頤前鹽牡燈尾迦氳澆詰闃惺保導噬媳惶砑擁鬧皇歉悶蔚淖詠詰悖皇瞧偽舊懟?梢允溝_om操作更有效率。


②.緩存布局信息


//緩存布局信息


letcurrent=el.offsetLeft;


current++;


el.style.left=current+'px'


if(current>300){_


stop();


}


④.慎用:hover


如果有大量元素使用:hover,那麼會降低相應速度,CPU升高


⑤.使用事件委託(通過事件冒泡實現)來減少事件處理器的數量,減少內存和處理時間


functiondelegation(e,selector,callback){_


e=e||window.event;_


vartarget=e.target||e.srcElement;
_if(target.nodeName!==selector||
target.className!==selector||target.id!==selector){___


return;


_}_


if(typeofe.preventDefault==='function'){__


_.preventDefault();___


e.stopPropagation();


}else{___


e.returnValue=false;


e.cancelBubble=true;_


}
__allback()}


四.演算法和流程式控制制


1.循環中減少屬性查找並反轉(可以提升50%-60%的性能)


//for循環


for(vari=item.length;i--){_


process(item[i]);


}


//while循環


varj=item.length;


while(j--){_


process(item[i]);


}


2.使用Duff裝置來優化循環(該方法在後面的文章中會詳細介紹)


3.基於函數的迭代(比基於循環的迭代慢)


items.forEach(function(value,index,array){__rocess(value);})


4.通常情況下switch總比if-else快,但是不是最佳方案


五.字元串和正則表達式


1.除了IE外,其他瀏覽器會嘗試為表達式左側的字元串分配更多的內存,然後簡單的將第二個字元串拷貝到他的末尾,如果在一個循環中,基礎字元串位於最左側,就可以避免重復拷貝一個逐漸變大的基礎字元串。2.使用[sS]來匹配任意字元串3.去除尾部空白的常用做法:


if(!String.prototype.trim){_


String.prototype.trim=function(){___


returnthis.replace(/^s+/,'').replace(/ss*$/,'')_


}


}


六.快速響應的用戶界面


1.瀏覽器的UI線程:用於執行javascript和更新用戶界面的進程。


2.在windows系統中定時器解析度為15毫秒,因此設置小於15毫秒將會使IE鎖定,延時的最小值建議為25ms.


3.用延時數組分割耗時任務:


functionmultistep(steps,args,callback){_


vartasks=steps.concat();
__etTimeout(function(){___


vartask=tasks.shift();___


task.apply(null,args||[]);_//調用Apply參數必須是數組
___


if(tasks.length>0){_____


setTimeout(arguments.callee,25);


___else{_____


_allback();___


__


},25);


}


4.記錄代碼運行時間批處理任務:


functiontimeProcessArray(items,process,callback){_


vartodo=item.concat();__etTimeout(function(){___


varstart=+newDate();
__o{_____


_rocess(todo.shift());___


}while(todo.length>0&&(+newDate()-start<50));
____f(todo.length>0){_____


_etTimeout(arguments.callee,25);


___else{____


_allback(items);_


}_


_,25)


}


5.使用WebWorker:它引入了一個介面,能使代碼運行且不佔用瀏覽器UI線程的時間。一個Worker由如下部分組成:


①一個navigator對象,包括app

F. Web 前端怎樣入門

方法:

第一:理清Web前端的知識結構。要想高效學習Web前端知識,首先應該搞清楚Web前端都包括哪些技術結構。Web前端開發雖然技術難度並不高,但是技術細節卻比較多,內容也比較雜。Web前端的基礎包括三大部分,包括Html、CSS和JavaScript,其中JavaScript是學習的重點,也是難點。另外,vue等框架也是需要熟練掌握的。

第二:緊跟技術發展趨勢。目前Web前端的技術發展趨勢有三個,其一是前端開發數據化;其二是前端開發高效化;其三是前端開發全棧化。前端開發數據化主要是大數據發展的影響,在大數據的推動下,Web前端逐漸涉及到了大量的數據展示任務。前端開發高效化主要體現在Web前端正在進行獨立部署,前端與後端的溝通主要通過資源介面的方式來進行。前端開發全棧化也是一個比較明顯的趨勢,比如Nodejs的應用。

第三:注重動手實踐能力的培養。學習前端開發一定要注重動手實踐能力的培養,因為前端開發的細節比較多,所以只有多操作才能逐漸熟悉。

前端開發目前被稱為「大前端」,整個前端開發也被賦予了更多的含義,包括Web前端開發、移動端開發、大數據呈現端開發以及部分後端開發任務等等。所以,想要在前端行業中走的更遠,一定要注重知識結構的豐富性。

與其他編程語言相比,前端是公認的入行門檻較低的一門語言,但依然有很多人在學習之前會問零基礎學習web前端難不難,要多久才能學會。學習的難易和時間當然是取決於學習的方式。

前端入門簡單,但是深入學習之後,還是有一定學習難度的。如果你是零基礎自學web前端的話,那麼所花費的時間與精力是不可估計的。 如果系統學習5個月的時間可以幫助你快速成長為合格的web前端工程師。

至於視頻教程,我這里有很多前端的全套教程,如果你需要的話,可以加一下我的學習交流裙裙,找我要就行了!

G. 前端面試官常問的問題有哪些

1、重繪和重排的關系:

重繪不會引起重排,但重排一定會引起重繪,一個元素的重排通常會帶來一系列的反應,甚至觸發整個文檔的重排和重繪,性能代價是高昂的。

2、重繪的概念:

重繪是一個元素外觀的改變所觸發的瀏覽器行為,例如改變visibility、outline、背景色等屬性。瀏覽器會根據元素的新屬性重新繪制,使元素呈現新的外觀。由於瀏覽器的流布局,對渲染樹的計算通常只需要遍歷一次就可以完成。

但table及其內部元素除外,它可能需要多次計算才能確定好其在渲染樹中節點的屬性值,比同等元素要多花兩倍時間,這就是我們盡量避免使用table布局頁面的原因之一。

3、觸發重排的情況:

頁面渲染初始化時;瀏覽器窗口改變尺寸;元素尺寸改變時;元素位置改變時;元素內容改變時;添加或刪除可見的DOM元素時。

4、rex的缺點:

(1)一個組件所需要的數據,必須甶父組件傳過來,而不能像flux中直接從store取。

(2)當一個組件相關數據更新吋,即使父組件不需要用到這個組件,父組件還是會重新render,可能會有效率影響,或者需要寫復雜的shouldComponentUpdate進行判斷。

5、對MVC和MVVM的理解:

(1)mvc:View傳送指令到Controller Controller完成業務邏輯後,要求Model改變狀態Model將新的數據發送到View,用戶得到反饋所有通信都是單向的。Angular它採用雙向綁定(data-binding):View的變動,自動反映在ViewModel,反之亦然。組成部分Model、View、ViewModel

(2)View:UI界面ViewModel:它是View的抽象,負責View與Model之間信息轉換,將View的Command傳送到Model;Model:數據訪問層。

H. WPS窗口如何設置前端顯示

您好,很高興為您解答!

你好:如果在編輯wps文件時要查看其他文件,可以取消窗口最大化,把窗口手動拉到桌面一半大小,再把另一個程序也調成一半大小,文件左一個,右一個,就可以同時顯示了。

也可以在任務欄,按住ctrl鍵,點程序的小圖標,這樣可以同時選中程序,再選縱向平鋪就可以同時顯示兩個文件了。




論文排版、模版下載、論文遇到難題,解決方法:http://docer.wps.cn/zt/lunwen?from=qyzd更多WPS辦公軟體教程,請訪問:http://bbs.wps.cn或者http://e.weibo.com/wpswfw

如有疑問,請點擊我的頭像提問。祝您生活愉快!

I. Web前端工程師初級階段需要掌握的內容

今天小編給大家整理出來了Web前端工程師初級階段需要掌握的內容,很全面,希望大家好好閱讀,看看自己掌握的知識點和文章裡面寫的還相差多少。下面來和小編一起看一看吧!

一、什麼是初級Web前端工程師?


按照我的想法,我把前端工程師分為了入門、初級、中級、高級這四個級別,


入門級別指的是了解什麼是前端(前端到底是什麼其實很多人還是不清楚的),了解基本的html、css和javascript語法(這些語方面的東西網上隨便搜一下就有很多很多,基本的語法是整個技術體系最重要的東西了,領先的
Web技術教程),可以根據設計師的設計圖在不考慮兼容性的情況下把頁面做出來,了解過一些框架的使用(例如爛大街但是依然牛逼的jQuery、zepto、
bootstrap等等)。


在經歷過入門的階段,已經了解了前端要做什麼,並且把基本的語法學習過了可以獨立做一些簡單的頁面了,那麼就要繼續學習達到初級前端工程師的水平,對於初級的前端工程師需要了解的就特別多了,需要對整個前端有一個清晰的認識,並且熟練使用各種技術,我感覺在校的學生達到初級水平就可以通過bat的校招筆試
面試了。


初級前端工程師:首先要知道的就是如何處理各種瀏覽器的兼容處理(比如說在IE瀏覽器中的createElement有什麼不同等等內容),現在基本上每個公司在招聘的時候都會要求熟練html5,
css3,javascript,這個熟練的意思就是信手拈來。


在下面會說初級前端工程師應該具體的學習哪些知識,然後就是要了解各種css的預處理器和後處理器,還有會使用常見前端的MV*框架(angularjs,
backbone,reactjs等等)並知道這些框架的原理,另外就是要熟練使用nodejs,要會使用基於node的各種前端構建工具
(grunt,gulp等等),熟練使用github或gitlab,對模塊化、組件化、工程化、語義化有一個比較深入的了解,最後要知道如何開發移動端
的頁面,如何去優化一個頁面的性能。


二、初級Web前端工程師的技術體系


(一)HTML部分


首先是要掌握一些常用標簽的使用和他們的各個屬性,這些常用的標簽我總結了一下有以下這些:


html:頁面的根元素。head:頁面的頭部標簽,是所有頭部元素的容器。body:頁面的主體標簽,頁面展現的內容就放置在這裡面。title:頁面的標題。meta:位於文檔的頭部,提供頁面的元信息,包括關鍵字、描述等等。link:定義文檔與外部資源的關系,最常用的用途就是引入樣式表。script:腳本標簽,可以把js腳本代碼放置在這個標簽內,也可以使用這個標簽的src屬性引入一個外部標簽。style:樣式標簽,可以把css代碼寫在這個標簽中。a:超鏈接,href屬性代表要鏈接到的地方,target屬性代表打開方式。img:圖像標簽,src屬性表示圖片的位置。form:表單元素,它內部的input、select、textarea等標簽都是比較重要的。div:定義文檔中的分區或節,可以使用div來進行頁面的布局等操作。另外還有ul、li、p、button、iframe、p、table等標簽也很常用,nav、section、article、header、aside、footer等語義化標簽也需要了解一下。


除了要了解上面這一些標簽之外,還需要對一些新的HTML5的API有一定的了解:


·audio、video標簽。


·Canvas:定義圖形,比如圖表和其他圖像。


·input標簽的accept屬性,email、phone、url等類型。


·getElementByClassName根據class名來獲取一個元素結點。


·Multiplefileselection多文件選擇屬性。


·html的import、template


·process標簽,WebGL等內容。


還有一些要知道的知識點:


1.
doctype的作用。2.unicode、utf8等編碼的原理和區別。3.如何進行頁面性能優化。4.png、jpg、Webp、gif等圖片格式的不同的優勢。5.HTML行內元素與塊級元素的區別。6.移動Web端開發常用head標簽。7.Web語義化。8.瀏覽器中的緩存原理


(二)CSS部分


關於css這一塊,我的看法就是網上下載一個chm格式的css的參考手冊,然後根據手冊裡面寫的一個個的都敲一下。


css大體分為下面這幾塊知識點:


①定位布局


1.position屬性的7個值(static|relative|absolute|fixed|center|page|
sticky)分別有什麼作用和不同?


2.實現品字形布局或者是三欄布局(左右寬度固定,中間適應屏幕)。


3.浮動與清除浮動的方法,flex布局,grid布局。


②盒子模型


1.margin、padding、border這三個屬性。


2.伸縮盒相關內容。


3.Multi-columnLayoutMole多列布局模型。


③文本字體


1.強制換行與不換行,清除空白。


2.文本對齊、大小(如何設置chrome小於12px的字體)、縮進、轉換。


3.單位(em、rem、px等),顏色(rgb、rgba,hls)。


④變換、過渡和動畫


1.transform的各種取值的作用與兼容性。


2.transition過渡的動畫類型,貝塞爾曲線的原理。


3.animation動畫的各種設置,@keyframes規則。


4.瀏覽器的重繪與重排。


⑤選擇器


1.選擇器的分類,權值和優先順序。


2.有哪些屬性可以被繼承,哪些屬性沒法繼承。


3.偽類和偽元素分別是什麼,有什麼作用。


上面這些都是基礎的東西,除了這些基礎的內容之外需要了解Less、Sass、stylus等css預處理器,這將會大幅度提升你的css開發效率,也需要了解一下Autoprefixer、PostCSS等css後處理器。


(三)JavaScript部分


在這里就不說js的基礎知識了,我把js按照語法的層次和使用的層次分為了兩大塊。


按照語法的層次來說:


首先是javascript的面向對象方面的內容:在javascript中實現封裝、繼承和多態。


①封裝:在js中可以通過閉包、作用域和作用域鏈來實現封裝,ES6的const、let的作用。②
繼承:基於原型鏈的繼承、基於構造函數的繼承、組合式繼承、寄生式繼承等,外加ES6的class關鍵字,prototype和__proto__。③
多態:在javascript中多態是使用arguments來實現的,關於arguments會引申出來很多內容:1.arguments的caller、callee等方法的作用。2.方法的apply和call的作用和不同。3.使用Array.prototype.slice.call來把一個數組對象轉化為數組。4.array的各種方法,如shift、splice、push、filter、map、rece、forEach等等。


然後是Js的設計模式,比如說那三種工廠模式啊,建造者模式啊等等。


最後是在不同情況下的this分別都代表什麼。


按照使用的層次來說:


首先最主要的就是ajax,ajax的原理,ajax跨域的方法:jsonp、使用iframe的location.hash、postMessageAPI、Websocket、伺服器代理等等。


然後是tcp協議、udt協議以及http協議的協議頭、狀態碼等內容。瀏覽器的緩存,客戶端存儲方面的內容:localstorage、sessionstorage、indexDB、cookie等等。


最後是一些新的js的API,例如文件讀取(fileReader)、fetch、Promise、Web
Sockets等等內容,可以去caniuse上面看一下有哪些新的東西。


上面我所說的這些只是一些比較籠統的概念,把前端html、css和javascript所需要掌握的部分內容列舉了一下,在前端領域還有很多需要我們知道的知識,這需要大家在學習工作的過程中去自己總結。


以上就是小編今天為大家分享的關於Web前端工程師初級階段需要掌握的內容的文章,希望本篇文章能夠對正在從事Web前端工作的小夥伴們有所幫助,想要了解更多Web前端相關知識記得關注北大青鳥Web培訓官網。最後祝願小夥伴們工作順利!


J. 重排與重繪

此處需要首先說明一下網頁從HTML文件變成屏幕上的畫面所經歷的過程:

其中第4步為布局排列(flow),第5步為繪制(paint),這兩部加起來也就是我們通常所說的 渲染

本次主題所說的重排與重繪便是指網頁重新布局排列和重新繪制,英文概念分別為: Reflow , Repaint ,也有些文章中稱之為 迴流與重繪

重繪與重排與我們的前端性能有什麼關系呢?

在Web前端頁面的生命周期中,在網頁生成時,瀏覽器會至少渲染一次頁面,並且,在用戶訪問頁面過程中,還可能會不斷觸發重排和重繪,不管頁面發生了重繪還是重排,都會影響到網頁的性能,尤其是其中的重排,會使我們付出高額的性能代價,因此我們應盡量避免。

那麼哪些操作會引發重排與重繪呢?

當DOM的變化影響了元素的幾何信息(元素的的位置和尺寸大小),瀏覽器需要重新計算元素的幾何屬性,將其安放在界面中的正確位置,這個過程叫做重排。

重排也叫迴流,簡單的說就是重新生成布局,重新排列元素。

以下情況會引發重排:

重排影響的范圍:

由於瀏覽器渲染界面是基於流失布局模型的,所以觸發重排時會對周圍DOM重新排列,影響的范圍有兩種:

局部布局來解釋這種現象:把一個dom的寬高之類的幾何信息定死,然後在dom內部觸發重排,就只會重新渲染該dom內部的元素,而不會影響到外界。

當一個元素的外觀發生改變,但沒有改變布局, 瀏覽器重新把元素外觀繪制出來的過程,叫做重繪。

重排必定會引發重繪,但重繪不一定會引發重排。

重排的代價是高昂的,會破壞用戶體驗,並且讓UI展示非常遲緩,重排重繪非常耗費資源,是導致網頁性能低下的根本原因。

DOM變動和樣式變動,都會觸發重新渲染。但是,瀏覽器已經很智能了,會盡量把所有的變動集中在一起,排成一個隊列,然後一次性執行,盡量避免多次重新渲染

如果寫得不好,就會觸發兩次重排和重繪

我們應盡量減少重排,最簡單的方式是: 1.減少重排次數;2.縮小重排范圍

我們可以通過Chrome觀察重排與重繪

打開開發者工具 => 點擊Performance => 點擊左側小圓點 => 點擊刷新頁面 => 錄制=>查看數據