HTML5新增的語義化標籤有:header、nav、main、article、aside、footer等等。javascript
HTML語義化就是讓頁面內容結構化,他有如下優勢:css
HTML5新增的標籤有:header、nav、video、audio、canvas、aside等等。html
廣義上的HTML5指的是最新一代前端開發技術的總稱,包括:HTML五、CSS三、新增的webStorage等webAPI。前端
HTML中新增了header、footer、nav等語義化標籤,還新增了video、audio媒體標籤,新增了canvas畫布,還有一些標籤的新屬性,好比:input標籤的placeholder屬性。vue
CSS中新增了圓角、陰影、濾鏡、vw和vh長度單位,flex佈局,媒體查詢,過分和動畫,僞類等。java
js中新增了webStorage瀏覽器緩存策略、querySelector、webSocket、requestAnimationFrame、Worker線程、地理位置等。webpack
autocomplete
屬性規定輸入字段是否應該啓用自動完成功能,默認爲啓用。設置autocomplete=off
能夠關閉該功能。ios
自動完成容許瀏覽器預測對字段的輸入。在用戶在字段開始鍵入時,瀏覽器基於以前鍵入的值,應該顯示出在字段中的選項。nginx
瀏覽器標籤頁之間是沒辦法直接通訊的,通常都是經過找一箇中介者來實現通訊。es6
cookie就是HTML5提供的一種緩存方式,一個cookie就是存儲在用戶主機瀏覽器中的一小段文本文件。Cookies是純文本形式,他們不包含任何可執行代碼。每一個cookie至關於一個用戶標識,在該頁面發送請求時,會攜帶對應頁面存儲的cookie值發送給後端用來判斷登陸狀態是否失效。
cookie還能夠用來存儲數據,可是瀏覽器供cookie存放數據的空間較少,若是須要存放大容量數據,推薦使用webStorage。
盒模型分爲標準盒模型和ie盒模型。標準盒模型爲content(內容)+padding(內邊距)+border(邊框)+margin(外邊距),而ie盒模型則爲content(內容)+padding(內邊距)+margin(外邊距)。
標準盒模型和ie盒模型最根本的區別在於標準盒模型將邊框的單位長度算了進去,而ie盒模型沒有算進去,ie盒模型將邊框的單位長度算進內邊距中。
能夠經過box-sizing進行標準盒模型和ie盒模型之間的轉換。
標準盒模型:box-sizing: content-box;
ie盒模型:box-sizing: border-box;
rem和em都是css的長度單位,rem是相對於根元素html的font-size進行變化,em是根據父元素的fong-size進行變化的。
通配符選擇器:* ID選擇器:#ID 類選擇器:.class 元素選擇器:p、a、span等 後代選擇器:p span、div a等 僞類選擇器:a:hover、a:active等 屬性選擇器:input[type="text"]等
!import > 行內樣式 > #id > .class > 元素和僞元素 > * > 繼承 > 默認
在CSS中,多個圖標集成到一張圖上使用background-position屬性設置的圖片,稱爲精靈圖(又稱圖片精靈)。
transition: 過渡 transform: 旋轉、縮放、移動或者傾斜 animation: 動畫 gradient: 漸變 shadow: 陰影 border-radius: 圓角
寬度和高度是由內容決定的,與其餘元素共佔一行不能設置寬高,例如:span標籤、a標籤、i標籤等等
默認寬度由父容器決定,默認高度由內容決定,而且獨佔一行能夠設置寬高,例如:p標籤、div標籤、ul標籤等。
寬度和高度由內容決定,與其餘元素共佔一行可是能夠設置寬高等,例如:img標籤等。
position:absolute;
絕對定位,是相對於元素最近的已定位的父元素,若是沒有已定位的父元素,就相對於body元素進行定位。
position:relative;
相對定位,是相對於元素在文檔中的初始位置進行定位。
經過display:flex使該元素的子元素脫離文檔流,進行一些其餘的操做。
align-item: 定義元素橫向排列規則
flex-direction: 定義元素縱向排列規則
justify-content: 定義在主軸上的對齊方式
BFC格式化上下文,就是創做一個獨立的渲染區域,讓處於BFC內部的元素和外部相互隔離,使內外元素不受影響。
最有效的一種方式就是將元素的性質改變爲行內塊元素(display:inline-block),還能夠經過position:absolute/relative進行產生bfc。
最不推薦的一種方式就是給元素添加邊框,可是這種方式相比而言最簡單。
經過flex佈局或者line-height屬性和text-align屬性進行佈置
overflow : hidden; text-overflow: ellipsis; display:
根據瀏覽器渲染機制(下方瀏覽器部分中有解釋)能夠得知HTML被解析解析成了DOM,CSS被解析成了CSSOM,它倆合併產生了渲染樹Render Tree。
因爲節點的集合屬性發生改變或者因爲樣式改變而不會影響佈局的,稱爲重繪。例如outline
、visibility
、color
、background-color
等等,重繪的代價是高昂的,所以瀏覽器必須驗證DOM樹上其餘元素的可見性。
迴流是佈局或幾何屬性發生改變就稱爲迴流。迴流是影響瀏覽器性能的關鍵因素,由於其變涉及到部分頁面(或是整個頁面)的佈局更新。一個元素的迴流可能會致使其素有子元素以及DOM中緊隨其後的節點、祖先節點元素隨後的迴流。大部分的迴流將致使頁面的從新渲染。
迴流一定會發生重繪,重繪不必定會引起迴流。
直接在標籤的方法中執行js語句。
在script標籤中編寫js代碼,並執行
經過script的src屬性指向一個js文件的路徑進行引入使用
string、number、boolean、undefined、null、symbol六種基本數據類型。
map函數、forEach函數、for循環、forin循環、forof循環。
filter函數
對於一些簡單函數能夠直接使用in
關鍵字查找,返回值爲boolean。
let p = [1, 2, 3]; console.log(1 in p) // true
includes函數:查找匹配項,若是有返回true,沒有返回false。
indexOf函數:正序查找匹配數據,返回下標。
lastIndexOf函數:倒敘查找匹配數據,返回下標。
some函數:有匹配項返回true時,總體爲true。
every函數:有匹配項返回false時,總體爲false。
push函數:在數組的末尾添加一條數據。
unshift函數:在數組的開頭添加一條數據。
pop函數:在數組的末尾刪除一條數據。
shift函數:在數組的開頭刪除一條數據。
slice(start, end)函數:根據參數截取數組,並返回一個新數組,不會影響原來的數組。
splice(start, end, value....)函數:根據參數刪除數據並替換數據,返回當前操做後的數組,會影響原來的數組。
sort函數:根據回調函數的具體邏輯將數組進行排列順序。
reverse函數:將數組按照如今的數據順序進行反轉。
concat函數:合併兩個數組。
reduce函數:在回調函數中對數組的每一條數據進行操做。
Object是JavaScript中全部對象的父對象。
數據封裝對象:Object、Array、Boolean、Number和String。
其餘對象:Function、Arguments、Math、Date、Error、RegExp等。
一個函數中包含了另外一個函數,其中的函數使用到了第一個函數的變量,那麼其中的函數就叫作閉包。
閉包就是可以讀取其餘函數內部變量的函數。
特徵:
使用閉包主要是爲了設計私有的方法和變量。閉包的優勢是能夠避免全局變量的污染,缺點shi閉包會常駐內存,增大內存使用量,容易形成內存泄漏。在js中,函數即閉包,只有函數纔會產生做用域的概念。
閉包最大的好處有兩個,一個是能夠讀取函數內部的變量,另外一個就是讓這些變量始終保持在內存中。
由於JavaScript是單線程編程語言,因此同步和異步並非主線程執行同步代碼,再開一個線程執行異步代碼,而是經過消息隊列和事件循環的方式來進行同步和異步的劃分。
當js執行同步代碼時,一個任務執行完纔會去執行下一個任務,若是前一個任務耗時很長,那麼後一個任務不得不一直等着,這樣就會堵塞代碼執行。
同步任務指的是,在主線程上排隊執行的任務,只有前一個任務執行完畢,才能執行下一個任務。
異步任務指的是,不進入主線程、而進入消息隊列的任務,只有等主線程任務執行完畢,任務隊列開始通知主線程,請求執行任務,該任務纔會進入主線程執行。
簡單來講就是同步任務和異步任務的組合。
主線程先執行同步任務,當執行完畢同步任務時,去讀取"消息隊列",並執行消息隊列中的異步任務和其餘事件,而且一直重複這個過程(只要主線程中的同步任務爲空,就去讀取"消息隊列")。
注意:
"消息隊列"中除異步任務外,還有IO設備的事件以及一些用戶產生的事件(好比鼠標點擊、頁面滾動等等),這些相對耗時的操做。只要指定過這些事件的回調函數,這些事件發生時就會進入"消息隊列",等待主線程讀取。
在js中做用域分爲全局做用域和局部做用域。
全局做用域能夠在程序的任何地方都能被訪問,好比window對象的內置屬性就具備全局做用域。
局部做用域只有在當前做用域內才能被訪問,不然會報錯"xxx is not defined"。
全局做用域能夠經過var關鍵字來聲明,也能夠在程序的最外部經過let關鍵字聲明。
局部做用域能夠在程序的某個代碼塊中經過let關鍵字聲明。
在使用變量的過程當中,會先在當前做用域查找是否認義了這個變量,若是找不到,就會向上級做用域去查,直到查到全局做用域,這個查找的過程叫作做用域鏈。
在js中有一句話萬物皆對象,每一個對象都會在其內部初始化一個prototype屬性,這個屬性就是原型,當咱們訪問一個方法或者屬性的時候,若是這個對象內部不存在這個屬性,那麼他就會去prototype裏找這個屬性,這個prototype又有本身的prototype,這個樣一直找下去,直到找到Object內建對象,這個過程叫作原型鏈。
函數是一個另類,它具備兩個原型,一個prototype,一個proto。
在javascript中,函數的參數能夠接收變量,因此一個函數做爲另外一個函數的參數的這種形式,稱爲高階函數。
當頁面代碼量過大,邏輯太多或者同一個功能組件在不少頁面均有使用,維護起來至關麻煩,這個時候,就須要組件化開發來進行功能拆分、組件封裝,達到組件通用性,加強代碼得可讀性,下降維護成本。
很大程度上下降系統各個功能得耦合性,而且提升了內部功能得聚合性。這對前端工程化及下降代碼得維護來講,是有很大的好處的,耦合性的下降,提升了系統的伸展性,下降了開發的複雜性,提高開發效率,下降開發成本。
出現模塊化這個概念的緣由是由於早期版本的js沒有塊級做用域、沒有類、沒有包、也沒有模塊,這樣就帶來了複用、依賴、衝突、代碼組織混亂等一系列的問題,也就出現了模塊化這一律念。
兩種技術的本質:二者的行爲是相反的,一個是提早加載,一個是遲緩甚至不加載。預加載會增長服務器前端壓力,懶加載對服務器有必定的緩解壓力。
mouseover:當鼠標移入元素或其子元素都會觸發事件,因此有一個重複觸發,冒泡的過程。對應的移除事件爲mouseout。
mouseenter:當鼠標移除元素自己(不包含子元素)會觸發事件,也就是不會冒泡,對應的移除事件是mouseleave。
經過promise、generator、async/await均可以解決。
this老是指向函數的直接調用者(並不是簡介調用者)。
若是有new關鍵字,this指向new出來的那個對象。
在事件中,this指向觸發這個事件的對象,特殊的是,IE中的attachEvent中的this老是指向全局對象Window。
Vue實例從建立到銷燬的過程,就是生命週期。也就是從開始建立、初始化數據、編譯模板、掛載DOM元素=>渲染、更新=>渲染、卸載等一系列過程,就是Vue的生命週期。
Vue的生命週期中有不少事件鉤子,能夠經過這些事件鉤子更好控制整個Vue實例的渲染和其中的各類邏輯。
總共有8個階段:
建立前(beforeCreate) => 建立後(created) => 載入前(beforeMount)=>載入後(mounted)=>更新前(beforeUpdate)=>更新後(updated)=>銷燬前(beforeDestroy)=>銷燬後(destroyed)
DOM元素渲染在mounted中就已經完成了。
beforecreate : 能夠在這加個loading事件,在加載實例時觸發
created : 初始化完成時的事件寫在這裏,如在這結束loading事件,異步請求也適宜在這裏調用
mounted : 掛載元素,獲取到DOM節點
updated : 若是對數據統一處理,在這裏寫上相應函數
beforeDestroy : 能夠作一個確認中止事件的確認框
nextTick : 更新數據後當即操做dom
v-show是經過切換元素的css屬性,v-if是dom的銷燬和從新建立。
使用頻繁切換時應該用v-show,使用較少時用v-if。
v-html、v-model、v-bind、v-on、v-show、v-if、v-else-if、v-else等等。
對象方法:v-bind:class="{'origin': isRipe, 'green': isNotRipe}"。
數組方法:v-bind:class="[class1, class2]"。
行內綁定:v-bind:style="{color: color, fontSize: fontSize + 'px'}"。
在父組件中直接爲子組件綁定自定義屬性傳遞數據,子組件經過props接收。
父組件模板:
<template> <Child :msg="message" /> </template> <script> export default{ template: { Child }, data(){ return { message: "向子組件傳遞的數據" } } } </script>
子組件模板:
<template>
由於vue遵循單向數據流,在子組件中沒法直接向父組件傳遞數據,必須經過$emit()觸發父組件中的方法並將數據經過參數的方式傳遞過去。
父組件模板:
<template> <Child @msgFunc="func" /> </template> <script> export default{ template: { Child }, methods: { func(msg){ console.log(msg); // 打印子組件傳遞過來的數據 } } } </script>
子組件模板:
<template> <button @click="handleClick()">觸發父組件的方法,並傳遞過去數據</button> </template> <script> export default{ data(){ return { message: "子組件的數據" } }, methods: { handleClick(){ this.$emit("msgFunc", this.message); // 此處第二個參數有可能會不生效,推薦重定向下this指向。 } } } </script>
兄弟組件之間傳值能夠經過Bus通訊,或者vuex完成。
實例化一個vue實例做爲Bus媒介,將該實例掛載到Vue原型鏈上方便調用,並經過$emit()和$on進行觸發方法和傳遞數據。
main.js文件:
import Vue from "vue"; let Bus = new Vue(); Vue.prototype.$Bus = Bus; new Vue({...});
組件1:
<template>
組件2:
<template> <button @lick="toBus()">觸發on方法,並傳遞數據</button> </template> <script> export default{ data(){ return { msg: "兄弟組件中的數據" } }, methods: { toBus(){ this.$Bus.$emit("on", this.msg); } } } </script>
MVVM,按從左到右的順序,M表明Model數據模型,V表明View視圖,VM表明ViewModel視圖和數據的橋接器。
computed:
watch:
當咱們須要進行數值計算,而且依賴於其餘數據時,就使用computed。若是隻是單純的監聽數據變化進行回調事件,那麼就使用watch。
key是Vue中節點的惟一標識符,可使咱們的diff操做更準確、快速。
若是不加key,vue會選擇複用節點(Vue的就地更新策略),就會致使以前的節點的狀態被保留下來,使節點更新不許確,而且不利於被Map數據結構充分利用。
vue組件中data是一個函數並返回一個對象,而Vue實例中的data是一個對象。
這是由於在js中對象不具備做用域,而函數具備做用域。vue組件是用來複用的,必須是每一個組件的做用域相互隔離的,不會相互影響,而new Vue()實例是不會被複用,所以不存在引用對象問題。
在下一次DOM更新循環結束以後延遲執行回調。在修改數據以後,當即使用的這個回調函數,獲取更新後的DOM。
vm.smg = "數據"; // DOM還未更新 Vue.nextTick(() => { // DOM更新 });
vue中擁有具名插槽、匿名插槽和做用域插槽三種,三種插槽都是經過<slot>標籤進行分發內容,但做用域插槽是經過slot-scope屬性進行分發內容。
具名插槽擁有name屬性對父組件傳過來的數據進行匹配並分發內容。
在vue-router中能夠經過添加meta屬性對路由添加原信息進行路由權鑑,而且能夠在vue-router的路由鉤子中進行路由的重定向。
vue-router的路由鉤子有三種:
第一種:全局導航鉤子,router.beforeEach((to, from, next) = {}),在全局路由跳轉以前進行攔截。
第二種:組件內的鉤子。
第三種:單獨路由獨享鉤子。
vuex是vue的狀態管理組件,其中的state就是數據源存放地,對應通常vue對象裏面的data。
state中存放的數據是響應式的,vue組件從store讀取數據,如果store中的數據發生改變,依賴該數據的組件也會發生更新。
能夠經過mapState把全局的state和getters映射到當前組件的computed計算屬性。
vuex有5中屬性:分別是state、getter、mutation、action、module。
Vuex使用單一狀態樹,即每一個應用將僅僅包含一個store實例,但單一狀態樹和模塊化並不衝突。存放的數據狀態,不能夠直接修改裏面的數據。
在其中定義用於動態修改Vuex的store中的數據狀態的方法。
至關於vue的計算屬性,主要用來過濾一些數據。
actions中定義的方法就是將mutation中的定義的處理數據的方法變成可異步的處理數據的方法,簡單的說就是異步操做數據。vue組件中經過store.dispatch()來分發action,也能夠經過mapAction將action中的方法映射進methods中。
vuex通常用於中大型web單頁應用中對應用的狀態進行管理,對於一些組件間關係較爲簡單的小型應用,使用vuex的必要性不是很大,由於徹底能夠用組件props屬性或者Bus事件來完成通訊,vuex更多地用於解決跨組件通訊以及做爲數據中心集中式存儲數據。
虛擬DOM至關於真實DOM的一個類對象,當應用的狀態發生改變時,會記錄新的虛擬DOM樹並於原先舊的虛擬DOM樹進行比較,再把其中發生的改變動新到真實DOM樹上。
React 16以後有三個生命週期被廢棄,但沒有移除,因此仍是可使用,不過官方並不推薦這樣:
目前React16.8+的生命週期分爲三個階段,分別是掛載階段、更新階段、卸載階段:
掛載階段
更新階段
shouldComponentUpdate(nextProps, nextState)
,有兩個參數nextProps和nextState,表示新的屬性和變化以後的state,返回一個布爾值,true表示會觸發從新渲染,false表示不會觸發從新渲染,默認返回true,咱們一般利用今生命週期來優化React程序性能。getSnapshotBeforeUpdate(prevProps, prevState)
,這個方法在render以後,componentDidUpdate以前調用,有兩個參數prevProps和prevState,表示以前的屬性和以前的state,這個函數有一個返回值,會做爲第三個參數傳給componentDidUpdate,若是你不想要返回值,能夠返回null,今生命週期必須與componentDidUpdate搭配使用。componentDidUpdate(prevProps, prevState, snapshot)
,該方法在getSnapshotBeforeUpdate方法以後被調用,有三個參數prevProps,prevState,snapshot,表示以前的props,以前的state,和snapshot。第三個參數是getSnapshotBeforeUpdate返回的,若是觸發某些回調函數時須要用到 DOM 元素的狀態,則將對比或計算的過程遷移至 getSnapshotBeforeUpdate,而後在 componentDidUpdate 中統一觸發回調或更新狀態。卸載階段
若是將請求放在componentWillMount中能夠提早進行異步請求,避免白屏,可是當React渲染一個組件時,他不會等待componentWillMount完成任何事情,React會繼續執行render事件,沒有辦法暫停渲染以等待數據的到達。
並且在服務器渲染時,若是在componentWillMount中獲取數據,fetch data會執行兩次,一次在客戶端一次在服務端,這形成了多餘的請求,其次,在React 16進行React Fiber重寫後,componentWillMount可能在一次渲染中屢次調用。
官方推薦在componentDidMount中進行。若是有特殊需求須要提早請求,也能夠在constructor中請求。
setState
有時會同步,有時會異步
setState
只在合成事件和鉤子函數中是異步的,在原生事件和setTimeout
中都是同步的。setState
的異步並非說內部由異步代碼實現,其實自己執行的過程和代碼都是同步的,只是合成事件和鉤子函數的調用順序在更新以前,致使在合成事件和鉤子函數中無法當即拿到更新後的值,造成了所謂的異步,固然能夠經過第二個參數setState(partialState, callback)
中的callback
拿到更新後的結果。setState
的批量更新優化也是創建在「異步」(合成事件、鉤子函數)之上的,在原生事件和setTimeout 中不會批量更新,在「異步」中若是對同一個值進行屢次setState
,setState
的批量更新策略會對其進行覆蓋,取最後一次的執行,若是是同時setState
多個不一樣的值,在更新時會對其進行合併批量更新。React中的組件通訊和Vue中組件通訊差很少,都分爲父子組件通信和其餘組件通信。
Context
進行數據傳遞,Context
設計的目的是爲了共享那些對於一個組件樹而言是全局的數據。var聲明的變量不具備塊級做用域,而且能夠重複聲明變量,聲明後的變量會與window相映射,能夠在window對象中查找到,而且var聲明的變量具備變量提高,能夠先使用後聲明。
let聲明的變量具備塊級做用域,在同一個做用域內不能夠重複聲明名稱相同的變量,而且let聲明的變量不具備變量提高,必須先聲明後使用。
const聲明的是常量,一旦聲明賦值事後就沒法改變常量的值,而且支持塊級做用域。
能夠經過數組或對象的形式將數組或對象中的單個數據獲取出來。
// 對象解構 let {a, b} = {a: 1, b: 2}; // 數組解構 let [c, d, e] = [1, 2, 3];
還能夠將函數的參數經過對象解構的方式一一對應。
function personInfo({name, age, address, gender}){ console.log(arguments === {name, age, address, gender}); // true console.log(name, age, address, gender); } personInfo({gender: 'man', address: 'changsha', name: 'william', age: 18});
forEach更多的是用來遍歷數組。
for in通常經常使用來遍歷對象或json
for of數組對象均可以遍歷,遍歷對象須要經過和Object.keys()配合
for in循環出來的是key,for of循環出的是value。
箭頭函數又稱爲lambda表達式,是一種簡化函數定義的語法糖。
箭頭函數能夠省略參數那裏括號和包裹執行語句的大括號,表示直接返回執行語句。
let example = value => console.log(value);
注意:
Set用於數據重組,Map用於數據存儲。
Promise是一個構造函數,能夠經過new關鍵字聲明一個promise函數,它具備三種狀態,而且調用它其中一個狀態成功時就會凝固在這個狀態上,不發生改變。
在Promise函數中能夠經過then來調用它成功的狀態,catch調用它失敗的狀態,finaly調用執行結束的狀態。
let promise = new Promise((resolve, reject) => { if(true){ resolve(
HTTP協議並無規定GET/POST的請求長度限制,對get請求參數的限制是來源與瀏覽器或者web服務器,瀏覽器或者web服務器限制了url的長度,而且,有如下幾點:
同步和異步最根本的區別在於,同步會阻塞代碼執行,可是異步不會。
同步至關於只有一條車道,一條車走完事後下一輛車再走,若是中間出現了問題,久會發生阻塞現象。
異步能夠理解爲有不少條通道,好幾輛車同時在不一樣的車道上行駛,並不會阻塞。
全部的ajax請求都是異步的。
跨域的概念:協議、域名、端口都相同纔是同域,不然都是跨域。
渲染引擎並不會等到全部的HTML解析完成以後再去構建和佈局Render Tree,而是解析一部分就構建一部分,至關於熱更新同樣。
URL
交給DNS
域名解析,找到真實IP
,向服務器發起請求。html、js、css
、圖像等等)。html、css、js
等)進行語法解析,創建相應的內部數據結構(如html
的DOM
)。分爲初始化、編譯、輸出三個階段.
初始化:
編譯
輸出:
優化能夠從兩個方面考慮,一個是優化開發體驗,一個是優化輸出質量。
優化開發體驗
優化輸出質量減小首屏加載時間
提高流暢度,即代碼性能:
loader能把源文件翻譯成新的結果,一個文件能夠鏈式通過多個loader編譯。以處理scss文件爲例:
plugin用於擴展webpack功能。
url從輸入到輸出的過程1. 構建請求 構建請求行,請求行包括請求方法、請求http版本、URI Get/Http/1.0 2. 查找強緩存 檢查強緩存,命中則直接使用,不然檢查協商緩存 3. DNS解析 域名與IP地址映射 4.創建tcp鏈接 chrome限制同一域名下最多6個tcp鏈接 + 經過三次握手創建鏈接 三次握手過程: 1.客戶端向服務器發送鏈接請求,傳遞一個數據包syn,此時客戶端處於SYN_SEND狀態 2.服務器接收syn報文後,會以本身的syn報文做爲應答,傳遞數據包syn+ack,此時服務器處於SYN-REVD狀態 3.客戶端接收syn報文後,發送一個數據包ack,此時客戶端處於ESTABLISHED狀態,雙方已創建鏈接 + 進行數據傳輸 + 經過四次揮手斷開鏈接 四次揮手過程: 1. 客戶端發送一個FIN報文,報文中指定一個序列號,此時客戶端處於FIN_WAIT1狀態,等待服務器確認 2. 服務器接收到FIN後,會發送ACK確認報文,代表已經收到客戶端報文,此時服務端處於CLOSE_WAIT2狀態 3. 服務器發送FIN,告訴客戶端想斷開鏈接,此時服務端處於LAST_CHECK階段 4. 客戶端收到FIN後,同樣發送一個ACK做爲應答,此時客戶端處於TIME_WAIT階段。須要過一段時間確認服務端收到本身的ACK報文 後纔會進入CLOSED狀態 5.發送http請求 6.網絡響應 7.瀏覽器解析和渲染 分爲構建dom樹、樣式計算、生成佈局樹。 8.生成佈局 觸發迴流和重繪
介紹下半鏈接隊列
服務器第一次接收到客戶端的SYN後,會處於SYN-REVD階段,此時雙方尚未創建徹底的鏈接, 服務器會把此種狀態下請求鏈接放在一個隊列裏,咱們把這種隊列稱爲半鏈接隊列 已經完成三次握手並創建鏈接,就叫全鏈接隊列
能夠介紹https的通訊過程,涉及對稱加密和非對稱加密
1. 超時重傳機制 2. 對失序數據進行重排序 3. 應答機制 4. 滑動窗口 5. 擁塞控制
http1.0:get、post、head
http1.1:put、delete、connect、trace、options
簡單請求:
http1.0:
http1.1:
http2.0:
二進制分幀層能夠擴展到計算機網絡的OSI參考模型
客戶端緩存分爲cookie、localStorage、sessionStorage、indexedDB,網上有關的文章不少,就不詳細說了
強緩存
不向http發送請求,返回狀態碼304.
檢查強緩存有兩個字段: http1.0使用expires,表明過時時間,可是服務器時間和客戶端時間可能不一致。爲了彌補這個缺點,http1.1使用cache-control的max-age字段,cache-control有多個指令
協商緩存向http發送請求,返回狀態碼200
檢查協商緩存有兩個字段: http1.0使用last-modified,即最後修改時間。
http1.1使用etag,etag是服務器根據當前文件內容,給文件生成的惟一標識,只要內容改變,這個值就會變。etag優先級高於last-modifed
緩存位置,按優先級從高到低分別是:
列舉一些常見狀態碼便可
200-請求成功 301-永久重定向 302和307-臨時重定向 400-當前請求不能被服務器理解或請求參數有誤 401-請求須要認證或認證失敗 403-服務器禁止訪問 404-資源未找到 405-方法未容許 500-內部服務器錯誤 502-網關錯誤 503-服務器處於超負載或停機維護
ngnix是個高性能反向代理服務器,有如下做用:
ngnix解決跨域的原理:
跨站腳本攻擊,指攻擊者在網頁上注入惡意的客戶端代碼,經過惡意腳本對客戶端網頁進行篡改,從而在用戶瀏覽網頁時, 對客戶端瀏覽器進行控制或獲取用戶隱私數據的方式
防範:
跨站請求僞造,劫持受信任用戶向服務器發送非預期請求的方式。
防範:
1.新建一個axios對象,定義好字段並設置默認值,好比超時時間、請求頭 2.定義過濾字符串方法,過濾服務端爲空字符串或null的屬性 3.請求攔截器調用過濾字符串方法,遍歷url上的字段,若是爲數組或對象轉爲JSON對象 4.響應攔截器捕獲錯誤,根據http狀態碼進行不一樣的處理,好比401跳轉登錄頁面,403返回您沒有權限,502返回系統正在升級中,請稍後重試, 504返回系統超時,並彈出對應的消息提示框。消息提示框自定義
axios調用流程
查看axios源碼,axios調用流程實質是Axios.prototype.request的實現,調用過程以下: 1.判斷傳入參數config是不是字符串,是則設置url,不然設置config爲對象 2.調用mergeConfig方法,合併默認參數和用戶傳入的參數 3.若是設置了請求方法,將其轉爲小寫,不然設置請求方法爲get 4.將用戶設置的請求和響應攔截器、發送請求的dispatchRequest組成promise鏈,最後返回promise實例。 這一步保證先執行請求攔截器,再執行請求,最後執行響應攔截器