2019 é¢è¯åå¤ - JS 鲿ä¸èæµ
Hello å°ä¼ä¼´ä»¬ï¼å¦æè§å¾æ¬æè¿ä¸éï¼è®°å¾ç»ä¸ª star ï¼ ä½ ä»¬ç star æ¯æå¦ä¹ çå¨åï¼GitHub å°å
æ¬ææ¶åç¥è¯ç¹ï¼
- 鲿ä¸èæµ
- éç»ä¸åæµ
- æµè§å¨è§£æ URL
- DNS ååè§£æ
- TCP 䏿¬¡æ¡æä¸åæ¬¡æ¥æ
- æµè§å¨æ¸²æé¡µé¢
卿¬æä¸ï¼jsliang ä¼è®²è§£éè¿èªææ¢ç´¢åå ³äºä¸è¿°ç¥è¯ç¹ç个人çè§£ï¼å¦æçº°æ¼ãç忽æè è¯¯è§£ï¼æ¬¢è¿åä½å°ä¼ä¼´çè¨æåºã
妿å°ä¼ä¼´å¯¹æç« åæçé®ï¼æ³å¿«éå¾å°åå¤ã
æè å°ä¼ä¼´å¯¹ jsliang 个人çåç«¯ææ¡£åºæå ´è¶£ï¼ä¹æ³å°èªå·±çå端ç¥è¯æ´çåºæ¥ã
欢è¿å QQ 群ä¸èµ·æ¢è®¨ï¼798961601
ã
ä¸ ç®å½
ä¸æè ¾çå端ï¼åå¸é±¼æä»ä¹åºå«
äº åè¨
å¨å·¥ä½ä¸ï¼æä»¬å¯è½ç¢°å°è¿æ ·çé®é¢ï¼
- ç¨æ·å¨æç´¢çæ¶åï¼å¨ä¸åæ²åï¼å¦ææ¯æ²ä¸ä¸ªåæä»¬å°±è¦è°ä¸æ¬¡æ¥å£ï¼æ¥å£è°ç¨å¤ªé¢ç¹ï¼ç»å¡ä½äºã
- ç¨æ·å¨é 读æç« çæ¶åï¼æä»¬éè¦çå¬ç¨æ·æ»å¨å°äºåªä¸ªæ é¢ï¼ä½æ¯æ¯æ»å¨ä¸ä¸å°±çå¬ï¼é£æ ·ä¼å¤ªè¿é¢ç¹ä»èå å åï¼å¦æåå ä¸å ¶ä»çä¸å¡ä»£ç ï¼å°±å¡ä½äºã
æä»¥ï¼è¿æ¶åï¼æä»¬å°±è¦ç¨å° 鲿ä¸èæµ äºã
é£ä¹ï¼è®²å° 鲿ä¸èæµï¼æä»¬å¯ä»¥é¡ºå¸¦æ¢ç§ä¸ éç»ä¸åæµã
说起 éç»ä¸åæµï¼æä»¬å°±é¡ºå¸¦æ æµè§å¨è¾å ¥ URL ååççäºæ ä¹å ³æ³¨ä¸ä¸ï¼ä»èå¼åº DNSãTCP çç¥è¯ç¹ï¼æç»ä¸²èµ·æ¥æææ¬æçè½®å»ï¼æ¹ä¾¿ jsliang åå°ä¼ä¼´ä»¬å¯¹è¿åç¥è¯çæ´çä¸è®°å¿ã
ä¸ é²æä¸èæµ
éè¿ä»£ç å»äºè§£ææ ·äºç©ï¼å¾å¾æ¯äºè§£æä¸ªç¥è¯ç¹æå¿«çå½¢å¼ã
3.1 鲿
ä¸é¢æä»¬ææ®µé²æå°æ¡ä¾ä»£ç ã
妿å°ä¼ä¼´ä»¬æå¤´æçµèï¼å¹¶æå ´è¶£æ³å èªå·±æèä¸ä»ä¹æ¯é²æãå¯ä»¥å°ä»£ç å¤å¶å°æµè§å¨ï¼å°è¯ç¹å»æé®ï¼å¹¶å ³æ³¨ä¸æ§å¶å°ï¼çç Console æ¯å¦ä½æå°çã
妿å°ä¼ä¼´ä»¬æå¤´æ²¡æçµèï¼é£ä¹å±ä¸èµ·å ç ç 代ç å®ç°ï¼åççä¸é¢ GIF æ¼ç¤ºãï¼è¿æ ·æææ²¡æèªå·±æ²çç´ç½ææï¼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>鲿</title>
</head>
<body>
<button id="debounce">ç¹æé²æï¼</button>
<script>
window.onload = function() {
// 1ãè·åè¿ä¸ªæé®ï¼å¹¶ç»å®äºä»¶
var myDebounce = document.getElementById("debounce");
myDebounce.addEventListener("click", debounce(sayDebounce));
}
// 2ã鲿åè½å½æ°ï¼æ¥åä¼ å
function debounce(fn) {
// 4ãå建ä¸ä¸ªæ è®°ç¨æ¥åæ¾å®æ¶å¨çè¿åå¼
let timeout = null;
return function() {
// 5ãæ¯æ¬¡å½ç¨æ·ç¹å»/è¾å
¥çæ¶åï¼æåä¸ä¸ªå®æ¶å¨æ¸
é¤
clearTimeout(timeout);
// 6ãç¶åå建ä¸ä¸ªæ°ç setTimeoutï¼
// è¿æ ·å°±è½ä¿è¯ç¹å»æé®åç interval é´éå
// å¦æç¨æ·è¿ç¹å»äºçè¯ï¼å°±ä¸ä¼æ§è¡ fn 彿°
timeout = setTimeout(() => {
fn.call(this, arguments);
}, 1000);
};
}
// 3ãéè¦è¿è¡é²æçäºä»¶å¤ç
function sayDebounce() {
// ... æäºéè¦é²æçå·¥ä½ï¼å¨è¿éæ§è¡
console.log("鲿æåï¼");
}
</script>
</body>
</html>
å¤å¶ä»£ç
å¾å¥½ï¼ç¸ä¿¡å°ä¼ä¼´ä»¬å·²ç»çå®äºä»£ç ï¼ä¸é¢æä»¬ççå®çæ¼ç¤ºï¼
è¿æ¶åï¼æä»¬å¯ä»¥æåºé²æçæ¦å¿µäºï¼
- 鲿ï¼ä»»å¡é¢ç¹è§¦åçæ åµä¸ï¼åªæä»»å¡è§¦åçé´éè¶ è¿æå®é´éçæ¶åï¼ä»»å¡æä¼æ§è¡ã
ç»åä¸é¢ç代ç ï¼æä»¬å¯ä»¥äºè§£å°ï¼å¨è§¦åç¹å»äºä»¶åï¼å¦æç¨æ·å次ç¹å»äºï¼æä»¬ä¼æ¸ 空ä¹åç宿¶å¨ï¼éæ°çæä¸ä¸ªå®æ¶å¨ãææå°±æ¯ï¼è¿ä»¶äºå¿éè¦çå¾ ï¼å¦æä½ åå¤å¬ä¿ï¼æå°±éæ°è®¡æ¶ï¼
空讲æ çï¼show you åºæ¯ï¼
- æä¸ªè¾å ¥æ¡ï¼è¾å ¥ä¹åä¼è°ç¨æ¥å£ï¼è·åèæ³è¯ã使¯ï¼å 为é¢ç¹è°ç¨æ¥å£ä¸å¤ªå¥½ï¼æä»¥æä»¬å¨ä»£ç ä¸ä½¿ç¨é²æåè½ï¼åªæå¨ç¨æ·è¾å ¥å®æ¯ç䏿®µæ¶é´åï¼æä¼è°ç¨æ¥å£ï¼åºç°èæ³è¯ã
å°ä¼ä¼´ä»¬å¯ä»¥å°è¯ççä¸é¢çæ¡ä¾ï¼å èªå·±å®ç°ä¸éè¿ä¸ªåºæ¯çè§£å³ï¼å¦ææè§ä¸è¡ï¼é£å°±çï¼ã鲿åèæµçåºç¨åºæ¯åå®ç°ã
ç¥è¯ç¹è¡¥å ï¼ä½ä¸º
arguments
ï¼
é¦å ï¼å端转å端çåå¦ï¼å¯ä»¥å°arguments
ç解为è½å®ç°éè½½å½æ°åè½çå·¥å ·ã
ç¶åï¼æä»¬ä¸¾ä¸ªä¾åï¼å¨function test()
è¿ä¸ªæ¹æ³ä¸ï¼ç±äºæä»¬ä¸ç¡®å®åéæå¤å°ï¼æ¯å¦test("jsliang", 24)
ï¼åæètest("LiangJunrong", "jsliang", "24")
ï¼è¿æ¶ååªéè¦å¨å½æ°test
ä¸ç¨arguments
æ¥æ¶å°±è¡äºã
æåï¼å¨function test() { let arr1 = argument[0] }
ä¸ï¼arr1
å°±å¯ä»¥è·åå°ä¼ è¿æ¥ç第ä¸ä¸ªåéã
æä»¥ï¼fn.call(this, arguments)
å ¶å®æ¯å°ä¸ç¡®å®åéæ¿æ¢å°å½æ°ä¸äºã
åèèµæ 1ï¼ãé²è JS ä¸ç apply å callã
åèèµæ 2ï¼ãjs ä¸ arguments çç¨æ³ã
3.2 èæµ
说å®é²æï¼ä¸é¢æä»¬è®²è®²èæµï¼è§ç©å°±ä¸è¯´äºï¼å ä¸ä»£ç ï¼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>èæµ</title>
</head>
<body>
<button id="throttle">ç¹æèæµï¼</button>
<script>
window.onload = function() {
// 1ãè·åæé®ï¼ç»å®ç¹å»äºä»¶
var myThrottle = document.getElementById("throttle");
myThrottle.addEventListener("click", throttle(sayThrottle));
}
// 2ãèæµå½æ°ä½
function throttle(fn) {
// 4ãéè¿éå
ä¿åä¸ä¸ªæ è®°
let canRun = true;
return function() {
// 5ãå¨å½æ°å¼å¤´å¤ææ å¿æ¯å¦ä¸º trueï¼ä¸ä¸º true å䏿彿°
if(!canRun) {
return;
}
// 6ãå° canRun 设置为 falseï¼é²æ¢æ§è¡ä¹åå被æ§è¡
canRun = false;
// 7ã宿¶å¨
setTimeout( () => {
fn.call(this, arguments);
// 8ãæ§è¡å®äºä»¶ï¼æ¯å¦è°ç¨å®æ¥å£ï¼ä¹åï¼éæ°å°è¿ä¸ªæ å¿è®¾ç½®ä¸º true
canRun = true;
}, 1000);
};
}
// 3ãéè¦èæµçäºä»¶
function sayThrottle() {
console.log("èæµæåï¼");
}
</script>
</body>
</html>
å¤å¶ä»£ç
å¾å¥½ï¼çå®ä»£ç çå°ä¼ä¼´åºè¯¥å¤§è´æ¸ æ¥æ¯æä¹åäºäºï¼ä¸é¢æä»¬ç GIF å®ç°ï¼
çå®ä»£ç å GIF å®ç°ï¼æä»¬å¯ä»¥æç½ï¼èæµå³æ¯ï¼
- èæµï¼æå®æ¶é´é´éå åªä¼æ§è¡ä¸æ¬¡ä»»å¡ã
é£ä¹ï¼èæµå¨å·¥ä½ä¸çåºç¨ï¼
- æå è½½è¦çå¬è®¡ç®æ»å¨æ¡çä½ç½®ï¼ä½¿ç¨èæµæä¸å®æ¶é´çé¢çè·åã
- ç¨æ·ç¹å»æäº¤æé®ï¼å设æä»¬ç¥éæ¥å£å¤§è´çè¿åæ¶é´çæ åµä¸ï¼æä»¬ä½¿ç¨èæµï¼åªå 许ä¸å®æ¶é´å ç¹å»ä¸æ¬¡ã
è¿æ ·ï¼å¨æäºç¹å®çå·¥ä½åºæ¯ï¼æä»¬å°±å¯ä»¥ä½¿ç¨é²æä¸èæµæ¥åå°ä¸å¿ è¦çæèã
é£ä¹é®é¢æ¥äºï¼å设é¢è¯å®å¬å°ä½ è¿å¥è¯ï¼æ¯ä¸æ¯ä¼æ¥çé®ä¸å¥ï¼â为ä»ä¹è¯´ä¸é¢çåºæ¯ä¸èå¶ä¼é æè¿å¤æèå¢ï¼â
OKï¼è¿å°±æ¶åå°æµè§å¨æ¸²æé¡µé¢çæºå¶äºâ¦â¦
å éç»ä¸åæµ
å¨è¯´æµè§å¨æ¸²æé¡µé¢ä¹åï¼æä»¬éè¦å äºè§£ä¸¤ä¸ªç¹ï¼ä¸ä¸ªå« æµè§å¨è§£æ URLï¼å¦ä¸ä¸ªå°±æ¯æ¬ç« èå°æ¶åç éç»ä¸åæµï¼
- éç»(repaint)ï¼å½å ç´ æ ·å¼çæ¹åä¸å½±åå¸å±æ¶ï¼æµè§å¨å°ä½¿ç¨éç»å¯¹å ç´ è¿è¡æ´æ°ï¼æ¤æ¶ç±äºåªéè¦ UI å±é¢çéæ°åç´ ç»å¶ï¼å æ¤æèè¾å°ã
常è§çéç»æä½æï¼
- æ¹åå ç´ é¢è²
- æ¹åå ç´ èæ¯è²
- more â¦â¦
- åæµ(reflow)ï¼åå«éæï¼layoutï¼ãå½å ç´ ç尺寸ãç»ææè 触åæäºå±æ§æ¶ï¼æµè§å¨ä¼éæ°æ¸²æé¡µé¢ï¼ç§°ä¸ºåæµãæ¤æ¶ï¼æµè§å¨éè¦éæ°ç»è¿è®¡ç®ï¼è®¡ç®åè¿éè¦éæ°é¡µé¢å¸å±ï¼å æ¤æ¯è¾éçæä½ã
常è§çåæµæä½æï¼
- 页é¢å次渲æ
- æµè§å¨çªå£å¤§å°æ¹å
- å ç´ å°ºå¯¸/ä½ç½®/å 容åçæ¹å
- å ç´ åä½å¤§å°åå
- æ·»å æè å é¤å¯è§ç DOM å ç´
- ** CSS 伪类ï¼:hoverâ¦â¦ï¼
- more â¦â¦
- éç¹ï¼åæµå¿ å®ä¼è§¦åéç»ï¼éç»ä¸ä¸å®ä¼è§¦ååæµãéç»çå¼éè¾å°ï¼åæµç代价è¾é«ã
çå°è¿éï¼å°ä¼ä¼´ä»¬å¯è½æç¹æµé¼ï¼ä½ ååè¿è·æè®²ç 鲿ä¸èæµ ï¼æä¹ä¸ä¸åè·³å° éç»ä¸åæµ äºï¼
OKï¼åä¸ªå ³åï¼å çä¸é¢åºæ¯ï¼
- çé¢ä¸æä¸ª div æ¡ï¼ç¨æ·å¯ä»¥å¨ input æ¡ä¸è¾å ¥ div æ¡çä¸äºä¿¡æ¯ï¼ä¾å¦å®½ãé«çï¼è¾å ¥å®æ¯ç«å³æ¹å屿§ã使¯ï¼å 为æ¹åä¹åè¿è¦éæ¶åå¨å°æ°æ®åºä¸ï¼æä»¥éè¦è°ç¨æ¥å£ã妿ä¸å éå¶â¦â¦
çå°è¿éï¼å°ä¼ä¼´ä»¬å¯ä»¥å°ä¸äºåç¼ç»åèµ·æ¥äºï¼ä¸ºä»ä¹éè¦ èæµï¼å 为æäºäºæ ä¼é ææµè§å¨ç åæµï¼è åæµ ä¼ä½¿æµè§å¨å¼éå¢å¤§ï¼æä»¥æä»¬éè¿ èæµ æ¥é²æ¢è¿ç§å¢å¤§æµè§å¨å¼éçäºæ ã
形象å°ç¨å¾æ¥è¯´æï¼
è¿æ ·ï¼æä»¬å°±å¯ä»¥å½¢è±¡çå° é²æä¸èæµ ä¸ éç»ä¸åæµ ç»åèµ·æ¥è®°å¿èµ·æ¥ã
é£ä¹ï¼å¨å·¥ä½ä¸æä»¬è¦å¦ä½é¿å 大é使ç¨éç»ä¸åæµå¢ï¼ï¼
- é¿å é¢ç¹æä½æ ·å¼ï¼å¯æ±æ»åç»ä¸ä¸æ¬¡ä¿®æ¹
- å°½éä½¿ç¨ class è¿è¡æ ·å¼ä¿®æ¹ï¼è䏿¯ç´æ¥æä½æ ·å¼
- åå° DOM çæä½ï¼å¯ä½¿ç¨åç¬¦ä¸²ä¸æ¬¡æ§æå ¥
OKï¼è³æ¤æä»¬å°±è®²å®ä¸¤ä¸ªé¨åäºï¼é£ä¹é®é¢åæ¥äºï¼âæµè§å¨æ¸²æè¿ç¨ä¸ï¼æ¯ä¸æ¯ä¹æéç»ä¸åæµï¼ââ仿µè§å¨è¾å ¥ URL å°æ¸²ææåçè¿ç¨ä¸ï¼ç©¶ç«åçäºä»ä¹ï¼â
æä»¬ï¼ç»§ç»æ·±å ¥æ¢ç´¢â¦â¦
äº æµè§å¨è§£æ URL
为äºè½è®©æä»¬çç¥è¯å±é¢çèµ·æ¥æ´ææ·±åº¦ï¼æä»¬åºè¯¥èèä¸é¢ä¸¤ä¸ªé®é¢äºï¼
- 仿µè§å¨è¾å ¥ URL å°æ¸²ææåçè¿ç¨ä¸ï¼ç©¶ç«åçäºä»ä¹ï¼
- æµè§å¨æ¸²æè¿ç¨ä¸ï¼åçäºä»ä¹ï¼æ¯ä¸æ¯ä¹æéç»ä¸åæµï¼
OKï¼å ´è´æ¥äºï¼æä»¬å°±å ä» æµè§å¨è§£æ URL çèµ·ï¼å æ¥ççå½ç¨æ·è¾å ¥ URLï¼å°æµè§å¨åç°ç»ç¨æ·é¡µé¢ï¼ç»åäºä»¥ä¸è¿ç¨ï¼
- çæ¬ Aï¼
- ç¨æ·è¾å ¥ URL å°åã
- 对 URL å°åè¿è¡ DNS ååè§£æã
- å»ºç« TCP è¿æ¥ï¼ä¸æ¬¡æ¡æï¼ã
- æµè§å¨åèµ· HTTP è¯·æ±æ¥æã
- æå¡å¨è¿å HTTP ååºæ¥æã
- å ³é TCP è¿æ¥ï¼åæ¬¡æ¥æï¼ã
- æµè§å¨è§£æææ¡£èµæºå¹¶æ¸²æé¡µé¢ã
讲å°è¿éï¼çªç¶æ³èµ·ä¸ä¸ªå¯¹è¯ï¼
å¦çï¼âèå¸ï¼è¿é¨è¯¾çèè¯éç¹æ¯ä»ä¹ï¼â
èå¸ï¼âå ¨é½æ¯éç¹ï¼â
enm...èå¸ä¼ä¸ä¼è¢«ææä¸ç¥éï¼ä½æ¯ jsliang è¿æ ·åä¼è¢«æ¼æå°±æ¸ æ¥ï¼æä»¥ï¼å±è¿æ¯ç»åä¸é¢çå¾ï¼è¿ä¸æ¥å¾åæä»¬çç»æï¼
å¾å¥½ï¼jsliang æè§èªå·±çç»å¾ææ¯åè¿äºä¸æ¥~
â ï¼è½ç¶å¾ææ¿ç½ä¸æé£ä¹å¤çæç« å¯ä»¥åèï¼ä½æ¯å¨ææ¥äºäºåæ¥ç¯æç« åï¼jsliang è§å¾è¿é¨ååæå «ä¹æé®é¢æï¼é®äºäºå°ä¼ä¼´ï¼å®ä»¬æçè¯´å¯¹ï¼æç说éãä¸è¿ï¼ä¸å¦¨ç¢å°ä¼ä¼´ä»¬ç»§ç»å¾ä¸çåã
â¡ï¼ä¸ºäºé¿å åºç¯åï¼ä¸é¢è´´åºå¦å¤ä¸ä¸ªçæ¬ï¼å°ä¼ä¼´ä»¬å¯ä»¥å¨è¯è®ºåºè¯´åºä½ æ¯æåªä¸ªçæ¬åï¼
- çæ¬ B
- ç¨æ·è¾å ¥ URL å°åã
- 对 URL å°åè¿è¡ DNS ååè§£æã
- è¿è¡ TCP è¿æ¥ã
- è¿è¡ HTTP æ¥æç请æ±ä¸ååºã
- æµè§å¨è§£æææ¡£èµæºå¹¶æ¸²æé¡µé¢ã
å¨è¿éæä»¬å¯ä»¥æ¸ æ°çäºè§£å°ä» ç¨æ·è¾å ¥ URLï¼å°æµè§å¨åç°ç»ç¨æ·é¡µé¢ï¼ç»åäºåªäºè¿ç¨ã
é£ä¹å©ä¸çå°±ç®åäºï¼
- ä»ä¹æ¯ DNS è§£æï¼å®æ¯æä¹ä¸ªæµç¨ï¼
- ä»ä¹æ¯ TCP 䏿¬¡æ¡æï¼ä»ä¹æ¯ TCP 忬¡æ¥æï¼å®ä»¬çæµç¨æ¯ææ ·çï¼
- æµè§å¨è§£æææ¡£èµæºå¹¶æ¸²æé¡µé¢æ¯ä¸ªææ ·çæµç¨ï¼
Let's go~ 鿥宿ä¸é¢ä¸ä¸ªç¥è¯ç¹ï¼
åèæç® 1ï¼ãç½é¡µè§£æçå ¨è¿ç¨(è¾å ¥urlå°å±ç¤ºé¡µé¢)ã
åèæç® 2ï¼ãæµè§å¨æ¸²æé¡µé¢è¿ç¨åæã
å DNS ååè§£æ
é¦å ï¼æä»¬è§£å³ç¬¬ä¸ä¸ªé®é¢ï¼
- ä»ä¹æ¯ DNS è§£æï¼å®æ¯æä¹ä¸ªæµç¨ï¼
DNSï¼Domain Name Systemï¼æ¯ ååç³»ç» çè±æç¼©åï¼æä¾çæå¡æ¯ç¨äºå°ä¸»æºåååå转æ¢ä¸º IP å°åçå·¥ä½ï¼
ååï¼http://jsliang.top
<---> DNS <---> IPV4ï¼119.147.15.13
IPV4 æ¯é åçï¼ä» ç¨æ¥è¯´æ DNS è§£æåè½è¿å IP å°å
æä»¥ï¼å½ç¨æ·å¨æµè§å¨è¾å
¥ http://jsliang.top
æ¶ï¼DNS ç»åäºä»¥ä¸æ¥éª¤ï¼
- æµè§å¨æ ¹æ®å°åï¼å¨èªèº«ç¼å䏿¥æ¾ DNSï¼ååæå¡å¨ï¼ ä¸çè§£æè®°å½ã妿åå¨ï¼åç´æ¥è¿å IP å°åï¼å¦æä¸åå¨ï¼åæ¥æ¾æä½ç³»ç»ä¸ç hosts æä»¶æ¯å¦æè¯¥ååç DNS è§£æè®°å½ï¼å¦ææå°±è¿åã
- 卿¡ä»¶ 1 ä¸çæµè§å¨ç¼åæè æä½ç³»ç»ç hosts æä»¶ä¸é½æ²¡æè¿ä¸ªååç DNS è§£æè®°å½ï¼æè å·²ç»è¿æï¼ååååæå¡å¨å起请æ±è§£æè¿ä¸ªååã
- å 忬å°ååæå¡å¨ä¸è¯·æ±ï¼è®©å®è§£æè¿ä¸ªååï¼å¦æè§£æä¸äºï¼ååæ ¹ååæå¡å¨è¯·æ±è§£æã
- æ ¹æå¡å¨ç»æ¬å°ååæå¡å¨è¿åä¸ä¸ªä¸»ååæå¡å¨ã
- æ¬å°ååæå¡å¨å主ååæå¡å¨åèµ·è§£æè¯·æ±ã
- 主ååæå¡å¨æ¥æ¶å°è§£æè¯·æ±åï¼æ¥æ¾å¹¶è¿ååå对åºçååæå¡å¨çå°åã
- ååæå¡å¨ä¼æ¥è¯¢åå¨çååå IP çæ å°å ³ç³»è¡¨ï¼è¿åç®æ IP è®°å½ä»¥åä¸ä¸ª TTLï¼Time To Liveï¼å¼ã
- æ¬å°ååæå¡å¨æ¥æ¶å° IP å TTL å¼ï¼è¿è¡ç¼åï¼ç¼åçæ¶é´ç± TTL 弿§å¶ã
- å°è§£æçç»æè¿åç»ç¨æ·ï¼ç¨æ·æ ¹æ® TTL å¼ç¼å卿¬å°ç³»ç»ç¼åä¸ï¼ååè§£æè¿ç¨ç»æã
çæåæ»æ¯é¾ä»¥çè§£çï¼è·ç jsliang ç»å¼ å¾è¿ä¸éï¼å°±æè§æ¸ æ°äºï¼
ä¸ TCP 䏿¬¡æ¡æä¸åæ¬¡æ¥æ
ç¶åï¼æä»¬è§£å³ç¬¬äºä¸ªé®é¢ï¼
- ä»ä¹æ¯ TCP 䏿¬¡æ¡æï¼ä»ä¹æ¯ TCP 忬¡æ¥æï¼å®ä»¬çæµç¨æ¯ææ ·çï¼
ä»ä¹æ¯ TCP å¢ï¼TCPï¼Transmission Control Protocol ä¼ è¾æ§å¶åè®®ï¼æ¯ä¸ç§é¢åè¿æ¥çãå¯é çãåºäºåèæµçä¼ è¾å±éä¿¡åè®®ã
ç®åæ¥è¯´ï¼å®çä½ç¨å°±æ¯å°æ°æ®æµä»ä¸å°ä¸»æºå¯é å°ä¼ è¾å°å¦ä¸å°ä¸»æºã
è³äºå ·ä½çå·¥ä½åçï¼è¿éææ¶æ¶åä¸å°ï¼æä»¬ç®ååªæ³ç¥é两个ç¹ï¼ä¸æ¬¡æ¡æä¸åæ¬¡æ¥æã
- 䏿¬¡æ¡æï¼
-
ç¬¬ä¸æ¬¡æ¡æï¼èµ·å两端é½å¤äº CLOSED å
³éç¶æï¼Client å°æ å¿ä½ SYN 置为 1ï¼éæºäº§çä¸ä¸ªå¼
seq = x
ï¼å¹¶å°è¯¥æ°æ®å åéç» Serverï¼Client è¿å ¥ SYN-SENT ç¶æï¼çå¾ Server 确认ã -
ç¬¬äºæ¬¡æ¡æï¼Server æ¶å°æ°æ®å
åç±æ å¿ä½
SYN = 1
å¾ç¥ Client 请æ±å»ºç«è¿æ¥ï¼Server å°æ å¿ä½ SYN å ACK é½ç½®ä¸º 1ï¼ack = x + 1
ï¼éæºäº§çä¸ä¸ªå¼seq = y
ï¼å¹¶å°è¯¥æ°æ®å åéç»Clientä»¥ç¡®è®¤è¿æ¥è¯·æ±ï¼Server è¿å ¥SYN-RCVD
ç¶æï¼æ¤æ¶æä½ç³»ç»ä¸ºè¯¥ TCP è¿æ¥åé TCP ç¼åååéã -
ç¬¬ä¸æ¬¡æ¡æï¼Client æ¶å°ç¡®è®¤åï¼æ£æ¥ seq æ¯å¦ä¸º
x + 1
ï¼ACK æ¯å¦ä¸º 1ï¼å¦ææ£ç¡®åå°æ å¿ä½ ACK 置为 1ï¼ack = y + 1
ï¼å¹¶ä¸æ¤æ¶æä½ç³»ç»ä¸ºè¯¥ TCP è¿æ¥åé TCP ç¼åååéï¼å¹¶å°è¯¥æ°æ®å åéç» Serverï¼Server æ£æ¥ ack æ¯å¦ä¸ºy + 1
ï¼ACK æ¯å¦ä¸º 1ï¼å¦ææ£ç¡®åè¿æ¥å»ºç«æåï¼Client å Server è¿å ¥ established ç¶æï¼å®æä¸æ¬¡æ¡æï¼éå Client å Server å°±å¯ä»¥å¼å§ä¼ è¾æ°æ®ã
æå太乱ï¼show you pictureï¼
- 忬¡æ¥æï¼
-
ç¬¬ä¸æ¬¡æ¥æï¼Client çåºç¨è¿ç¨å
åå
¶ TCP ååºè¿æ¥éæ¾æ¥ææ®µï¼
FIN = 1
ï¼åºå·seq = u
ï¼ï¼å¹¶åæ¢ååéæ°æ®ï¼ä¸»å¨å ³é TCP è¿æ¥ï¼è¿å ¥ FIN-WAIT-1ï¼ç»æ¢çå¾ 1ï¼ç¶æï¼çå¾ Server ç确认ã -
ç¬¬äºæ¬¡æ¥æï¼Server æ¶å°è¿æ¥éæ¾æ¥ææ®µåå³ååºç¡®è®¤æ¥ææ®µï¼ï¼
ACK = 1
ï¼ç¡®è®¤å·ack = u + 1
ï¼åºå·seq = v
ï¼ï¼Server è¿å ¥ CLOSE-WAITï¼å ³éçå¾ ï¼ç¶æï¼æ¤æ¶ç TCP å¤äºåå ³éç¶æï¼Client å° Server çè¿æ¥éæ¾ã
注ï¼Client æ¶å° Server ç确认åï¼è¿å ¥ FIN-WAIT-2ï¼ç»æ¢çå¾ 2ï¼ç¶æï¼çå¾ Server ååºçè¿æ¥éæ¾æ¥ææ®µã
-
ç¬¬ä¸æ¬¡æ¥æï¼Server å·²ç»æ²¡æè¦å Client ååºçæ°æ®äºï¼Server ååºè¿æ¥éæ¾æ¥ææ®µï¼
FIN = 1
ï¼ACK = 1
ï¼åºå·seq = w
ï¼ç¡®è®¤å·ack = u + 1
ï¼ï¼Server è¿å ¥ LAST-ACKï¼æå确认ï¼ç¶æï¼çå¾ Client ç确认ã -
ç¬¬åæ¬¡æ¥æï¼Client æ¶å° Server çè¿æ¥éæ¾æ¥ææ®µåï¼å¯¹æ¤ååºç¡®è®¤æ¥ææ®µï¼
ACK = 1
ï¼seq = u + 1
ï¼ack = w + 1
ï¼ï¼Client è¿å ¥ TIME-WAITï¼æ¶é´çå¾ ï¼ç¶æãæ¤æ¶ TCP æªéæ¾æï¼éè¦ç»è¿æ¶é´çå¾ è®¡æ¶å¨è®¾ç½®çæ¶é´ 2MSL åï¼Client æè¿å ¥ CLOSED ç¶æã
æå太乱ï¼show you pictureï¼
OKï¼è³æ¤æä»¬å°±çè§£äº TCP åå ¶ä¸æ¬¡æ¡æå忬¡æ¥æè¿ç¨ï¼ä¸ºäºæ¹ä¾¿å°ä¼ä¼´ä»¬å½¢è±¡è®°å¿ï¼jsliang æäºä¸ªå°æ äºï¼å¸æå°ä¼ä¼´ä»¬è½å æ·±å°è±¡ï¼
- 䏿¬¡æ¡æ + 忬¡æ¥æå½¢è±¡è®°å¿ï¼
- jsliangï¼ï¼å¯¹å¦¹åå起微信好åç³è¯·ï¼âä½ å¥½ï¼æå¯ä»¥å ä½ å¥½ååï¼â ââ ç¬¬ä¸æ¬¡æ¡æ
- 妹åï¼ï¼éè¿å®¡æ ¸ï¼âä½ å¥½ï¼å¾é«å ´è®¤è¯ä½ ~â ââ ç¬¬äºæ¬¡æ¡æ
- jsliangï¼âä½ å¥½ï¼æå«æ¢å³»è£ï¼å端æè ¾å°è½æâ¦â¦â ââ ç¬¬ä¸æ¬¡æ¡æ
- â¦â¦ï¼è天å 容ï¼
- â¦â¦â¦â¦ï¼è天å 容ï¼
- â¦â¦â¦â¦â¦â¦ï¼è天å 容ï¼
- â¦â¦â¦â¦ï¼è天å 容ï¼
- â¦â¦ï¼è天å 容ï¼
- jsliangï¼ï¼æåæäºå¼ 纸ç¯é½æ¯çº¸å·¾çå¾ï¼âåï¼å¥½é¾åä»å¤©ãâ ââ ç¬¬ä¸æ¬¡æ¥æ
- 妹åï¼âå§æ§½ï¼ä½ 好æ¶å¿ï¼â ââ ç¬¬äºæ¬¡æ¥æ
- 妹åï¼âå±è¿æ¯å½ä¸è®¤è¯å§ï¼äºå äºï¼è°¢è°¢ï¼â ââ ç¬¬ä¸æ¬¡æ¥æ
- jsliangï¼ï¼åï¼â䏿¯ï¼ä½ å¬æè¯´ï¼â ââ ç¬¬åæ¬¡æ¥æ
- 妹åï¼ï¼ææå é¤å¥½åï¼ ââ CLOSED
- jsliangï¼ï¼ï¼âæä»å¤©æåäºãâ 妹åå¼å¯äºå¥½åéªè¯ï¼ä½ è¿ä¸æ¯å¥¹å¥½åã请å åé好åéªè¯è¯·æ±ï¼å¯¹æ¹éªè¯éè¿åï¼æè½è天ãï¼ âââ CLOSED
OKï¼æååºç³ï¼ç¸ä¿¡å°ä¼ä¼´ä»¬æäºä¸ªå¾å¥½çäºè§£äºã
é£ä¹ï¼æä»¬ç»§ç»åè¡æ¢ç´¢ã
åèæç® 1ï¼ãTCP䏿¬¡æ¡æå忬¡æ¥æè¿ç¨ã
åèæç® 2ï¼ãTCPç䏿¬¡æ¡æä¸åæ¬¡æ¥æï¼è¯¦è§£+å¨å¾ï¼ã
å « æµè§å¨æ¸²æé¡µé¢
æåï¼æä»¬è§£å³ç¬¬ä¸ä¸ªé®é¢ï¼
- æµè§å¨è§£æææ¡£èµæºå¹¶æ¸²æé¡µé¢æ¯ä¸ªææ ·çæµç¨ï¼
è¯ä¸å¤è¯´ï¼ä¸èµ·æ¥çï¼
- æµè§å¨éè¿ HTMLParser æ ¹æ®æ·±åº¦éåçååæ HTML è§£ææ DOM Treeã
- æµè§å¨éè¿ CSSParser å° CSS è§£ææ CSS Rule Treeï¼CSSOM Treeï¼ã
- æµè§å¨å° JavaScript éè¿ DOM API æè CSSOM API å° JS 代ç è§£æå¹¶åºç¨å°å¸å±ä¸ï¼æè¦æ±åç°ååºçç»æã
- æ ¹æ® DOM æ å CSSOM æ æ¥æé render Treeã
- layoutï¼éæï¼ä¹å¯ä»¥å«åæµï¼ï¼å½ render tree ä¸ä»»ä¸èç¹çå ä½å°ºå¯¸åçæ¹åï¼render tree å°±ä¼éæ°å¸å±ï¼éæ°æ¥è®¡ç®ææèç¹å¨å±å¹çä½ç½®ã
- repaintï¼éç»ï¼å½ render tree ä¸ä»»ä¸å ç´ æ ·å¼å±æ§ï¼å ä½å°ºå¯¸æ²¡æ¹åï¼åçæ¹åæ¶ï¼render tree é½ä¼éæ°ç»ï¼æ¯å¦åä½é¢è²ï¼èæ¯çååã
- paintï¼éå render treeï¼å¹¶è°å¨ç¡¬ä»¶å¾å½¢ API æ¥ç»å¶æ¯ä¸ªèç¹ã
æå讲解è¯å®è¿æ¯ä¸å¤æ¸ æ°çï¼ä½æ¯ jsliang ç»äºå å¼ å¾ä¹ç´¯äºï¼æä»¥å±ä»¬ ç æ¥äºä¸å¼ å¾ï¼
è¿æ ·ï¼æä»¬å°±å¯¹ æµè§å¨æ¸²æé¡µé¢è¿ç¨ 䏿¸ äºæ¥å¦~
åèæç®ï¼ãä¸ç¯æç« æå®å端é¢è¯ã
ä¹ æ»ç»
è³æ¤ï¼æä»¬å顾ä¸èªå·±åäºä»ä¹ï¼
- æä»¬å¨å·¥ä½ä¸ç¢°å°ä¸äºé®é¢ï¼è¿äºé®é¢ä¼å¡ä½é¡µé¢ï¼äºæ¯æä»¬æ¥èµæï¼ç¥éæ³è¦åå°æµè§å¨çå¼éï¼æä»¬å°±éè¦ä½¿ç¨ 鲿ä¸èæµã
- ä½¿ç¨ é²æä¸èæµ è§£å³å®é®é¢åï¼æä»¬å¥½å¥ä¸ºä»ä¹ä¼æè¿æ ·çæä½ï¼äºæ¯æä»¬æ·±å ¥äºè§£äºä¸ éç»ä¸åæµã
- éç»ä¸åæµ åªåè¯äºæä»¬æµè§å¨å¨ CSS ä¸ç渲æï¼æä»¬éè¦è¿ä¸æ¥äºè§£ æµè§å¨æ¸²æé¡µé¢ ç详ç»è¿ç¨ï¼ä½æ´è±è¿æ¯è¦ä¸å±ä¸å±å¥å¼çï¼æä»¥æä»¬éè¦ä» æµè§å¨è§£æ URL å¼å§äºè§£ã
- å¨ æµè§å¨è§£æ URL ä¸ï¼æä»¬é¡ºå¸¦äºè§£ä¸ DNS ååè§£æãTCP 䏿¬¡æ¡æä¸åæ¬¡æ¥æ è¿ä¸¤ä¸ªç¥è¯ç¹ã
- æåï¼æä»¬ç»äºç¥éäº æµè§å¨æ¸²æé¡µé¢ æ¯æä¹ä¸åäºã
综ä¸ï¼å¦ææä»¬ä» ä» æ¯éè¦å ³æ³¨é¢è¯çä¸ä¸ªç¹ï¼æä»¬å¾å¯è½å 为ä¸ç¥å¤´å°¾ï¼è被é¢è¯å®é®å¾å壿 è¨ã
使¯ï¼å¦ææä»¬ç¥éä¸ä¸ªç¥è¯ç¹ï¼å¹¶å¯¹å ¶è¿è¡æè·¯åæ£ï¼æ·±å ¥å¦ä¹ ï¼ç¸ä¿¡é¢è¯å®é®èµ·æ¥çæ¶åï¼å°ä¼ä¼´ä»¬å°±å¯ä»¥ä¾ä¾èè°ï¼èä¸ä¼è¢«é®å°ä½æ å®è¤äºï¼
æåç¥å°ä¼ä¼´ä»¬æ¾å°åéçæ»¡æçå·¥ä½~
å åèæç®
- ã彿°é²æåèæµã
- ãèæµ & 鲿ã
- ãJS奿·«å·§æï¼é²æå½æ°ä¸èæµå½æ°ã
- ãé²è JS ä¸ç apply å callã
- ãjs ä¸ arguments çç¨æ³ã
- ã鲿åèæµçåºç¨åºæ¯åå®ç°ã
- ãç½é¡µè§£æçå ¨è¿ç¨(è¾å ¥urlå°å±ç¤ºé¡µé¢)ã
- ãæµè§å¨æ¸²æé¡µé¢è¿ç¨åæã
- ãä¸ç¯æç« æå®å端é¢è¯ã
ä½è
ï¼jsliang
龿¥ï¼https://juejin.im/post/5c87b54ce51d455f7943dddb
æ¥æºï¼æé
è使å½ä½è
ææãåä¸è½¬è½½è¯·èç³»ä½è
è·å¾ææï¼éåä¸è½¬è½½è¯·æ³¨æåºå¤ã