一.URL網(wǎng)址解析的好幫手(node API -- URL)
url的方法
1.parse:分析、解析
eg: url.parse('http://www.baidu.com')
protocol:底層協(xié)議(http/ftp);
slashes:是否有協(xié)議雙斜線;
host:Ip地址/域名;
port:端口(默認80);
hostname:主機名;
hash:錨點(滾動到當前為止);
search:查詢字符串參數(shù);
query:傳遞參數(shù);
pathname:路徑名;
path:路徑;
href:完整超鏈接;
url.parse(urlStr[,parseQueryString][,slashesDenoteHost]):將定位符解析成對象,
可選參數(shù)1設置為true,對象中query可解析出;
可選參數(shù)2設置為true,對象中host正確解析。
2.format:格式化 顧名思義,作用是生成一個鏈接(將對象解析成定位串)
eg: url.format({
protocol: 'http:',
slashes: true,
auth: null,
host: 'www.imooc.com',
port: null,
hostname: 'www.imooc.com',
hash: null,
search: null,
query: null,
pathname: '/video/6710',
path: '/video/6710',
href: 'http://www.imooc.com/video/6710' })
3.resolve: 將一個基本url和指定超鏈接目標url合并
二.QueryString參數(shù)處理小利器
querystring.stringify(obj,para1,para2)://將對象轉(zhuǎn)化成url中query部分的形式
參數(shù):1.要轉(zhuǎn)化的對象
2.鏈接符(默認&)
3.鍵與值之間的符號(默認=)
querystring.parse(string,para1,para2)//將query字符串轉(zhuǎn)化成對象(反序列化)
參數(shù):
1.query字符串
2.鏈接符(默認&)
3.鍵與值之間的符號(默認=)
4.參數(shù)的個數(shù)(默認最多1000個,0就沒有限制)
querystring.escape(string)//文字轉(zhuǎn)譯
querystring.unescape(string)//反轉(zhuǎn)譯
三. HTTP知識先填坑
什么是HTTP?
是一種協(xié)議,計算機要共同遵從這種規(guī)則,才能相互通信。
·http客戶端發(fā)起請求,創(chuàng)建端口
·http服務器在端口監(jiān)聽客戶請求
·http服務器向客戶端返回狀態(tài)和內(nèi)容
用瀏覽器打開一個網(wǎng)站,http走過的環(huán)節(jié)
一、首先,對網(wǎng)站進行DNS域名解析
1、瀏覽器搜索自身的DNS緩存-》
2、搜索操作系統(tǒng)自身的DNS緩存(瀏覽器沒有找到緩存或過期)-》
3、讀取本地的HOST文件-》
4、瀏覽器發(fā)起一個DNS的一個系統(tǒng)調(diào)用{
4.1寬帶運營商服務器查看本身緩存-》
4.2運營商服務器發(fā)起一個迭代DNS解析的請求(根域->頂級域->域名注冊商(IP地址))
4.3運營商服務器把結(jié)果返回給操作系統(tǒng)內(nèi)核同時緩存起來
4.4操作系統(tǒng)內(nèi)核把結(jié)果返回給瀏覽器
}
5、讓瀏覽器拿到網(wǎng)站的IP地址,DNS解析完成,發(fā)起HTTP"三次握手"
6、TCP/IP連接建立起來后,瀏覽器就可以向服務器發(fā)送HTTP請求,比方說,用HTTP的GET方法請求一個根域里的一個域名,協(xié)議可以采用HTTP1.0的一個協(xié)議
7、服務器端接受到了這個請求,根據(jù)路徑參數(shù),經(jīng)過后端的一些處理之后,把處理后的一個結(jié)果的數(shù)據(jù)返回給瀏覽器。(這時會把網(wǎng)站完整的HTML頁面代碼返回給瀏覽器)
8、瀏覽器拿到了網(wǎng)站的完整的HTML頁面代碼,在解析和渲染這個頁面的時候,里面的JS、CSS、圖片靜態(tài)資源,他們同樣也是一個個HTTP請求,都需要經(jīng)過上面的主要的七個步驟.
9、瀏覽器根據(jù)拿到的資源對頁面進行渲染,最終把一個完整的頁面呈現(xiàn)給了用戶
HTTP流程可分為請求/響應兩部分
HTTP的組成:{
HTTP頭:發(fā)送的是一些附加的信息:內(nèi)容類型服務器發(fā)送響應的日期,HTTP狀態(tài)碼
正文信息:用戶提交的表單信息
}
//筆記二
一、域名解析
- 瀏覽器先搜索自身的DNS緩存
2.搜索操作系統(tǒng)的自身的DNS緩存(瀏覽器緩存失效的時候)
3.讀取本地的HOST文件
4.瀏覽器發(fā)起一個dns系統(tǒng)請求。
5、寬帶運營商服務器查看本身緩存。
6、運營商服務器發(fā)起一個迭代DNS解析的請求(根域,頂級域,域名注冊商),最后返回結(jié)果給操作系統(tǒng)內(nèi)核,同時進行緩存。
7、操作系統(tǒng)把結(jié)果返回瀏覽器。
以上是讓瀏覽器拿到IP地址,DNS解析完成。
二.然后,在瀏覽器獲得域名的IP地址后,發(fā)起“三次握手”,建立TCP/IP連接。
三、在TCP/IP連接建立起來后,瀏覽器就可以向服務器發(fā)送HTTP請求了。比如,用HTTP的GET方法請求一個根域里的某個域名,協(xié)議可以采用HTTP 1.0 。
四、服務器端接受這個請求,根據(jù)路徑參數(shù),經(jīng)過后端的一些處理之后,把處理后的一個結(jié)果以數(shù)據(jù)的形式返回給瀏覽器,如果是imooc.com網(wǎng)站的頁面,服務器就會把完整的HTML頁面代碼返回給瀏覽器。
五、瀏覽器拿到了慕課網(wǎng)的完整的HTML頁面代碼,在解析和渲染這個頁面的時候,里面的JS、CSS、圖片靜態(tài)資源,同樣也是一個個HTTP請求,都需要經(jīng)歷以上的步驟
六、瀏覽器根據(jù)拿到的資源對頁面進行渲染,最終把一個完整的頁面呈現(xiàn)給了用戶
//筆記四
Timing資源加載所要耗費的時間線
·Stalled:等待時機,瀏覽器要發(fā)生請求,到能發(fā)出請求的時間。不包括DNS查詢和連接建立時間
·Proxy negotiation:代理協(xié)商的時間
·Request sent:請求時間。從請求報文的第一個字節(jié)發(fā)出,到最后一個字節(jié)發(fā)送完畢的時間
·Waiting(TTFB):請求發(fā)出后至收到第一個字節(jié)響應的時間
Content Download:從接受到響應第一個字節(jié)開始到最后一個字節(jié)結(jié)束花費的時間
http請求方法:
·Get:獲取,讀取數(shù)據(jù)
·Post:提交資源
·Put:更新
·Delete:刪除
·Head 與get方法相同,但服務器不傳回資源
狀態(tài)碼:服務器端返回瀏覽器,告知瀏覽器請求成功或失敗的信息
·1XX請求已經(jīng)接受
·2XX請求成功并處理成功
·3XX重定向
·4XX客戶端錯誤
·5XX服務器端錯誤
200:OK,請求成功
400:客戶端請求有語法錯誤
401:請求未經(jīng)授權(quán)
403:收到請求,但不提供服務
404:資源未找到
500:服務器端未知錯誤
503:服務器端當前不能處理請求
四.事件回調(diào)進階
HTTP 概念進階
- 什么是回調(diào)?
回調(diào)是異步編程時的基礎,將后續(xù)邏輯封裝成起始函數(shù)的參數(shù),逐層嵌套 - 什么是同步/異步?
同步是指:發(fā)送方發(fā)出數(shù)據(jù)后,等接收方發(fā)回響應以后才發(fā)下一個數(shù)據(jù)包的通訊方式。
異步是指:發(fā)送方發(fā)出數(shù)據(jù)后,不等接收方發(fā)回響應,接著發(fā)送下個數(shù)據(jù)包的通訊方式。 - 什么是I/O?
磁盤的寫入(in)磁盤的讀取(out) - 什么的單線程/多線程?
一次只能執(zhí)行一個程序叫做單線程
一次能執(zhí)行多個程序叫多線程 - 什么是阻塞/非阻塞?
阻塞:前一個程序未執(zhí)行完就得一直等待
非阻塞:前一個程序未執(zhí)行完時可以掛起,繼續(xù)執(zhí)行其他程序,等到使用時再執(zhí)行 - 什么是事件?
一個觸發(fā)動作(例如點擊按鈕) - 什么是事件驅(qū)動?
一個觸發(fā)動作引起的操作(例如點擊按鈕后彈出一個對話框) - 什么是基于事件驅(qū)動的回調(diào)?
為了某個事件注冊了回調(diào)函數(shù),但是這個回調(diào)函數(shù)不是馬上執(zhí)行,只有當事件發(fā)生的時候,才會調(diào)用回調(diào)函數(shù),這種函數(shù)執(zhí)行的方式叫做事件驅(qū)動~這種注冊回調(diào)就是基于事件驅(qū)動的回調(diào),如果這些回調(diào)和異步I/O(數(shù)據(jù)寫入、讀取)操作有關(guān),可以看作是基于回調(diào)的異步I/O,只不過這種回調(diào)在nodejs中是有事件來驅(qū)動的 -
什么是事件循環(huán)?
//事件循環(huán)Eventloop,倘若有大量的異步操作,一些I/O的耗時操作,甚至是一些定時器控制的延時操作,它們完成的時候都要調(diào)用相應的回調(diào)函數(shù),從而來完成一些密集的任務,而又不會阻塞整個程序執(zhí)行的流程,此時需要一種機制來管理,這種機制叫做事件循環(huán).
總而言之就是:管理大量異步操作的機制叫做事件循環(huán)Event Loop:
回調(diào)函數(shù)隊列。異步執(zhí)行的函數(shù)會被壓入這個隊列; 隊列被循環(huán)查詢。
回調(diào)函數(shù)實例
異步實例
五.HTTP 源碼解讀之先了解作用域、上下文
Nodejs適合于高并發(fā)、I/O密集操作。
HTTP源碼解讀
什么是作用域?
與調(diào)用函數(shù),訪問變量的能力有關(guān)。
作用域分為:局部和全局(在局部作用域里可以訪問到全局作用域的變量,但在局部作用域外面就訪問不到局部作用域里面所設定的變量)
什么是上下文?
與this關(guān)鍵字有關(guān),是調(diào)用當前可執(zhí)行的代碼的引用,this總是指向調(diào)用這個方法的對象
js里的this通常是當前函數(shù)的擁有者
this是js的一個關(guān)鍵字,代表函數(shù)運行時自動生成的一個內(nèi)部對象,只能在函數(shù)內(nèi)部使用
this指向當前function的擁有者。即上下文,call和apply可以改變上下文。
this實例
六.HTTP源碼解讀
gtuhub倉庫主頁按T可以呼出搜索