❶ 前端規范一(命名規范)
前端規范一(命名規范)
1、小駝峰命名法(lowerCamelCase) :第一個單詞以小寫字母開始,第二個單詞的首字母大寫,例如:firstName、lastName。
2、大駝峰命名法(CamelCase) :每一個單詞的首字母都採用大寫字母,例如:FirstName、LastName。
3、下劃線命名法(snake_case):下劃線命名法也叫蛇形法,全由小寫字母和下劃線組成,在兩個單詞之間用下滑線連接。例如:first_name。
4、中劃線命名法(kebab-case):中劃線命名法也叫串式命名法,各個單詞之間通過下劃線「-」連接。例如:first-name。
強制使用:中劃線命名法
命名規則:1、文件名不得含有空格
2、文件名建議只使用小寫字母,不使用大寫字母
3、文件名包含多個單詞時,單詞之間建議連詞線 ( - ) 分隔
4、有復數結構式,要使用復數
示例:login 、 error-page、 icons
強制使用:全部大寫字母
為了醒目,某些說明文件的文件名,可以使用大寫字母
示例:README
補充說明: README 標准
◎ 項目簡介。
◎ 注意事項。
◎ 線上的示例地址(測試、正式)。
◎ 支持運行的環境。
◎ 必要的依賴准備,以及如何搭建。
◎ 項目的安裝指南。
◎ 相關的文檔鏈接。
◎ 相關人員的聯系方式。
README.md 示例:
強制使用:小駝峰命名法
命名規則:前綴為動詞,見名知意
1、onXxx 監聽事件的回調
2、handleXxx 處理事件
3、getXxx 獲取某個值
4、setXxx 設置某個值
常見場景:
a、事件處理:
(1).事件主動監聽採用 onXxx ,被動處理使用handleXxx
示例:onXxxSubmit: '提交表單'
handleXxxSizeChange: '處理分頁頁數改變'
handleXxxPageChange: '處理分頁每頁大小改變'
onXxxKeydown: '按下鍵'
(2). 其他命名:元素+click、 元素+change、select+范圍
示例:selectAllXxx: '選擇所有'
xxxCellClick: '當某個單元格被點擊時會觸發該事件'
xxxSortChange: '當表格的排序條件發生變化的時候會觸發該事件'
b、增刪改查處理:
增: addXxx 添加子項
createXxx 創建大項
刪: deleteXxx 真刪除
removeXxx 偽刪除
改:updateXxx
查: getXxx 獲取原始數據需要修改
fetchXxx 原始數據
示例:getUserList: '獲取用戶列表', fetchToken: '取得Token', deleteUser: '刪除用戶', removeTag: '移除標簽', updateUserInfo: '更新用戶信息', addUser: '添加用戶', createAccount: '創建賬戶'
c、API介面函數:
get: getXxxApi
post: postXxxApi
patch: patchXxxApi
delect: delectXxxApi
域名:xxxUrl
一般屬性變數 強制使用:小駝峰命名法
1、布爾值
命名規則:前綴為判斷性動詞
hasXxx 判斷是否含有某個值。true:含有此值; false:不含有此值
isXxx 判斷是否為某個值。true:為某個值; false:不為某個值
示例:isShow: '是否顯示', isLoading: '是否處於載入中', hasToken: '是否包含Token',
2、數組命名
命名規則:使用名詞+List組合
示例: userList: '用戶列表'
3、私有屬性變數
命名規則:前綴為下劃線(_)後面和變數命名一樣。
4、枚舉變數 \textcolor{red}{強制使用:大駝峰命名法}
枚舉的屬性使用全大寫字母,單詞間用下劃線隔開。
示例:let TargetState = { READING: 1, READED: 2, APPLIED: 3, READY: 4 };
5、常量: 強制使用:使用全大寫字母,單詞間用下劃線隔開
強制使用:大駝峰命名法
命名規則: 可參考vue官網風格指南
例如: 1、按照功能來命名
2、應用特定樣式和約定的基礎組件 (也就是展示類的、無邏輯的或無狀態的組件) 應該全部以一個特定的前綴開頭,比如 Base、App 或 V。
3、組件名應該以高級別的 (通常是一般化描述的) 單詞開頭,以描述性的修飾詞結尾。
示例:components/
|- BaseButton.vue
|- BaseTable.vue
|- BaseIcon.vue
強制使用: 中劃線命名法
命名規則:
1.class、id 、標簽、屬性的命名應該盡量精短、明確,必須以字母開頭命名,且全部字母為小寫,單詞之間統一使用中劃線 「-」 連接
2.class必須代表相應模塊或部件的內容或功能,不得以樣式信息進行命名。
3.元素 id 必須保證頁面唯一。
4.禁止創建無樣式信息的 class
示例:
1、盡量不要縮寫、簡寫的單詞。除了 template => tmp、message => msg、image => img、property => prop 這些單詞已經被公認的縮寫
2、可讀性強的命名優先於簡短的命名
3、命名長度最好在 20 個字元以內,避免多長帶來的閱讀不便
4、命名要有具體的含義,避免使用一些泛指和無具體含義的詞
5、不要使用拼音,更不要使用中文
6、正則表達式用 Exp 結尾
7、ref:使用Ref結尾
❷ Web前端中關於url、href、src的知識匯總
今天小編要跟大家分享的文章是Web前端中關於url、href、src的知識匯總。熟悉web前端的小夥伴們一定不會對這三個內容陌生。但是對於剛剛接觸web的小夥伴肯定不是很了解,今天小編就敗漏租為大家准備了這篇文章讓我們一起來看一看關於url、href、src的知識匯總。
一、URL的概念
統一資源定位符(或稱統一資源定位器/定位地址、URL地址等,英語:UniformResource
Locator,常縮寫為URL),有時也被俗稱為網頁地址(網址)。如同在網路上的門牌,是網際網路上標準的資源的地址(Address)。
二、URL的格式
2.1標准格式
協議類型:[//伺服器地址[:埠號]][/資源層級UNIX文件路徑]文件名?查詢
2.2完整格式
協議類型:[//[訪問資源需要的憑證信息@]伺服器地址[:埠號]][/資源層級UNIX文件路徑]文件名?查詢
其中【訪問憑證信息@;:埠號;?查詢;#片段ID】都屬於選填項。
三、URL的語法規則
比如網址#/html/index.asp,必須遵守以下的語法規則:
scheme://host.domain:port/path/filename
3.1說明
(1)scheme-定義網際網路服務的類型。最常見的類型是http(2)host-定義域主機(http的默認主機是www)
(3)domain-定義網際網路域名,比如w3school.com.cn(4):port-定義主機上的埠號(http的默認埠號是80)
(5)path-定義伺服器上的路徑(如果省略,則文檔必須位於網站的根目錄中)。(6)filename-定義文檔/資源的名稱
3.2URLSchemes
以下是其中一些最流行的scheme:
Scheme訪問用於...
http超文本傳輸協議以http://開頭的普通網頁。不加密。
https安全超文本傳輸協議安全網頁。加密所有信息交換。
ftp文件傳輸協議用於將文件下載或上傳至網站。
file您計算機上的文件。
四、URL的類型
4.1絕對URL
絕對URL(absoluteURL)顯示文件的完整路徑,這意味著絕對URL本身所在的位置與被引用的實際文件的位置無關。
4.2相對URL
相對URL(relativeURL)以包含URL本身的文件夾的位置為參考點,描述目標文件夾的位置。
一般來說,對於同一伺服器上的文件,應該總是使用相對URL,它們更容易輸入,而且在將頁面從本地系統轉移到伺服器上時更方便,只要每個文件的相對位置保持不變,鏈接就仍然是有效地。
以下為建立路徑所使用的幾個特殊符號,及其所代表的意義。
(1).:代表目前所在的目錄,相對路徑。如:文本或
(2)..:代表上一層目錄,相對路徑。如:文本或
(3)../../:代表的是上一層目錄的上一層目錄,相對路徑。如:
(4)/:代表根目錄,絕對路徑。如:[文本](/abc)或
五、href的概念
5.1規范解釋
href(Hypertext
Reference)指定網路資源的位置,從而在當前元素或者當前文檔和由當前屬性定義的需要的錨點或資源之間定義一個鏈接或者關系。
5.2通俗理解
href目的不是為了引用資源,而是為了建立聯系,讓當前標簽能夠鏈接到目標地址。
六、src的概念
source(縮寫),指向外部資源的位置,指向的內容將會應用到文檔中當前標簽所在位置。
七、href和src的區別
7.1請求資源類型不同
(1)href指向網路資源所在位置,建立和當前元素(錨點)或當前文檔(鏈接)之間的聯系。
(2)在請求src資源時會將其指向的資源下載並應用到文檔中,比如JavaScript腳本,img圖片;
7.2作用結果不同
(1)href用於在當前文檔和引用察兆資源之間確立聯系;
(2)src用於替換當前內容;
7.3瀏覽器解析方式不同
(1)若在文檔中添加,瀏覽器會識別該文檔為CSS文件,就會並行下載資源並且不會停止對當前文檔的處理。這也是為什麼建議使用link方式載入
CSS,而不是使用@import方式。
(2)當瀏覽器解析到
,會暫停其他資源的下載和處理,直到將該資源載入、編譯、執行完畢,圖片和框架等也如此,類似於將所指向資源應用到當前內容。這也是為什麼建議把js
腳本放在底部而不是頭部的原因。
八、link和@import的區別
兩者都是外部引用CSS的方式,但是存在一定的搜州區別:
(1)link是XHTML標簽,除了能夠載入CSS,還可以定義RSS等其他事務;而@import屬於CSS范疇,只可以載入CSS。
(2)link引用CSS時,在頁面載入時同時載入;@import需要頁面完全載入以後再載入。
(3)link是XHTML標簽,無兼容問題;@import則是在CSS2.1提出的,低版本的瀏覽器不支持。
(4)link支持使用Javascript控制DOM改變樣式;而@import不支持。
以上就是小編今天為大家分享的關於Web前端中關於url、href、src的知識匯總的文章,希望本篇文章能夠對正在從事web學習和工作的小夥伴們有所幫助,想要了解更多web相關知識記得關注北大青鳥web培訓官網哦~
作者:WEBING
#/a/1190000013845173
*聲明:內容與圖片均來源於網路(部分內容有修改),版權歸原作者所有,如來源信息有誤或侵犯權益,請聯系我們刪除或授權事宜。
❸ Web前端開發知識點之JavaScript的介紹與語法
今天小編要跟大家分享的文章是關於Web前端開發知識點之JavaScript的介紹與語法。正在學習web前端相關知識的小夥伴們來和小編一起看一看吧,希望本篇文章能夠對大家有所幫助。
一、JavaScript介紹
JavaScript是一門客戶端腳本語言,是適應動態網頁製作的需要而誕生的一種編程語言。這門語言可用於HTML和web,更可廣泛用於伺服器、PC、筆記本電腦、平板電腦和智能手機等設備。
在HTML基礎上,使用Javascript可以開發互動式Web網頁,可以增強用戶和HTML頁面的交互過程,可以控制HTML元素讓頁面有一些動態的效果,增強用戶的體驗。
JavaScript使有規律地重復的HTML文段簡化,減少下載時間。
二、JavaScript語法
①與HTML的結合方式
JavaScript與HTML的結合方式有兩種,一種是內部JavaScript,一種是外部JavaScript,定義的方式與CSS類似。
內部JavaScript需要定義一對
外部JavaScript也需要定義一對
注意:JavaScript可以定義在HTML頁面的任何地方,但是定義的位置會影響執行的順序。而且可以在HTML文檔中放入不限數量的腳本。通常的做法是把函數放入
②注釋
JavaScript的注釋與java相同,一種是「//」單行注釋,一種是「/**/」多行注釋。例如
//這是單行注釋
/*
這是多行注釋
這是多行注釋*/
③數據類型
JavaScript的數據類型包括兩大類:原始數據類型和引用數據類型。
原始數據類型包括:
·number數字:包括整數、小數和NaN(notanumber不是數字的數字類型)
·string字元串
·boolean布爾型:包括true和false
·null:一個對象為空的佔位符
·undefined:未定義
引用數據類型就是指對象類型。
④變數
所謂變數就是一小塊存儲數據的內存空間。java語言是強類型語言,在開辟變數存儲空間時就定義了存儲數據的類型,而且只能存儲固定類型的數據;JavaScript是弱類型語言,在開辟變數存儲空間時不定義存儲數據的類型,可以存儲任意類型的數據。
聲明變數用var關鍵字,例如:
vara=3;
我們可以使用typeof運算符獲取變數的類型。
⑤運算符
JavaScript中的運算符與java中的基本一致,大家可以參考這個鏈接復習一下,接下來我再說說JavaScript里比較特殊的運算符。
在說運算符之前先說一個注意事項:在JavaScript中如果運算數不是運算符所要求的的類型,那麼JavaScript引擎會自動將運算數進行類型轉換。
因此在JavaScript中1=="1"的結果是true,那麼我想讓他的結果是false該怎麼辦呢?所以JavaScript引入了新的運算符全等於(===),此時1==="1"的結果就是false了。
⑥流程式控制制語句
JavaScript中流程式控制制語句包括if...else...、switch、while、do...while...、for等,語法規則與java中完全一致,點擊上方關鍵詞可查看java語法規則。
⑦特殊語法(不建議)
JavaScript語句以;結尾,如果一行只有一條語句則;可以省略。
變數定義是使用var關鍵字,也可以不使用。
以上就是小編今天為大家分享的關於Web前端開發知識點之JavaScript的介紹與語法的文章,希望本篇文章能夠對正在從事web前端工作和學習的小夥伴們有所幫助,想要了解更多web前端知識記得關注北大青鳥web培訓官網,最後祝願小夥伴們工作順利,成為一名優秀的web前端工程師。
文章來源:原創凱哥的故事凱哥的故事
❹ 整理涵蓋很全很廣的前端知識點
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 ,其原理就是利用大量的請求造成資源過載,導致服務不可用。
❺ web前端需要掌握的哪些知識
一個合格的web前端需要掌握哪些技術?
最基礎的自然是JavaScript,HTML和css這三種語言。
首先了解下它們到底是什麼。
HTML是用戶看到的網頁的骨架,比如你會發現當前頁面分為左中右三個部分,其中還填充了不同的文字和圖片;每個子部分還會繼續細分,比如當前頁面的中間部分下方有輸入框等等。
CSS是網頁展示的細節控制,比如你會發現有的文字是紅底白色,有的子部分佔了頁面的二分之一寬,有的只佔六分之一,有些部分需要用戶進行某些操作(如點擊,滑動)才會出現等等,這些就是有CSS來控制。
JavaScript是負責捕捉用戶在瀏覽器上的操作,並與後端伺服器進行數據交換的腳本語言。當用戶在前端進行點擊,輸入等操作的時候,會觸動綁定了該動作的JavaScript腳本,然後JavaScript收集數據,調用後端的api介面,再將後端返回的數據交給HTML和CSS渲染出來。
一個網頁的HTML代碼和CSS代碼是可以直接在瀏覽器中查看的,你可以直接按F12,就能看到下圖右側的模塊,左右側紅框就是代碼與實際頁面的對應關系。因此如果你看到某個網站的布局很不錯,不妨點擊F12,進行學習。
前端框架
然而,實際應用中,已經很少有正規的項目組直接用上述三種語言進行web 前端開發了,而是使用很多封裝了這三種語言的框架,比如
Vue.js
,angular,react native等等。它們是來自谷歌和Facebook的大神項目組,基於自己的經驗,封裝了原生前端語言,實現了更多更復雜更酷炫的功能。因此,可以說,學會使用這些框架,能達到事半功倍的效果。
比如用了vue,它是自底向上增量開發的設計,其核心只關心圖層,而且還可以與其他庫或已存項目融合,學習門檻極其友好;另一方面,vue可以驅動單文件組件和vue生態系統支持的庫開發的復雜單頁應用。有了這個生態系統,可以說,vue是處在一個不斷壯大,不斷完善的欣欣向榮的狀態。
網路通信協議
由於前後端分離的趨勢,前端還需要了解很多網路通信協議的知識,這里不局限於http協議,因為據我的經驗,有時候我們還會用到websocket等協議。因此,前端需要簡單了解不同協議的特點以及使用方式,但是好消息是不用像學習計算機網路課程一樣對每種協議的原理都了解的特別透徹,只要學會如何用前端語言發送這種協議的請求就夠了。