mirror of
https://github.com/ZiuChen/ZiuChen.github.io.git
synced 2025-08-17 23:19:55 +08:00
124 lines
72 KiB
HTML
124 lines
72 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en-US" dir="ltr">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||
<title>深入理解浏览器运行原理 | ZiuChen</title>
|
||
<meta name="description" content="Unlimited Progress.">
|
||
<link rel="preload stylesheet" href="/assets/style.ec1c8c15.css" as="style">
|
||
|
||
<script type="module" src="/assets/app.499ce9ef.js"></script>
|
||
<link rel="preload" href="/assets/inter-roman-latin.2ed14f66.woff2" as="font" type="font/woff2" crossorigin="">
|
||
<link rel="modulepreload" href="/assets/chunks/framework.9b71bc06.js">
|
||
<link rel="modulepreload" href="/assets/chunks/theme.35023a02.js">
|
||
<link rel="modulepreload" href="/assets/article_深入理解浏览器运行原理.md.a9684ca4.lean.js">
|
||
<link rel="icon" href="/logo.png">
|
||
<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
|
||
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
|
||
</head>
|
||
<body>
|
||
<div id="app"><div class="Layout" data-v-9d158fda><!--[--><!--]--><!--[--><span tabindex="-1" data-v-204cb7b1></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-204cb7b1> Skip to content </a><!--]--><!----><header class="VPNav" data-v-9d158fda data-v-8afa7537><div class="VPNavBar has-sidebar" data-v-8afa7537 data-v-56b97c0f><div class="container" data-v-56b97c0f><div class="title" data-v-56b97c0f><div class="VPNavBarTitle has-sidebar" data-v-56b97c0f data-v-5e4abee9><a class="title" href="/" data-v-5e4abee9><!--[--><!--]--><!--[--><img class="VPImage logo" src="/logo.png" alt data-v-c46cb0a1><!--]--><!--[-->ZiuChen<!--]--><!--[--><!--]--></a></div></div><div class="content" data-v-56b97c0f><div class="curtain" data-v-56b97c0f></div><div class="content-body" data-v-56b97c0f><!--[--><!--]--><div class="VPNavBarSearch search" data-v-56b97c0f><!--[--><!----><div id="docsearch"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg class="DocSearch-Search-Icon" width="20" height="20" viewBox="0 0 20 20" aria-label="search icon"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-56b97c0f data-v-471dd2d2><span id="main-nav-aria-label" class="visually-hidden" data-v-471dd2d2>Main Navigation</span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/" tabindex="0" data-v-471dd2d2 data-v-79f36db3><!--[--><span data-v-79f36db3>首页</span><!--]--></a><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-471dd2d2 data-v-8f17ebbc><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-8f17ebbc><span class="text" data-v-8f17ebbc><!----><span data-v-8f17ebbc>我的项目</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-8f17ebbc><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-8f17ebbc><div class="VPMenu" data-v-8f17ebbc data-v-f5acf789><div class="items" data-v-f5acf789><!--[--><!--[--><div class="VPMenuLink" data-v-f5acf789 data-v-5f1b289c><a class="VPLink link" href="/project/ClipboardManager/" data-v-5f1b289c><!--[-->超级剪贴板<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-f5acf789 data-v-5f1b289c><a class="VPLink link" href="/project/Markdown/" data-v-5f1b289c><!--[-->超级Markdown<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-f5acf789 data-v-5f1b289c><a class="VPLink link" href="/project/JSRunner/" data-v-5f1b289c><!--[-->超级JavaScript<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-f5acf789 data-v-5f1b289c><a class="VPLink link" href="/project/SmartWordBreak/" data-v-5f1b289c><!--[-->超级分词<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-471dd2d2 data-v-8f17ebbc><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-8f17ebbc><span class="text" data-v-8f17ebbc><!----><span data-v-8f17ebbc>开源作品</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-8f17ebbc><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-8f17ebbc><div class="VPMenu" data-v-8f17ebbc data-v-f5acf789><div class="items" data-v-f5acf789><!--[--><!--[--><div class="VPMenuLink" data-v-f5acf789 data-v-5f1b289c><a class="VPLink link" href="/works/opensource.html" data-v-5f1b289c><!--[-->个人作品<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-f5acf789 data-v-5f1b289c><a class="VPLink link" href="/works/contribution.html" data-v-5f1b289c><!--[-->社区贡献<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-471dd2d2 data-v-8f17ebbc><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-8f17ebbc><span class="text" data-v-8f17ebbc><!----><span data-v-8f17ebbc>学习笔记</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-8f17ebbc><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-8f17ebbc><div class="VPMenu" data-v-8f17ebbc data-v-f5acf789><div class="items" data-v-f5acf789><!--[--><!--[--><div class="VPMenuLink" data-v-f5acf789 data-v-5f1b289c><a class="VPLink link" href="/note/JavaScript.html" data-v-5f1b289c><!--[-->JavaScript基础<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-f5acf789 data-v-5f1b289c><a class="VPLink link" href="/note/CSS.html" data-v-5f1b289c><!--[-->CSS基础<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-f5acf789 data-v-5f1b289c><a class="VPLink link" href="/note/JavaScriptEnhanced.html" data-v-5f1b289c><!--[-->JavaScript进阶<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-f5acf789 data-v-5f1b289c><a class="VPLink link" href="/note/Front-end%20Engineering.html" data-v-5f1b289c><!--[-->前端工程化<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-f5acf789 data-v-5f1b289c><a class="VPLink link" href="/note/SSR.html" data-v-5f1b289c><!--[-->服务端渲染<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-f5acf789 data-v-5f1b289c><a class="VPLink link" href="/note/React.html" data-v-5f1b289c><!--[-->React基础<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-f5acf789 data-v-5f1b289c><a class="VPLink link" href="/note/React%20Hooks.html" data-v-5f1b289c><!--[-->React Hooks<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-f5acf789 data-v-5f1b289c><a class="VPLink link" href="/note/Redux.html" data-v-5f1b289c><!--[-->Redux<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-f5acf789 data-v-5f1b289c><a class="VPLink link" href="/note/React%20Router.html" data-v-5f1b289c><!--[-->React Router<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-f5acf789 data-v-5f1b289c><a class="VPLink link" href="/note/MySQL.html" data-v-5f1b289c><!--[-->MySQL<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/self/" tabindex="0" data-v-471dd2d2 data-v-79f36db3><!--[--><span data-v-79f36db3>个人介绍</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-56b97c0f data-v-11fb0f5b><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="toggle dark mode" aria-checked="false" data-v-11fb0f5b data-v-599084b8 data-v-739664f6><span class="check" data-v-739664f6><span class="icon" data-v-739664f6><!--[--><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="sun" data-v-599084b8><path d="M12,18c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6S15.3,18,12,18zM12,8c-2.2,0-4,1.8-4,4c0,2.2,1.8,4,4,4c2.2,0,4-1.8,4-4C16,9.8,14.2,8,12,8z"></path><path d="M12,4c-0.6,0-1-0.4-1-1V1c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,3.6,12.6,4,12,4z"></path><path d="M12,24c-0.6,0-1-0.4-1-1v-2c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,23.6,12.6,24,12,24z"></path><path d="M5.6,6.6c-0.3,0-0.5-0.1-0.7-0.3L3.5,4.9c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C6.2,6.5,5.9,6.6,5.6,6.6z"></path><path d="M19.8,20.8c-0.3,0-0.5-0.1-0.7-0.3l-1.4-1.4c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C20.3,20.7,20,20.8,19.8,20.8z"></path><path d="M3,13H1c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S3.6,13,3,13z"></path><path d="M23,13h-2c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S23.6,13,23,13z"></path><path d="M4.2,20.8c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C4.7,20.7,4.5,20.8,4.2,20.8z"></path><path d="M18.4,6.6c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C18.9,6.5,18.6,6.6,18.4,6.6z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="moon" data-v-599084b8><path d="M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"></path></svg><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-56b97c0f data-v-293aafa9 data-v-99a410ba><!--[--><a class="VPSocialLink no-icon" href="https://github.com/ZiuChen" aria-label="github" target="_blank" rel="noopener" data-v-99a410ba data-v-72dca3b0><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg></a><a class="VPSocialLink no-icon" href="https://juejin.cn/user/1887205216238477" aria-label target="_blank" rel="noopener" data-v-99a410ba data-v-72dca3b0><svg width="36" height="28" viewBox="0 0 36 28" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M17.5875 6.77268L21.8232 3.40505L17.5875 0.00748237L17.5837 0L13.3555 3.39757L17.5837 6.76894L17.5875 6.77268ZM17.5863 17.3955H17.59L28.5161 8.77432L25.5526 6.39453L17.59 12.6808H17.5863L17.5825 12.6845L9.61993 6.40201L6.66016 8.78181L17.5825 17.3992L17.5863 17.3955ZM17.5828 23.2891L17.5865 23.2854L32.2133 11.7456L35.1768 14.1254L28.5238 19.3752L17.5865 28L0.284376 14.3574L0 14.1291L2.95977 11.7531L17.5828 23.2891Z" fill="#1E80FF"/></svg></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-56b97c0f data-v-54863f0d data-v-8f17ebbc><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-8f17ebbc><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="icon" data-v-8f17ebbc><circle cx="12" cy="12" r="2"></circle><circle cx="19" cy="12" r="2"></circle><circle cx="5" cy="12" r="2"></circle></svg></button><div class="menu" data-v-8f17ebbc><div class="VPMenu" data-v-8f17ebbc data-v-f5acf789><!----><!--[--><!--[--><!----><div class="group" data-v-54863f0d><div class="item appearance" data-v-54863f0d><p class="label" data-v-54863f0d>Appearance</p><div class="appearance-action" data-v-54863f0d><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="toggle dark mode" aria-checked="false" data-v-54863f0d data-v-599084b8 data-v-739664f6><span class="check" data-v-739664f6><span class="icon" data-v-739664f6><!--[--><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="sun" data-v-599084b8><path d="M12,18c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6S15.3,18,12,18zM12,8c-2.2,0-4,1.8-4,4c0,2.2,1.8,4,4,4c2.2,0,4-1.8,4-4C16,9.8,14.2,8,12,8z"></path><path d="M12,4c-0.6,0-1-0.4-1-1V1c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,3.6,12.6,4,12,4z"></path><path d="M12,24c-0.6,0-1-0.4-1-1v-2c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,23.6,12.6,24,12,24z"></path><path d="M5.6,6.6c-0.3,0-0.5-0.1-0.7-0.3L3.5,4.9c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C6.2,6.5,5.9,6.6,5.6,6.6z"></path><path d="M19.8,20.8c-0.3,0-0.5-0.1-0.7-0.3l-1.4-1.4c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C20.3,20.7,20,20.8,19.8,20.8z"></path><path d="M3,13H1c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S3.6,13,3,13z"></path><path d="M23,13h-2c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S23.6,13,23,13z"></path><path d="M4.2,20.8c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C4.7,20.7,4.5,20.8,4.2,20.8z"></path><path d="M18.4,6.6c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C18.9,6.5,18.6,6.6,18.4,6.6z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="moon" data-v-599084b8><path d="M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"></path></svg><!--]--></span></span></button></div></div></div><div class="group" data-v-54863f0d><div class="item social-links" data-v-54863f0d><div class="VPSocialLinks social-links-list" data-v-54863f0d data-v-99a410ba><!--[--><a class="VPSocialLink no-icon" href="https://github.com/ZiuChen" aria-label="github" target="_blank" rel="noopener" data-v-99a410ba data-v-72dca3b0><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg></a><a class="VPSocialLink no-icon" href="https://juejin.cn/user/1887205216238477" aria-label target="_blank" rel="noopener" data-v-99a410ba data-v-72dca3b0><svg width="36" height="28" viewBox="0 0 36 28" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M17.5875 6.77268L21.8232 3.40505L17.5875 0.00748237L17.5837 0L13.3555 3.39757L17.5837 6.76894L17.5875 6.77268ZM17.5863 17.3955H17.59L28.5161 8.77432L25.5526 6.39453L17.59 12.6808H17.5863L17.5825 12.6845L9.61993 6.40201L6.66016 8.78181L17.5825 17.3992L17.5863 17.3955ZM17.5828 23.2891L17.5865 23.2854L32.2133 11.7456L35.1768 14.1254L28.5238 19.3752L17.5865 28L0.284376 14.3574L0 14.1291L2.95977 11.7531L17.5828 23.2891Z" fill="#1E80FF"/></svg></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-56b97c0f data-v-1b1f6b9e><span class="container" data-v-1b1f6b9e><span class="top" data-v-1b1f6b9e></span><span class="middle" data-v-1b1f6b9e></span><span class="bottom" data-v-1b1f6b9e></span></span></button></div></div></div></div><!----></header><div class="VPLocalNav reached-top" data-v-9d158fda data-v-5d953687><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-5d953687><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="menu-icon" data-v-5d953687><path d="M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"></path><path d="M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"></path><path d="M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"></path><path d="M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"></path></svg><span class="menu-text" data-v-5d953687>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-5d953687 data-v-989d74b8><button data-v-989d74b8>Return to top</button><!----></div></div><aside class="VPSidebar" data-v-9d158fda data-v-0e1b55d4><div class="curtain" data-v-0e1b55d4></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-0e1b55d4><span class="visually-hidden" id="sidebar-aria-label" data-v-0e1b55d4> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="group" data-v-0e1b55d4><section class="VPSidebarItem level-0" data-v-0e1b55d4 data-v-4a3e3544><div class="item" role="button" tabindex="0" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><h2 class="text" data-v-4a3e3544>我的项目</h2><!----></div><div class="items" data-v-4a3e3544><!--[--><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/project/ClipboardManager/" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>超级剪贴板</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/project/Markdown/" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>超级Markdown</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/project/JSRunner/" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>超级JavaScript</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/project/SmartWordBreak/" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>超级分词</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-0e1b55d4><section class="VPSidebarItem level-0 collapsible collapsed" data-v-0e1b55d4 data-v-4a3e3544><div class="item" role="button" tabindex="0" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><h2 class="text" data-v-4a3e3544>开源作品</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-4a3e3544><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-4a3e3544><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-4a3e3544><!--[--><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/works/opensource.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>个人作品</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/works/contribution.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>社区贡献</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-0e1b55d4><section class="VPSidebarItem level-0 collapsible has-active" data-v-0e1b55d4 data-v-4a3e3544><div class="item" role="button" tabindex="0" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><h2 class="text" data-v-4a3e3544>文章归档</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-4a3e3544><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-4a3e3544><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-4a3e3544><!--[--><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/article/%E3%80%902023%E3%80%91%E9%9D%92%E8%AE%AD%E8%90%A5%20-%20%E5%89%8D%E7%AB%AF%E7%BB%83%E4%B9%A0%E9%A2%98%E6%B1%87%E6%80%BB%E8%A7%A3%E6%9E%90.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>【2023】青训营 - 前端练习题汇总解析</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/article/%E3%80%90%E5%AD%97%E8%8A%82%E8%B7%B3%E5%8A%A8%E3%80%91%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E9%A2%98%E6%80%BB%E7%BB%93.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>【字节跳动】前端面试题总结</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/article/%E3%80%90%E5%BF%AB%E6%89%8B%E3%80%91%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E9%A2%98.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>【快手】深入理解前端面试题</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/article/%E3%80%90%E7%94%A8%E5%8F%8B%E9%87%91%E8%9E%8D%E3%80%91%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E9%A2%98%E6%80%BB%E7%BB%93.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>【用友金融】前端面试题总结</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/article/%E4%B8%80%E6%96%87%E8%AF%BB%E6%87%82%E4%BA%8B%E4%BB%B6%E5%86%92%E6%B3%A1%E4%B8%8E%E4%BA%8B%E4%BB%B6%E6%8D%95%E8%8E%B7.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>一文读懂事件冒泡与事件捕获</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/article/%E4%B8%80%E6%96%87%E8%AF%BB%E6%87%82%E4%BC%AA%E7%B1%BB%E4%B8%8E%E4%BC%AA%E5%85%83%E7%B4%A0.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>一文读懂伪类与伪元素</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/article/%E4%B8%80%E6%96%87%E8%AF%BB%E6%87%82%E5%87%BD%E6%95%B0%E4%B8%ADthis%E6%8C%87%E5%90%91%E9%97%AE%E9%A2%98.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>一文读懂函数中this指向问题</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/article/%E4%BB%8E0%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AA%E5%B9%B4%E5%BA%A6%E6%8A%A5%E5%91%8A.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>从0实现一个年度报告</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/article/%E5%BD%BB%E5%BA%95%E6%90%9E%E6%87%82%E5%AF%B9%E8%B1%A1%E7%9A%84%E6%95%B0%E6%8D%AE%E5%B1%9E%E6%80%A7%E6%8F%8F%E8%BF%B0%E7%AC%A6%E3%80%81%E5%AD%98%E5%82%A8%E5%B1%9E%E6%80%A7%E6%8F%8F%E8%BF%B0%E7%AC%A6.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>彻底搞懂对象的数据属性描述符、存储属性描述符</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/article/%E6%B5%85%E6%9E%90defineProperty%E4%B8%8EProxy%E5%AE%9E%E7%8E%B0%E7%9A%84%E5%8F%8C%E5%90%91%E7%BB%91%E5%AE%9A.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>浅析defineProperty与Proxy实现的双向绑定</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/article/%E6%B7%B1%E5%85%A5JavaScript%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>深入JavaScript数据类型</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/article/%E6%B7%B1%E5%85%A5Vue3%E6%BA%90%E7%A0%81%EF%BC%8C%E7%9C%8B%E7%9C%8BVue.use%E5%90%8E%E7%A9%B6%E7%AB%9F%E5%8F%91%E7%94%9F%E4%BA%86%E4%BB%80%E4%B9%88%EF%BC%9F.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>深入Vue3源码,看看Vue.use后究竟发生了什么?</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/article/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Proxy%E4%B8%8EReflect.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>深入理解Proxy与Reflect</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/article/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E6%B5%8F%E8%A7%88%E5%99%A8%E7%BC%93%E5%AD%98%E6%9C%BA%E5%88%B6.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>深入理解浏览器缓存机制</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/article/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E6%B5%8F%E8%A7%88%E5%99%A8%E8%BF%90%E8%A1%8C%E5%8E%9F%E7%90%86.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>深入理解浏览器运行原理</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-0e1b55d4><section class="VPSidebarItem level-0 collapsible collapsed" data-v-0e1b55d4 data-v-4a3e3544><div class="item" role="button" tabindex="0" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><h2 class="text" data-v-4a3e3544>学习笔记</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-4a3e3544><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-4a3e3544><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-4a3e3544><!--[--><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/note/JavaScript.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>JavaScript基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/note/CSS.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>CSS基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/note/JavaScriptEnhanced.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>JavaScript进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/note/Front-end%20Engineering.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>前端工程化</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/note/SSR.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>服务端渲染</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/note/React.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>React基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/note/React%20Hooks.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>React Hooks</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/note/Redux.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>Redux</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/note/React%20Router.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>React Router</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-4a3e3544 data-v-4a3e3544><div class="item" data-v-4a3e3544><div class="indicator" data-v-4a3e3544></div><a class="VPLink link link" href="/note/MySQL.html" data-v-4a3e3544><!--[--><p class="text" data-v-4a3e3544>MySQL</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-9d158fda data-v-585eef7d><div class="VPDoc has-sidebar has-aside" data-v-585eef7d data-v-a686a8a6><!--[--><!--]--><div class="container" data-v-a686a8a6><div class="aside" data-v-a686a8a6><div class="aside-curtain" data-v-a686a8a6></div><div class="aside-container" data-v-a686a8a6><div class="aside-content" data-v-a686a8a6><div class="VPDocAside" data-v-a686a8a6 data-v-31570b60><!--[--><!--]--><!--[--><!--]--><div class="VPDocAsideOutline" role="navigation" data-v-31570b60 data-v-ba8455b5><div class="content" data-v-ba8455b5><div class="outline-marker" data-v-ba8455b5></div><div class="outline-title" role="heading" aria-level="2" data-v-ba8455b5>On this page</div><nav aria-labelledby="doc-outline-aria-label" data-v-ba8455b5><span class="visually-hidden" id="doc-outline-aria-label" data-v-ba8455b5> Table of Contents for current page </span><ul class="root" data-v-ba8455b5 data-v-6713c9cc><!--[--><!--]--></ul></nav></div></div><!--[--><!--]--><div class="spacer" data-v-31570b60></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-a686a8a6><div class="content-container" data-v-a686a8a6><!--[--><!--]--><!----><main class="main" data-v-a686a8a6><div style="position:relative;" class="vp-doc _article_%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E6%B5%8F%E8%A7%88%E5%99%A8%E8%BF%90%E8%A1%8C%E5%8E%9F%E7%90%86" data-v-a686a8a6><div><h1 id="深入理解浏览器运行原理" tabindex="-1">深入理解浏览器运行原理 <a class="header-anchor" href="#深入理解浏览器运行原理" aria-label="Permalink to "深入理解浏览器运行原理""></a></h1><h2 id="网页解析过程" tabindex="-1">网页解析过程 <a class="header-anchor" href="#网页解析过程" aria-label="Permalink to "网页解析过程""></a></h2><p>输入域名 => DNS解析为IP => 目标服务器返回<code>index.html</code></p><blockquote><p>DNS:Domain Name System</p></blockquote><h2 id="html解析过程" tabindex="-1">HTML解析过程 <a class="header-anchor" href="#html解析过程" aria-label="Permalink to "HTML解析过程""></a></h2><ul><li>浏览器开始解析<code>index.html</code>文件,当遇到<code><link></code>则向服务器请求下载<code>.css</code>文件</li><li>遇到<code><script></code>标签则向服务器请求下载<code>.js</code>文件</li></ul><img src="https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0a90afa7c2534ae78f3eab9200a0095b~tplv-k3u1fbpfcp-watermark.image?" alt="浏览器解析HTML过程" width="70%"><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/630cf2fd1d3748d6846fe7f2ab99a01b~tplv-k3u1fbpfcp-watermark.image?" alt="浏览器是和如何工作的" width="70%"><p><a href="https://web.dev/howbrowserswork/" target="_blank" rel="noreferrer">How browsers work</a></p><h2 id="生成css规则" tabindex="-1">生成CSS规则 <a class="header-anchor" href="#生成css规则" aria-label="Permalink to "生成CSS规则""></a></h2><p>在解析的过程中,如果遇到<code><link></code>元素,那么会由浏览器负责下载对应的CSS文件</p><ul><li>注意:下载CSS文件不会影响到DOM解析</li><li>有单独一个线程对CSS文件进行下载与解析</li></ul><p>浏览器下载完CSS文件后,就会对CSS文件进行解析,解析出对应的规则树:</p><ul><li>我们可以称之为CSSOM(CSS Object Model,CSS对象模型)</li></ul><h2 id="构建render-tree" tabindex="-1">构建Render Tree <a class="header-anchor" href="#构建render-tree" aria-label="Permalink to "构建Render Tree""></a></h2><p>有了DOM Tree和CSSOM Tree之后,就可以将二者结合,构建Render Tree了</p><p>此时,如果有某些元素的CSS属性<code>display: none;</code>那么这个元素就不会出现在Render Tree中</p><ul><li>下载和解析CSS文件时,不会阻塞DOM Tree的构建过程</li><li>但会阻塞Render Tree的构建过程:因为需要对应的CSSOM Tree</li></ul><h2 id="布局和绘制-layout-paint" tabindex="-1">布局和绘制(Layout & Paint) <a class="header-anchor" href="#布局和绘制-layout-paint" aria-label="Permalink to "布局和绘制(Layout & Paint)""></a></h2><p>第四步是在渲染树(Render Tree)上运行布局(Layout),以计算每个节点的几何体</p><ul><li>渲染树会表示显示哪些节点以及其他的样式,但是不表示每个节点的尺寸、位置等信息</li><li>布局是确定呈现树中所有节点的宽度、高度和位置信息</li></ul><p>第五步是将每个节点绘制(Paint)到屏幕上</p><ul><li>在绘制阶段,浏览器布局阶段计算的每个frame转为屏幕上实际的像素点</li><li>包括将元素的可见部分进行绘制,比如文本、颜色、边框、阴影、替换元素</li></ul><h2 id="回流和重绘-reflow" tabindex="-1">回流和重绘(Reflow & ) <a class="header-anchor" href="#回流和重绘-reflow" aria-label="Permalink to "回流和重绘(Reflow & )""></a></h2><p>回流也可称为重排</p><p>理解回流(Reflow):</p><ul><li>第一次确定节点的大小和位置,称之为布局(layout)</li><li>之后对节点的大小、位置修改重新计算,称之为回流</li></ul><p>什么情况下会引起回流?</p><ul><li>DOM 结构发生改变(添加新的节点或者移除节点)</li><li>改变了布局(修改了width height padding font-size等值)</li><li>窗口resize(修改了窗口的尺寸等)</li><li>调用getComputedStyle方法获取尺寸、位置信息</li></ul><p>理解重绘(Repaint):</p><ul><li>第一次渲染内容称之为绘制(paint)</li><li>之后的重新渲染称之为重绘</li></ul><p>什么情况下会引起重绘?</p><ul><li>修改背景色、文字颜色、边框颜色、样式等</li></ul><p><strong>回流一定会引起重绘,所以回流是一件很消耗性能的事情</strong></p><ul><li><p>开发中要尽量避免发生回流</p></li><li><p>修改样式尽量一次性修改完毕</p><ul><li>例如通过cssText一次性设置样式,或通过修改class的方式修改样式</li></ul></li><li><p>尽量避免频繁的操作DOM</p><ul><li>可以在一个DocumentFragment或者父元素中,将要操作的DOM操作完成,再一次性插入到DOM树中</li></ul></li><li><p>尽量避免通过getComputedStyle获取元素尺寸、位置等信息</p></li><li><p>对某些元素使用position的absolute或fixed属性</p><ul><li>并不是不会引起回流,而是开销相对较小,不会对其他元素产生影响</li></ul></li></ul><h2 id="特殊解析-composite合成" tabindex="-1">特殊解析: composite合成 <a class="header-anchor" href="#特殊解析-composite合成" aria-label="Permalink to "特殊解析: composite合成""></a></h2><p>在绘制的过程中,可以将布局后的元素绘制到多个合成图层中</p><ul><li>这是浏览器的一种优化手段</li><li>将不同流生成的不同Layer进行合并</li></ul><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#e1e4e8;">标准流 => LayouTree => RenderLayer</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">`position:fixed;` => RenderLayer</span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292e;">标准流 => LayouTree => RenderLayer</span></span>
|
||
<span class="line"><span style="color:#24292e;">`position:fixed;` => RenderLayer</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><p>默认情况,标准流中的内容都是被绘制在同一个图层(Layer)中的</p><p>而一些特殊的属性,浏览器会创建一个新的合成层(CompositingLayer),并且新的图层可以利用GPU来加速绘制</p><ul><li>每个合成层都是单独渲染的</li><li>单独渲染可以避免所有的动画都在同一层中渲染导致性能问题</li><li>在各自的层中渲染完成后,只需要将渲染结果更新回合成层即可</li></ul><p>当元素具有哪些属性时,浏览器会为其创建新的合成层呢?</p><ul><li>3D Transforms</li><li>video canvas iframe</li><li>opacity 动画转换时</li><li>position: fixed</li><li>will-change: 一个实验性的属性,提前告诉浏览器此元素可能发生哪些变化</li><li>animation 或 transition设置了opacity、transform</li></ul><h3 id="案例1-同一层渲染" tabindex="-1">案例1:同一层渲染 <a class="header-anchor" href="#案例1-同一层渲染" aria-label="Permalink to "案例1:同一层渲染""></a></h3><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#e1e4e8;">.box1 {</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> width: 100px;</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> height: 100px;</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> background-color: red;</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">}</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">.box2 {</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> width: 100px;</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> height: 100px;</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> background-color: blue;</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">}</span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292e;">.box1 {</span></span>
|
||
<span class="line"><span style="color:#24292e;"> width: 100px;</span></span>
|
||
<span class="line"><span style="color:#24292e;"> height: 100px;</span></span>
|
||
<span class="line"><span style="color:#24292e;"> background-color: red;</span></span>
|
||
<span class="line"><span style="color:#24292e;">}</span></span>
|
||
<span class="line"><span style="color:#24292e;">.box2 {</span></span>
|
||
<span class="line"><span style="color:#24292e;"> width: 100px;</span></span>
|
||
<span class="line"><span style="color:#24292e;"> height: 100px;</span></span>
|
||
<span class="line"><span style="color:#24292e;"> background-color: blue;</span></span>
|
||
<span class="line"><span style="color:#24292e;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br></div></div><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#e1e4e8;"><body></span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> <div class="box1"></div></span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> <div class="box2"></div></span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"></body></span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292e;"><body></span></span>
|
||
<span class="line"><span style="color:#24292e;"> <div class="box1"></div></span></span>
|
||
<span class="line"><span style="color:#24292e;"> <div class="box2"></div></span></span>
|
||
<span class="line"><span style="color:#24292e;"></body></span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><p>在开发者工具的图层工具中可以看到,两个元素<code>.box1</code> 和 <code>.box2</code>都是在一个层(Document)下渲染的:</p><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/373fb3a4d5284e6c80c3ec519918e6e4~tplv-k3u1fbpfcp-watermark.image?" alt="image-20221122103111654.png" width="70%"><h3 id="案例2-分层渲染" tabindex="-1">案例2:分层渲染 <a class="header-anchor" href="#案例2-分层渲染" aria-label="Permalink to "案例2:分层渲染""></a></h3><p>当我们为<code>.box2</code>添加上<code>position: fixed;</code>属性,这时<code>.box2</code>将在由浏览器创建出来的合成层,分层单独渲染</p><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#e1e4e8;">.box2 {</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> width: 100px;</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> height: 100px;</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> background-color: blue;</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> position: fixed;</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">}</span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292e;">.box2 {</span></span>
|
||
<span class="line"><span style="color:#24292e;"> width: 100px;</span></span>
|
||
<span class="line"><span style="color:#24292e;"> height: 100px;</span></span>
|
||
<span class="line"><span style="color:#24292e;"> background-color: blue;</span></span>
|
||
<span class="line"><span style="color:#24292e;"> position: fixed;</span></span>
|
||
<span class="line"><span style="color:#24292e;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6116d83ee8c041f586d627e549fdd5bf~tplv-k3u1fbpfcp-watermark.image?" alt="image-20221122103256116.png" width="70%"><h3 id="案例3-transform-3d" tabindex="-1">案例3:transform 3D <a class="header-anchor" href="#案例3-transform-3d" aria-label="Permalink to "案例3:transform 3D""></a></h3><p>为元素添加上<code>transform</code>属性时,浏览器也会为对应元素创建一个合成层,需要注意的是:只有3D的变化浏览器才会创建</p><p>如果是<code>translateX</code>或<code>translateY</code>则不会</p><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#e1e4e8;">.box2 {</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> width: 100px;</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> height: 100px;</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> background-color: blue;</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> /* position: fixed; */</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> transform: translateZ(10px);</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">}</span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292e;">.box2 {</span></span>
|
||
<span class="line"><span style="color:#24292e;"> width: 100px;</span></span>
|
||
<span class="line"><span style="color:#24292e;"> height: 100px;</span></span>
|
||
<span class="line"><span style="color:#24292e;"> background-color: blue;</span></span>
|
||
<span class="line"><span style="color:#24292e;"> /* position: fixed; */</span></span>
|
||
<span class="line"><span style="color:#24292e;"> transform: translateZ(10px);</span></span>
|
||
<span class="line"><span style="color:#24292e;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><img src="https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/befb4826b079439f81c98b03586a36e5~tplv-k3u1fbpfcp-watermark.image?" alt="image-20221122103715428.png" width="70%"><h3 id="案例4-transition-transform" tabindex="-1">案例4:transition+transform <a class="header-anchor" href="#案例4-transition-transform" aria-label="Permalink to "案例4:transition+transform""></a></h3><p>当我们为元素添加上动画时,动画的中间执行过程的渲染会在新的图层上进行,但是中间动画渲染完成后,结果会回到原始图层上</p><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#e1e4e8;">.box2 {</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> width: 100px;</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> height: 100px;</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> background-color: blue;</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> transition: transform 0.5s ease;</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">}</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">.box2:hover {</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> transform: translateY(10px);</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">}</span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292e;">.box2 {</span></span>
|
||
<span class="line"><span style="color:#24292e;"> width: 100px;</span></span>
|
||
<span class="line"><span style="color:#24292e;"> height: 100px;</span></span>
|
||
<span class="line"><span style="color:#24292e;"> background-color: blue;</span></span>
|
||
<span class="line"><span style="color:#24292e;"> transition: transform 0.5s ease;</span></span>
|
||
<span class="line"><span style="color:#24292e;">}</span></span>
|
||
<span class="line"><span style="color:#24292e;">.box2:hover {</span></span>
|
||
<span class="line"><span style="color:#24292e;"> transform: translateY(10px);</span></span>
|
||
<span class="line"><span style="color:#24292e;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></div></div><ul><li>这也是使用<code>transform</code>执行动画性能更高的原因,因为浏览器会为动画的执行过程单独创建一个合成层</li><li>如果是通过修改<code>top</code> <code>left</code>等定位属性实现的动画,是在原始的图层上渲染完成的。“牵一发则动全身”,动画过程中将导致整个渲染树回流与重绘,极大的影响性能</li></ul><h3 id="案例5-transition-opacity" tabindex="-1">案例5:transition+opacity <a class="header-anchor" href="#案例5-transition-opacity" aria-label="Permalink to "案例5:transition+opacity""></a></h3><p>与<code>transform</code>类似,使用<code>transition</code>过渡的<code>opacity</code>动画,浏览器也会为其创建一个合成层</p><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#e1e4e8;">.box2 {</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> width: 100px;</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> height: 100px;</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> background-color: blue;</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> opacity: 1;</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> transition: opacity 0.5s ease;</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">}</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">.box2:hover {</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> opacity: 0.2;</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">}</span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292e;">.box2 {</span></span>
|
||
<span class="line"><span style="color:#24292e;"> width: 100px;</span></span>
|
||
<span class="line"><span style="color:#24292e;"> height: 100px;</span></span>
|
||
<span class="line"><span style="color:#24292e;"> background-color: blue;</span></span>
|
||
<span class="line"><span style="color:#24292e;"> opacity: 1;</span></span>
|
||
<span class="line"><span style="color:#24292e;"> transition: opacity 0.5s ease;</span></span>
|
||
<span class="line"><span style="color:#24292e;">}</span></span>
|
||
<span class="line"><span style="color:#24292e;">.box2:hover {</span></span>
|
||
<span class="line"><span style="color:#24292e;"> opacity: 0.2;</span></span>
|
||
<span class="line"><span style="color:#24292e;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br></div></div><h3 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to "总结""></a></h3><p>分层确实可以提高性能,但是它是以内存管理为代价的,因此不应当作为Web性能优化策略的一部分过度使用</p><h2 id="浏览器对script元素的处理" tabindex="-1">浏览器对script元素的处理 <a class="header-anchor" href="#浏览器对script元素的处理" aria-label="Permalink to "浏览器对script元素的处理""></a></h2><p>之前我们说到,在解析到<code>link</code>标签时,浏览器会异步下载其中的css文件,并在DOM树构建完成后,将其与CSS Tree合成为RenderTree</p><p>但是当浏览器解析到<code>script</code>标签时,整个解析过程将被阻塞,当前<code>script</code>标签后面的DOM树将停止解析,直到当前<code>script</code>代码被下载、解析、执行完毕,才会继续解析HTML,构建DOM树</p><p>为什么要这样做呢?</p><ul><li>这是因为Javascript的作用之一就是操作DOM,并且可以修改DOM</li><li>如果我们等到DOM树构建完成并且渲染出来了,再去执行Javascript,会造成回流和重绘,严重影响页面性能</li><li>所以当浏览器构建DOM树遇到<code>script</code>标签时,会优先下载和执行Javascript代码,而后再继续构建DOM树</li></ul><p>这也会带来新的问题,比如在现代的页面开发中:</p><ul><li>脚本往往比HTML更“重”,浏览器也需要花更多的时间去处理脚本</li><li>会造成页面的解析阻塞,在脚本下载、解析、执行完成之前,用户在界面上什么也看不到</li></ul><p>为了解决这个问题,浏览器的<code>script</code>标签为我们提供了两个属性(attribute):<code>defer</code> 和 <code>async</code></p><h2 id="defer属性" tabindex="-1">defer属性 <a class="header-anchor" href="#defer属性" aria-label="Permalink to "defer属性""></a></h2><p><code>defer</code> 即推迟,为<code>script</code>标签添加这个属性,相当于告诉浏览器:不要等待此脚本下载,而是继续解析HTML,构建DOM Tree</p><ul><li>脚本将由浏览器进行下载,但是不会阻塞DOM Tree的构建过程</li><li>如果脚本提前下载好了,那么它会等待DOM Tree构建完成,在<code>DOMContentLoaded</code><strong>事件触发之前</strong>先执行<code>defer</code>中的代码</li></ul><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#e1e4e8;"><script></span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> console.log('script enter')</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> window.addEventListener('DOMContentLoaded', () => {</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> console.log('DOMContentLoaded enter')</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"> })</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"></script></span></span>
|
||
<span class="line"><span style="color:#e1e4e8;"><script src="./defer.js" defer></script></span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292e;"><script></span></span>
|
||
<span class="line"><span style="color:#24292e;"> console.log('script enter')</span></span>
|
||
<span class="line"><span style="color:#24292e;"> window.addEventListener('DOMContentLoaded', () => {</span></span>
|
||
<span class="line"><span style="color:#24292e;"> console.log('DOMContentLoaded enter')</span></span>
|
||
<span class="line"><span style="color:#24292e;"> })</span></span>
|
||
<span class="line"><span style="color:#24292e;"></script></span></span>
|
||
<span class="line"><span style="color:#24292e;"><script src="./defer.js" defer></script></span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#e1e4e8;">// defer.js</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">console.log('defer script enter')</span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292e;">// defer.js</span></span>
|
||
<span class="line"><span style="color:#24292e;">console.log('defer script enter')</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><p>上述代码在控制台的输出为:</p><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#e1e4e8;">script enter</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">defer script enter</span></span>
|
||
<span class="line"><span style="color:#e1e4e8;">DOMContentLoaded enter</span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292e;">script enter</span></span>
|
||
<span class="line"><span style="color:#24292e;">defer script enter</span></span>
|
||
<span class="line"><span style="color:#24292e;">DOMContentLoaded enter</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><ul><li>多个带<code>defer</code>的脚本也是按照自上至下的顺序执行的</li><li>从某种角度来说,<code>defer</code>可以提高页面的性能,并且推荐放到<code>head</code>元素中</li><li>注意:<code>defer</code>仅适用于外部脚本,对于<code>script</code>标签内编写的默认<code>JS</code>代码会被忽略掉</li></ul><h2 id="async属性" tabindex="-1">async属性 <a class="header-anchor" href="#async属性" aria-label="Permalink to "async属性""></a></h2><p><code>async</code>属性也可以做到:让脚本异步加载而不阻塞DOM树的构建,它与<code>defer</code>的区别:</p><ul><li>用<code>async</code>标记的脚本是<strong>完全独立</strong>的</li><li><code>async</code>脚本不能保证执行顺序,因为它是独立下载、独立运行,不会等待其他脚本</li><li>使用<code>async</code>标记的脚本不会保证它将在<code>DOMContentLoaded</code>之前或之后被执行</li></ul><p>要使用<code>async</code>属性标记的<code>script</code>操作DOM,必须在其中使用<code>DOMContentLoaded</code>监听器的回调函数,在该事件触发(DOM树构建完毕)后,执行相应的回调函数</p></div></div></main><footer class="VPDocFooter" data-v-a686a8a6 data-v-0b8e2cba><!--[--><!--]--><div class="edit-info" data-v-0b8e2cba><div class="edit-link" data-v-0b8e2cba><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://github.com/ZiuChen/ZiuChen.github.io/edit/main/docs/article/深入理解浏览器运行原理.md" target="_blank" rel="noreferrer" data-v-0b8e2cba><!--[--><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24" class="edit-link-icon" aria-label="edit icon" data-v-0b8e2cba><path d="M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"></path><path d="M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"></path></svg> Edit this page on GitHub<!--]--></a></div><div class="last-updated" data-v-0b8e2cba><p class="VPLastUpdated" data-v-0b8e2cba data-v-a6f11a31>Updated Date: <time datetime="2024-01-06T06:57:39.000Z" data-v-a6f11a31></time></p></div></div><nav class="prev-next" data-v-0b8e2cba><div class="pager" data-v-0b8e2cba><a class="pager-link prev" href="/article/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E6%B5%8F%E8%A7%88%E5%99%A8%E7%BC%93%E5%AD%98%E6%9C%BA%E5%88%B6.html" data-v-0b8e2cba><span class="desc" data-v-0b8e2cba>Previous page</span><span class="title" data-v-0b8e2cba>深入理解浏览器缓存机制</span></a></div><div class="pager" data-v-0b8e2cba><a class="pager-link next" href="/note/JavaScript.html" data-v-0b8e2cba><span class="desc" data-v-0b8e2cba>Next page</span><span class="title" data-v-0b8e2cba>JavaScript基础</span></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-9d158fda data-v-2c80950a><div class="container" data-v-2c80950a><p class="message" data-v-2c80950a>Released under the MIT License.</p><p class="copyright" data-v-2c80950a>Copyright © 2019-present Ziu Chen</p></div></footer><!--[--><!--]--></div></div>
|
||
<script>window.__VP_HASH_MAP__=JSON.parse("{\"index.md\":\"48a36636\",\"article_浅析defineproperty与proxy实现的双向绑定.md\":\"13ed773f\",\"article_一文读懂事件冒泡与事件捕获.md\":\"d1929e50\",\"article_深入理解浏览器缓存机制.md\":\"69e6a2c6\",\"article_一文读懂函数中this指向问题.md\":\"28d5e9b4\",\"article_深入javascript数据类型.md\":\"477ee358\",\"note_css.md\":\"fbe56ac3\",\"article_深入理解浏览器运行原理.md\":\"a9684ca4\",\"note_redux.md\":\"02de7bbe\",\"project_smartwordbreak_index.md\":\"66a30ca5\",\"note_javascript.md\":\"45a113ba\",\"article_【快手】深入理解前端面试题.md\":\"d44b9955\",\"article_【字节跳动】前端面试题总结.md\":\"30e03a5f\",\"article_【用友金融】前端面试题总结.md\":\"6d315a97\",\"article_深入vue3源码,看看vue.use后究竟发生了什么?.md\":\"70bae50e\",\"article_一文读懂伪类与伪元素.md\":\"68cce63a\",\"article_从0实现一个年度报告.md\":\"175c992f\",\"article_深入理解proxy与reflect.md\":\"fdad28fc\",\"project_jsrunner_log_index.md\":\"5b2edea9\",\"note_react router.md\":\"8d4994d8\",\"project_clipboardmanager_statement_index.md\":\"158b6468\",\"project_jsrunner_index.md\":\"d62a7429\",\"project_markdown_index.md\":\"5a93c50a\",\"article_【2023】青训营 - 前端练习题汇总解析.md\":\"dd1797c0\",\"project_clipboardmanager_log_index.md\":\"30d348e4\",\"project_clipboardmanager_index.md\":\"a4052946\",\"article_彻底搞懂对象的数据属性描述符、存储属性描述符.md\":\"dd182e72\",\"project_smartwordbreak_log_index.md\":\"6c6fe4e0\",\"project_smartwordbreak_statement_index.md\":\"33bd8d5d\",\"note_mysql.md\":\"45f0f4c7\",\"works_contribution.md\":\"997cb34f\",\"works_opensource.md\":\"db24f357\",\"project_markdown_shortcut_index.md\":\"90359831\",\"project_clipboardmanager_guide_index.md\":\"3c3d400d\",\"project_markdown_log_index.md\":\"bb95b786\",\"note_front-end engineering.md\":\"75c88456\",\"note_ssr.md\":\"ee0ee312\",\"self_index.md\":\"82f653ee\",\"note_react hooks.md\":\"7a05a70a\",\"note_react.md\":\"f9ad4dc2\",\"note_javascriptenhanced.md\":\"f1655783\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"ZiuChen\",\"description\":\"Unlimited Progress.\",\"base\":\"/\",\"head\":[],\"appearance\":true,\"themeConfig\":{\"logo\":\"/logo.png\",\"nav\":[{\"text\":\"首页\",\"link\":\"/\"},{\"text\":\"我的项目\",\"items\":[{\"text\":\"超级剪贴板\",\"link\":\"/project/ClipboardManager/\"},{\"text\":\"超级Markdown\",\"link\":\"/project/Markdown/\"},{\"text\":\"超级JavaScript\",\"link\":\"/project/JSRunner/\"},{\"text\":\"超级分词\",\"link\":\"/project/SmartWordBreak/\"}]},{\"text\":\"开源作品\",\"items\":[{\"text\":\"个人作品\",\"link\":\"/works/opensource\"},{\"text\":\"社区贡献\",\"link\":\"/works/contribution\"}]},{\"text\":\"学习笔记\",\"items\":[{\"text\":\"JavaScript基础\",\"link\":\"/note/JavaScript\"},{\"text\":\"CSS基础\",\"link\":\"/note/CSS\"},{\"text\":\"JavaScript进阶\",\"link\":\"/note/JavaScriptEnhanced\"},{\"text\":\"前端工程化\",\"link\":\"/note/Front-end Engineering\"},{\"text\":\"服务端渲染\",\"link\":\"/note/SSR\"},{\"text\":\"React基础\",\"link\":\"/note/React\"},{\"text\":\"React Hooks\",\"link\":\"/note/React Hooks\"},{\"text\":\"Redux\",\"link\":\"/note/Redux\"},{\"text\":\"React Router\",\"link\":\"/note/React Router\"},{\"text\":\"MySQL\",\"link\":\"/note/MySQL\"}]},{\"text\":\"个人介绍\",\"link\":\"/self/\"}],\"sidebar\":[{\"text\":\"我的项目\",\"items\":[{\"text\":\"超级剪贴板\",\"link\":\"/project/ClipboardManager/\"},{\"text\":\"超级Markdown\",\"link\":\"/project/Markdown/\"},{\"text\":\"超级JavaScript\",\"link\":\"/project/JSRunner/\"},{\"text\":\"超级分词\",\"link\":\"/project/SmartWordBreak/\"}]},{\"text\":\"开源作品\",\"collapsed\":true,\"items\":[{\"text\":\"个人作品\",\"link\":\"/works/opensource\"},{\"text\":\"社区贡献\",\"link\":\"/works/contribution\"}]},{\"text\":\"文章归档\",\"collapsed\":true,\"items\":[{\"text\":\"【2023】青训营 - 前端练习题汇总解析\",\"link\":\"/article/【2023】青训营 - 前端练习题汇总解析\"},{\"text\":\"【字节跳动】前端面试题总结\",\"link\":\"/article/【字节跳动】前端面试题总结\"},{\"text\":\"【快手】深入理解前端面试题\",\"link\":\"/article/【快手】深入理解前端面试题\"},{\"text\":\"【用友金融】前端面试题总结\",\"link\":\"/article/【用友金融】前端面试题总结\"},{\"text\":\"一文读懂事件冒泡与事件捕获\",\"link\":\"/article/一文读懂事件冒泡与事件捕获\"},{\"text\":\"一文读懂伪类与伪元素\",\"link\":\"/article/一文读懂伪类与伪元素\"},{\"text\":\"一文读懂函数中this指向问题\",\"link\":\"/article/一文读懂函数中this指向问题\"},{\"text\":\"从0实现一个年度报告\",\"link\":\"/article/从0实现一个年度报告\"},{\"text\":\"彻底搞懂对象的数据属性描述符、存储属性描述符\",\"link\":\"/article/彻底搞懂对象的数据属性描述符、存储属性描述符\"},{\"text\":\"浅析defineProperty与Proxy实现的双向绑定\",\"link\":\"/article/浅析defineProperty与Proxy实现的双向绑定\"},{\"text\":\"深入JavaScript数据类型\",\"link\":\"/article/深入JavaScript数据类型\"},{\"text\":\"深入Vue3源码,看看Vue.use后究竟发生了什么?\",\"link\":\"/article/深入Vue3源码,看看Vue.use后究竟发生了什么?\"},{\"text\":\"深入理解Proxy与Reflect\",\"link\":\"/article/深入理解Proxy与Reflect\"},{\"text\":\"深入理解浏览器缓存机制\",\"link\":\"/article/深入理解浏览器缓存机制\"},{\"text\":\"深入理解浏览器运行原理\",\"link\":\"/article/深入理解浏览器运行原理\"}]},{\"text\":\"学习笔记\",\"collapsed\":true,\"items\":[{\"text\":\"JavaScript基础\",\"link\":\"/note/JavaScript\"},{\"text\":\"CSS基础\",\"link\":\"/note/CSS\"},{\"text\":\"JavaScript进阶\",\"link\":\"/note/JavaScriptEnhanced\"},{\"text\":\"前端工程化\",\"link\":\"/note/Front-end Engineering\"},{\"text\":\"服务端渲染\",\"link\":\"/note/SSR\"},{\"text\":\"React基础\",\"link\":\"/note/React\"},{\"text\":\"React Hooks\",\"link\":\"/note/React Hooks\"},{\"text\":\"Redux\",\"link\":\"/note/Redux\"},{\"text\":\"React Router\",\"link\":\"/note/React Router\"},{\"text\":\"MySQL\",\"link\":\"/note/MySQL\"}]}],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/ZiuChen\"},{\"icon\":{\"svg\":\"<svg width=\\\"36\\\" height=\\\"28\\\" viewBox=\\\"0 0 36 28\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path fill-rule=\\\"evenodd\\\" clip-rule=\\\"evenodd\\\" d=\\\"M17.5875 6.77268L21.8232 3.40505L17.5875 0.00748237L17.5837 0L13.3555 3.39757L17.5837 6.76894L17.5875 6.77268ZM17.5863 17.3955H17.59L28.5161 8.77432L25.5526 6.39453L17.59 12.6808H17.5863L17.5825 12.6845L9.61993 6.40201L6.66016 8.78181L17.5825 17.3992L17.5863 17.3955ZM17.5828 23.2891L17.5865 23.2854L32.2133 11.7456L35.1768 14.1254L28.5238 19.3752L17.5865 28L0.284376 14.3574L0 14.1291L2.95977 11.7531L17.5828 23.2891Z\\\" fill=\\\"#1E80FF\\\"/></svg>\"},\"link\":\"https://juejin.cn/user/1887205216238477\"}],\"editLink\":{\"pattern\":\"https://github.com/ZiuChen/ZiuChen.github.io/edit/main/docs/:path\",\"text\":\"Edit this page on GitHub\"},\"footer\":{\"message\":\"Released under the MIT License.\",\"copyright\":\"Copyright © 2019-present Ziu Chen\"},\"lastUpdatedText\":\"Updated Date\",\"search\":{\"provider\":\"algolia\",\"options\":{\"appId\":\"LFZ2CPWWUG\",\"apiKey\":\"b4fd296ea5e467b3ac4a582160ff3122\",\"indexName\":\"ziuchenio\"}}},\"locales\":{},\"scrollOffset\":90,\"cleanUrls\":false}");</script>
|
||
|
||
</body>
|
||
</html> |