mirror of
https://github.com/ZiuChen/ZiuChen.github.io.git
synced 2025-08-18 07:29:33 +08:00
36 lines
63 KiB
HTML
36 lines
63 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.78ea14e7.css" as="style">
|
||
|
||
<script type="module" src="/assets/app.a781c5eb.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.4001cd3b.js">
|
||
<link rel="modulepreload" href="/assets/chunks/theme.8e68dbd8.js">
|
||
<link rel="modulepreload" href="/assets/article_深入理解浏览器缓存机制.md.a6bea3f7.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-c9141815><!--[--><!--]--><!--[--><span tabindex="-1" data-v-f364a430></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-f364a430> Skip to content </a><!--]--><!----><header class="VPNav" data-v-c9141815 data-v-39dca61f><div class="VPNavBar has-sidebar" data-v-39dca61f data-v-016664a6><div class="container" data-v-016664a6><div class="title" data-v-016664a6><div class="VPNavBarTitle has-sidebar" data-v-016664a6 data-v-2825b2da><a class="title" href="/" data-v-2825b2da><!--[--><!--]--><!--[--><img class="VPImage logo" src="/logo.png" alt data-v-f50a87e5><!--]--><!--[-->ZiuChen<!--]--><!--[--><!--]--></a></div></div><div class="content" data-v-016664a6><div class="curtain" data-v-016664a6></div><div class="content-body" data-v-016664a6><!--[--><!--]--><div class="VPNavBarSearch search" data-v-016664a6><!--[--><!----><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-016664a6 data-v-e51f2e59><span id="main-nav-aria-label" class="visually-hidden" data-v-e51f2e59>Main Navigation</span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/" tabindex="0" data-v-e51f2e59 data-v-4a25c51a><!--[--><span data-v-4a25c51a>首页</span><!--]--></a><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-e51f2e59 data-v-e98c12e5><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-e98c12e5><span class="text" data-v-e98c12e5><!----><span data-v-e98c12e5>我的项目</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-e98c12e5><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-e98c12e5><div class="VPMenu" data-v-e98c12e5 data-v-15053f44><div class="items" data-v-15053f44><!--[--><!--[--><div class="VPMenuLink" data-v-15053f44 data-v-d62828c4><a class="VPLink link" href="/project/ClipboardManager/" data-v-d62828c4><!--[-->超级剪贴板<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-15053f44 data-v-d62828c4><a class="VPLink link" href="/project/Markdown/" data-v-d62828c4><!--[-->超级Markdown<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-15053f44 data-v-d62828c4><a class="VPLink link" href="/project/JSRunner/" data-v-d62828c4><!--[-->超级JavaScript<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-15053f44 data-v-d62828c4><a class="VPLink link" href="/project/SmartWordBreak/" data-v-d62828c4><!--[-->超级分词<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-e51f2e59 data-v-e98c12e5><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-e98c12e5><span class="text" data-v-e98c12e5><!----><span data-v-e98c12e5>开源作品</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-e98c12e5><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-e98c12e5><div class="VPMenu" data-v-e98c12e5 data-v-15053f44><div class="items" data-v-15053f44><!--[--><!--[--><div class="VPMenuLink" data-v-15053f44 data-v-d62828c4><a class="VPLink link" href="/works/opensource.html" data-v-d62828c4><!--[-->个人作品<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-15053f44 data-v-d62828c4><a class="VPLink link" href="/works/contribution.html" data-v-d62828c4><!--[-->社区贡献<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-e51f2e59 data-v-e98c12e5><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-e98c12e5><span class="text" data-v-e98c12e5><!----><span data-v-e98c12e5>学习笔记</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-e98c12e5><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-e98c12e5><div class="VPMenu" data-v-e98c12e5 data-v-15053f44><div class="items" data-v-15053f44><!--[--><!--[--><div class="VPMenuLink" data-v-15053f44 data-v-d62828c4><a class="VPLink link" href="/note/JavaScript.html" data-v-d62828c4><!--[-->JavaScript基础<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-15053f44 data-v-d62828c4><a class="VPLink link" href="/note/CSS.html" data-v-d62828c4><!--[-->CSS基础<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-15053f44 data-v-d62828c4><a class="VPLink link" href="/note/JavaScriptEnhanced.html" data-v-d62828c4><!--[-->JavaScript进阶<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-15053f44 data-v-d62828c4><a class="VPLink link" href="/note/Front-end%20Engineering.html" data-v-d62828c4><!--[-->前端工程化<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-15053f44 data-v-d62828c4><a class="VPLink link" href="/note/SSR.html" data-v-d62828c4><!--[-->服务端渲染<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-15053f44 data-v-d62828c4><a class="VPLink link" href="/note/React.html" data-v-d62828c4><!--[-->React基础<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-15053f44 data-v-d62828c4><a class="VPLink link" href="/note/React%20Hooks.html" data-v-d62828c4><!--[-->React Hooks<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-15053f44 data-v-d62828c4><a class="VPLink link" href="/note/Redux.html" data-v-d62828c4><!--[-->Redux<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-15053f44 data-v-d62828c4><a class="VPLink link" href="/note/React%20Router.html" data-v-d62828c4><!--[-->React Router<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-15053f44 data-v-d62828c4><a class="VPLink link" href="/note/MySQL.html" data-v-d62828c4><!--[-->MySQL<!--]--></a></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/self/" tabindex="0" data-v-e51f2e59 data-v-4a25c51a><!--[--><span data-v-4a25c51a>个人介绍</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-016664a6 data-v-0e3f34fb><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="toggle dark mode" aria-checked="false" data-v-0e3f34fb data-v-842ac2d6 data-v-02e88dea><span class="check" data-v-02e88dea><span class="icon" data-v-02e88dea><!--[--><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="sun" data-v-842ac2d6><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-842ac2d6><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-016664a6 data-v-7862e4c4 data-v-25970e8f><!--[--><a class="VPSocialLink no-icon" href="https://github.com/ZiuChen" aria-label="github" target="_blank" rel="noopener" data-v-25970e8f data-v-377059e4><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-25970e8f data-v-377059e4><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-016664a6 data-v-c5775a0c data-v-e98c12e5><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-e98c12e5><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="icon" data-v-e98c12e5><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-e98c12e5><div class="VPMenu" data-v-e98c12e5 data-v-15053f44><!----><!--[--><!--[--><!----><div class="group" data-v-c5775a0c><div class="item appearance" data-v-c5775a0c><p class="label" data-v-c5775a0c>Appearance</p><div class="appearance-action" data-v-c5775a0c><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="toggle dark mode" aria-checked="false" data-v-c5775a0c data-v-842ac2d6 data-v-02e88dea><span class="check" data-v-02e88dea><span class="icon" data-v-02e88dea><!--[--><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="sun" data-v-842ac2d6><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-842ac2d6><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-c5775a0c><div class="item social-links" data-v-c5775a0c><div class="VPSocialLinks social-links-list" data-v-c5775a0c data-v-25970e8f><!--[--><a class="VPSocialLink no-icon" href="https://github.com/ZiuChen" aria-label="github" target="_blank" rel="noopener" data-v-25970e8f data-v-377059e4><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-25970e8f data-v-377059e4><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-016664a6 data-v-3b176817><span class="container" data-v-3b176817><span class="top" data-v-3b176817></span><span class="middle" data-v-3b176817></span><span class="bottom" data-v-3b176817></span></span></button></div></div></div></div><!----></header><div class="VPLocalNav reached-top" data-v-c9141815 data-v-7b873ae9><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-7b873ae9><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="menu-icon" data-v-7b873ae9><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-7b873ae9>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-7b873ae9 data-v-c2e82416><button data-v-c2e82416>Return to top</button><!----></div></div><aside class="VPSidebar" data-v-c9141815 data-v-cadfaea8><div class="curtain" data-v-cadfaea8></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-cadfaea8><span class="visually-hidden" id="sidebar-aria-label" data-v-cadfaea8> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="group" data-v-cadfaea8><section class="VPSidebarItem level-0" data-v-cadfaea8 data-v-d0c47f51><div class="item" role="button" tabindex="0" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></div><h2 class="text" data-v-d0c47f51>我的项目</h2><!----></div><div class="items" data-v-d0c47f51><!--[--><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></div><a class="VPLink link link" href="/project/ClipboardManager/" data-v-d0c47f51><!--[--><p class="text" data-v-d0c47f51>超级剪贴板</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></div><a class="VPLink link link" href="/project/Markdown/" data-v-d0c47f51><!--[--><p class="text" data-v-d0c47f51>超级Markdown</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></div><a class="VPLink link link" href="/project/JSRunner/" data-v-d0c47f51><!--[--><p class="text" data-v-d0c47f51>超级JavaScript</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></div><a class="VPLink link link" href="/project/SmartWordBreak/" data-v-d0c47f51><!--[--><p class="text" data-v-d0c47f51>超级分词</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-cadfaea8><section class="VPSidebarItem level-0 collapsible collapsed" data-v-cadfaea8 data-v-d0c47f51><div class="item" role="button" tabindex="0" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></div><h2 class="text" data-v-d0c47f51>开源作品</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-d0c47f51><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-d0c47f51><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-d0c47f51><!--[--><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></div><a class="VPLink link link" href="/works/opensource.html" data-v-d0c47f51><!--[--><p class="text" data-v-d0c47f51>个人作品</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></div><a class="VPLink link link" href="/works/contribution.html" data-v-d0c47f51><!--[--><p class="text" data-v-d0c47f51>社区贡献</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-cadfaea8><section class="VPSidebarItem level-0 collapsible has-active" data-v-cadfaea8 data-v-d0c47f51><div class="item" role="button" tabindex="0" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></div><h2 class="text" data-v-d0c47f51>文章归档</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-d0c47f51><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-d0c47f51><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-d0c47f51><!--[--><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></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-d0c47f51><!--[--><p class="text" data-v-d0c47f51>【2023】青训营 - 前端练习题汇总解析</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></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-d0c47f51><!--[--><p class="text" data-v-d0c47f51>【字节跳动】前端面试题总结</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></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-d0c47f51><!--[--><p class="text" data-v-d0c47f51>【快手】深入理解前端面试题</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></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-d0c47f51><!--[--><p class="text" data-v-d0c47f51>【用友金融】前端面试题总结</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></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-d0c47f51><!--[--><p class="text" data-v-d0c47f51>一文读懂事件冒泡与事件捕获</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></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-d0c47f51><!--[--><p class="text" data-v-d0c47f51>一文读懂伪类与伪元素</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></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-d0c47f51><!--[--><p class="text" data-v-d0c47f51>一文读懂函数中this指向问题</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></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-d0c47f51><!--[--><p class="text" data-v-d0c47f51>从0实现一个年度报告</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></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-d0c47f51><!--[--><p class="text" data-v-d0c47f51>彻底搞懂对象的数据属性描述符、存储属性描述符</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></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-d0c47f51><!--[--><p class="text" data-v-d0c47f51>浅析defineProperty与Proxy实现的双向绑定</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></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-d0c47f51><!--[--><p class="text" data-v-d0c47f51>深入JavaScript数据类型</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></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-d0c47f51><!--[--><p class="text" data-v-d0c47f51>深入Vue3源码,看看Vue.use后究竟发生了什么?</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></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-d0c47f51><!--[--><p class="text" data-v-d0c47f51>深入理解Proxy与Reflect</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></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-d0c47f51><!--[--><p class="text" data-v-d0c47f51>深入理解浏览器缓存机制</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></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-d0c47f51><!--[--><p class="text" data-v-d0c47f51>深入理解浏览器运行原理</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-cadfaea8><section class="VPSidebarItem level-0 collapsible collapsed" data-v-cadfaea8 data-v-d0c47f51><div class="item" role="button" tabindex="0" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></div><h2 class="text" data-v-d0c47f51>学习笔记</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-d0c47f51><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-d0c47f51><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-d0c47f51><!--[--><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></div><a class="VPLink link link" href="/note/JavaScript.html" data-v-d0c47f51><!--[--><p class="text" data-v-d0c47f51>JavaScript基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></div><a class="VPLink link link" href="/note/CSS.html" data-v-d0c47f51><!--[--><p class="text" data-v-d0c47f51>CSS基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></div><a class="VPLink link link" href="/note/JavaScriptEnhanced.html" data-v-d0c47f51><!--[--><p class="text" data-v-d0c47f51>JavaScript进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></div><a class="VPLink link link" href="/note/Front-end%20Engineering.html" data-v-d0c47f51><!--[--><p class="text" data-v-d0c47f51>前端工程化</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></div><a class="VPLink link link" href="/note/SSR.html" data-v-d0c47f51><!--[--><p class="text" data-v-d0c47f51>服务端渲染</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></div><a class="VPLink link link" href="/note/React.html" data-v-d0c47f51><!--[--><p class="text" data-v-d0c47f51>React基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></div><a class="VPLink link link" href="/note/React%20Hooks.html" data-v-d0c47f51><!--[--><p class="text" data-v-d0c47f51>React Hooks</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></div><a class="VPLink link link" href="/note/Redux.html" data-v-d0c47f51><!--[--><p class="text" data-v-d0c47f51>Redux</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></div><a class="VPLink link link" href="/note/React%20Router.html" data-v-d0c47f51><!--[--><p class="text" data-v-d0c47f51>React Router</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-d0c47f51 data-v-d0c47f51><div class="item" data-v-d0c47f51><div class="indicator" data-v-d0c47f51></div><a class="VPLink link link" href="/note/MySQL.html" data-v-d0c47f51><!--[--><p class="text" data-v-d0c47f51>MySQL</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-c9141815 data-v-a52b0863><div class="VPDoc has-sidebar has-aside" data-v-a52b0863 data-v-4ad9891f><!--[--><!--]--><div class="container" data-v-4ad9891f><div class="aside" data-v-4ad9891f><div class="aside-curtain" data-v-4ad9891f></div><div class="aside-container" data-v-4ad9891f><div class="aside-content" data-v-4ad9891f><div class="VPDocAside" data-v-4ad9891f data-v-00c6d4f2><!--[--><!--]--><!--[--><!--]--><div class="VPDocAsideOutline" role="navigation" data-v-00c6d4f2 data-v-48e05f7c><div class="content" data-v-48e05f7c><div class="outline-marker" data-v-48e05f7c></div><div class="outline-title" role="heading" aria-level="2" data-v-48e05f7c>On this page</div><nav aria-labelledby="doc-outline-aria-label" data-v-48e05f7c><span class="visually-hidden" id="doc-outline-aria-label" data-v-48e05f7c> Table of Contents for current page </span><ul class="root" data-v-48e05f7c data-v-1d1e520e><!--[--><!--]--></ul></nav></div></div><!--[--><!--]--><div class="spacer" data-v-00c6d4f2></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-4ad9891f><div class="content-container" data-v-4ad9891f><!--[--><!--]--><!----><main class="main" data-v-4ad9891f><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%E7%BC%93%E5%AD%98%E6%9C%BA%E5%88%B6" data-v-4ad9891f><div><h1 id="深入理解浏览器缓存机制" tabindex="-1">深入理解浏览器缓存机制 <a class="header-anchor" href="#深入理解浏览器缓存机制" aria-label="Permalink to "深入理解浏览器缓存机制""></a></h1><p>浏览器有两种缓存规则:强制缓存与协商缓存</p><ol><li>强制缓存:不会向服务器发送请求,直接从缓存中读取资源</li><li>协商缓存:向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中协商缓存,如果命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源</li></ol><ul><li>共同点:都是从客户端缓存中读取资源</li><li>不同点:强制缓存不会发请求,协商缓存会发请求</li></ul><h2 id="强制缓存" tabindex="-1">强制缓存 <a class="header-anchor" href="#强制缓存" aria-label="Permalink to "强制缓存""></a></h2><h3 id="什么是强制缓存" tabindex="-1">什么是强制缓存 <a class="header-anchor" href="#什么是强制缓存" aria-label="Permalink to "什么是强制缓存""></a></h3><p>浏览器在服务器发起真正请求前,先检查浏览器缓存:</p><ul><li>如果命中缓存,且缓存未过期,那么直接使用缓存资源</li><li>如果未命中缓存,或缓存已过期失效,那么向服务器发出请求</li></ul><h3 id="强制缓存的规则" tabindex="-1">强制缓存的规则 <a class="header-anchor" href="#强制缓存的规则" aria-label="Permalink to "强制缓存的规则""></a></h3><p>服务器通过向响应头添加<code>Expires</code>和<code>Cache-Control</code>字段来标识强制缓存的状态,浏览器会将这两个信息缓存到本地,后续有相同请求时,优先到浏览器缓存中检查资源是否到期。</p><p>其中<code>Cache-Control</code>优先级比<code>Expires</code>高,即:二者同时存在时,浏览器以<code>Cache-Control</code>为标准,检查缓存资源是否过期</p><h3 id="expires与cache-control" tabindex="-1">Expires与Cache-Control <a class="header-anchor" href="#expires与cache-control" aria-label="Permalink to "Expires与Cache-Control""></a></h3><h4 id="expires" tabindex="-1">Expires <a class="header-anchor" href="#expires" aria-label="Permalink to "Expires""></a></h4><p><code>Expires</code>表示当前资源的失效时间,它的值是一个HTTP-日期时间戳,例如:<code>Expires: Thu, 01 Dec 1994 16:00:00 GMT</code></p><p>使用<code>Expires</code>存在一些弊端:</p><ul><li>代表的是绝对时间,如果浏览器和服务器的时间不同步,会导致缓存目标时间存在偏差</li><li>如果服务端设置的日期格式不规范,那么等同于无缓存</li><li><code>Expires</code>是<code>HTTP/1.0</code>的字段,但是现在浏览器默认使用的是<code>HTTP/1.1</code></li></ul><p>在某些不支持HTTP1.1的环境下,<code>Expires</code>就会发挥用处</p><p>所以<code>Expires</code>其实是过时的产物,现阶段它的存在只是一种兼容性的写法</p><h4 id="cache-control" tabindex="-1">Cache-Control <a class="header-anchor" href="#cache-control" aria-label="Permalink to "Cache-Control""></a></h4><p>如果在<code>Cache-Control</code>响应头设置了"max-age"或者"s-max-age"指令,那么<code>Expires</code>头会被忽略</p><p>设置<code>Cache-Control</code>的值有以下规则:</p><ul><li>不区分大小写,但建议使用小写</li><li>多个指令以逗号分隔</li><li>具有可选参数,可以用令牌或者带引号的字符串语法</li></ul><p>常用的指令:</p><ul><li>public:所有内容都将被缓存,即使是通常不可缓存的内容(如POST请求)。</li><li>private:所有内容只有客户端可以缓存,不能作为共享缓存(即代理服务器不能缓存它),这也是<code>Cache-Control</code>的默认取值</li><li>no-cache:客户端缓存内容,但是是否使用缓存则需要经过协商缓存来验证决定</li><li>no-store:所有内容都不会被缓存,即不使用强制缓存,也不使用协商缓存,即不使用任何缓存。</li><li>max-age=xxx (xxx is numeric):缓存内容将在xxx秒后失效</li></ul><p>举几个例子:</p><p>此次请求之后的600秒内,如果浏览器再次发起请求,那么直接使用缓存中的资源:</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;">Cache-Control: max-age=600</span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292e;">Cache-Control: max-age=600</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</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;">Cache-Control: no-cache</span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292e;">Cache-Control: no-cache</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</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;">Cache-Control: max-age=0, must-revalidate</span></span></code></pre><pre class="shiki github-light vp-code-light"><code><span class="line"><span style="color:#24292e;">Cache-Control: max-age=0, must-revalidate</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p>这意味着每次都会发起 HTTP 请求,但当缓存内容仍有效时可以跳过 HTTP 响应体的下载</p><h2 id="协商缓存" tabindex="-1">协商缓存 <a class="header-anchor" href="#协商缓存" aria-label="Permalink to "协商缓存""></a></h2><p>当浏览器检查本地的<strong>强制缓存</strong>已经失效后,浏览器携带该资源的<strong>协商缓存</strong>标识向服务器发起请求,由服务器根据缓存标识决定是否继续使用本地缓存。</p><ul><li>协商缓存生效,服务器返回304,通知浏览器继续使用本地缓存</li><li>协商缓存失效,服务器返回200,与最新的请求资源</li></ul><h3 id="协商缓存的规则" tabindex="-1">协商缓存的规则 <a class="header-anchor" href="#协商缓存的规则" aria-label="Permalink to "协商缓存的规则""></a></h3><p>服务器与浏览器通过两两成对的请求头来控制协商缓存:</p><ul><li><code>Etag</code> <code>If-None-Match</code></li><li><code>Last-Modified</code> <code>If-Modified-Since</code></li></ul><p>其中,<code>Etag</code>与<code>Last-Modified</code>是由服务器设置的响应头的字段,<code>If-None-Match</code>与<code>If-Modified-Since</code>则是浏览器向服务器发送的请求头的字段</p><h4 id="etag与last-modified" tabindex="-1">Etag与Last-Modified <a class="header-anchor" href="#etag与last-modified" aria-label="Permalink to "Etag与Last-Modified""></a></h4><p><code>Etag</code>是上一次加载资源时,服务器返回的ResponseHeader,是对该资源的一种唯一标识,只要资源有变化,<code>Etag</code>就会重新生成。浏览器在下一次加载资源向服务器发送请求时,会将上一次返回的<code>Etag</code>值放到RequestHeader里的<code>If-None-Match</code>里,服务器接受到<code>If-None-Match</code>的值后,会拿来跟该资源文件的<code>Etag</code>值做比较,如果相同,则表示资源文件没有发生改变,命中协商缓存。</p><ul><li><code>Etag</code>由服务器生成,标志当前资源的唯一标识,一般包含大小、修改时间等信息</li><li><code>If-None-Match</code>浏览器缓存到本地的<code>Etag</code>值</li></ul><p>HTTP协议并未规定<code>Etag</code>的内容是如何生成的,但一般包含大小、修改时间等信息</p><p>Node.js下生成<code>Etag</code>的示例:</p><div class="language-js vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki github-dark vp-code-dark"><code><span class="line"><span style="color:#6A737D;">// 根据文件的fs.Stats信息计算出etag</span></span>
|
||
<span class="line"><span style="color:#F97583;">const</span><span style="color:#E1E4E8;"> </span><span style="color:#B392F0;">genEtag</span><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">=</span><span style="color:#E1E4E8;"> (</span><span style="color:#FFAB70;">stat</span><span style="color:#E1E4E8;">) </span><span style="color:#F97583;">=></span><span style="color:#E1E4E8;"> {</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">const</span><span style="color:#E1E4E8;"> </span><span style="color:#79B8FF;">fileLength</span><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">=</span><span style="color:#E1E4E8;"> stat.size </span><span style="color:#6A737D;">// 文件的大小</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">const</span><span style="color:#E1E4E8;"> </span><span style="color:#79B8FF;">fileLastModifiedTime</span><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">=</span><span style="color:#E1E4E8;"> stat.mtime.</span><span style="color:#B392F0;">getTime</span><span style="color:#E1E4E8;">() </span><span style="color:#6A737D;">// 文件的最后更改时间</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#6A737D;">// 数字都用16进制表示</span></span>
|
||
<span class="line"><span style="color:#E1E4E8;"> </span><span style="color:#F97583;">return</span><span style="color:#E1E4E8;"> </span><span style="color:#9ECBFF;">`${</span><span style="color:#E1E4E8;">fileLength</span><span style="color:#9ECBFF;">.</span><span style="color:#B392F0;">toString</span><span style="color:#9ECBFF;">(</span><span style="color:#79B8FF;">16</span><span style="color:#9ECBFF;">)</span><span style="color:#9ECBFF;">}-${</span><span style="color:#E1E4E8;">fileLastModifiedTime</span><span style="color:#9ECBFF;">.</span><span style="color:#B392F0;">toString</span><span style="color:#9ECBFF;">(</span><span style="color:#79B8FF;">16</span><span style="color:#9ECBFF;">)</span><span style="color:#9ECBFF;">}`</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:#6A737D;">// 根据文件的fs.Stats信息计算出etag</span></span>
|
||
<span class="line"><span style="color:#D73A49;">const</span><span style="color:#24292E;"> </span><span style="color:#6F42C1;">genEtag</span><span style="color:#24292E;"> </span><span style="color:#D73A49;">=</span><span style="color:#24292E;"> (</span><span style="color:#E36209;">stat</span><span style="color:#24292E;">) </span><span style="color:#D73A49;">=></span><span style="color:#24292E;"> {</span></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#D73A49;">const</span><span style="color:#24292E;"> </span><span style="color:#005CC5;">fileLength</span><span style="color:#24292E;"> </span><span style="color:#D73A49;">=</span><span style="color:#24292E;"> stat.size </span><span style="color:#6A737D;">// 文件的大小</span></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#D73A49;">const</span><span style="color:#24292E;"> </span><span style="color:#005CC5;">fileLastModifiedTime</span><span style="color:#24292E;"> </span><span style="color:#D73A49;">=</span><span style="color:#24292E;"> stat.mtime.</span><span style="color:#6F42C1;">getTime</span><span style="color:#24292E;">() </span><span style="color:#6A737D;">// 文件的最后更改时间</span></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#6A737D;">// 数字都用16进制表示</span></span>
|
||
<span class="line"><span style="color:#24292E;"> </span><span style="color:#D73A49;">return</span><span style="color:#24292E;"> </span><span style="color:#032F62;">`${</span><span style="color:#24292E;">fileLength</span><span style="color:#032F62;">.</span><span style="color:#6F42C1;">toString</span><span style="color:#032F62;">(</span><span style="color:#005CC5;">16</span><span style="color:#032F62;">)</span><span style="color:#032F62;">}-${</span><span style="color:#24292E;">fileLastModifiedTime</span><span style="color:#032F62;">.</span><span style="color:#6F42C1;">toString</span><span style="color:#032F62;">(</span><span style="color:#005CC5;">16</span><span style="color:#032F62;">)</span><span style="color:#032F62;">}`</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><h4 id="last-modified与if-modified-since" tabindex="-1">Last-Modified与If-Modified-Since <a class="header-anchor" href="#last-modified与if-modified-since" aria-label="Permalink to "Last-Modified与If-Modified-Since""></a></h4><p><code>Last-Modified</code>是该资源文件最后一次更改时间,服务器会在ResponseHeader里返回,同时浏览器会将这个值保存起来,在下一次发送请求时,放到RequestHeader里的<code>If-Modified-Since</code>里,服务器在接收到后也会做比对,如果相同则命中协商缓存。</p><ul><li><code>Last-Modified</code>由服务器添加,标志资源文件上次被修改的时间</li><li><code>If-Modified-Since</code>浏览器缓存到本地的<code>Last-Modified</code>值</li></ul><p><code>If-None-Match</code>的优先级要高于<code>If-Modified-Since</code>,即:如果浏览器同时存在</p><h4 id="两种协商缓存的区别" tabindex="-1">两种协商缓存的区别 <a class="header-anchor" href="#两种协商缓存的区别" aria-label="Permalink to "两种协商缓存的区别""></a></h4><ul><li>精确度上,<code>Etag</code>要优于<code>Last-Modified</code>。<code>Last-Modified</code>的时间单位是秒,如果某个文件在1秒内改变了多次,那么他们的<code>Last-Modified</code>其实并没有体现出来修改,但是Etag每次都会改变确保了精度;如果是负载均衡的服务器,各个服务器生成的<code>Last-Modified</code>也有可能不一致。</li><li>性能上,<code>Etag</code>要逊于<code>Last-Modified</code>,毕竟<code>Last-Modified</code>只需要记录时间,而<code>Etag</code>需要服务器通过算法来计算出一个值。</li><li>优先级上,服务器校验优先使用<code>Etag</code>。</li></ul><h2 id="内存缓存与硬盘缓存" tabindex="-1">内存缓存与硬盘缓存 <a class="header-anchor" href="#内存缓存与硬盘缓存" aria-label="Permalink to "内存缓存与硬盘缓存""></a></h2><p>当我们打开一个新网页,服务器返回200,将资源发送给浏览器,浏览器做本地缓存</p><p>当我们刷新标签页,浏览器从内存缓存获得资源</p><p>当我们关闭标签页重新打开,浏览器从硬盘缓存获得资源</p><ul><li><strong>内存缓存</strong>(MemoryCache):内存缓存具有两个特点,分别是快速读取和时效性 <ul><li>快速读取:内存缓存会将编译解析后的文件,直接存入该进程的内存中,占据该进程一定的内存资源,以方便下次运行使用时的快速读取。</li><li>时效性:一旦该进程关闭,则该进程的内存则会清空。</li></ul></li><li><strong>硬盘缓存</strong>(DiskCache):硬盘缓存则是直接将缓存写入硬盘文件中,读取缓存需要对该缓存存放的硬盘文件进行I/O操作,然后重新解析该缓存内容,读取复杂,速度比内存缓存慢。</li></ul><p>在浏览器中,浏览器会在js和图片等文件解析执行后直接存入内存缓存中,那么当刷新页面时只需直接从内存缓存中读取(MemoryCache);而css文件则会存入硬盘文件中,所以每次渲染页面都需要从硬盘读取缓存(DiskCache)。</p><h2 id="用户对浏览器缓存的控制" tabindex="-1">用户对浏览器缓存的控制 <a class="header-anchor" href="#用户对浏览器缓存的控制" aria-label="Permalink to "用户对浏览器缓存的控制""></a></h2><ul><li>地址栏访问,链接跳转是正常用户行为,将会触发浏览器缓存机制</li><li>F5刷新,浏览器会设置max-age=0,跳过强缓存判断,会进行协商缓存判断</li><li>Ctrl+F5刷新,跳过强缓存和协商缓存,直接从服务器拉取资源</li></ul><h2 id="参考资料" tabindex="-1">参考资料 <a class="header-anchor" href="#参考资料" aria-label="Permalink to "参考资料""></a></h2><p><a href="https://juejin.cn/post/6844903593275817998" target="_blank" rel="noreferrer">[稀土掘金] 彻底理解浏览器的缓存机制</a></p><p><a href="https://mp.weixin.qq.com/s?__biz=MjM5MTA1MjAxMQ==&mid=2651226262&idx=1&sn=2128db200b88479face67ed8e095757c&chksm=bd4959128a3ed0041b43a5683c75c4b88c7d35fac909a59c14b4e9fc11e8d408680b171d2706&scene=21#wechat_redirect" target="_blank" rel="noreferrer">[微信公众号] 浏览器的缓存机制小结</a></p><p><a href="https://mp.weixin.qq.com/s?__biz=MjM5MTA1MjAxMQ==&mid=2651226347&idx=1&sn=6dbccc54406f0b075671884b738b1e88&chksm=bd49596f8a3ed079f79cda4b90ac3cb3b1dbdb5bfb8aade962a16a323563bf26a0c75b0a5d7b&scene=21#wechat_redirect" target="_blank" rel="noreferrer">[微信公众号] 浏览器缓存机制剖析</a></p><p><a href="https://httpwg.org/specs/rfc9111.html#field.expires" target="_blank" rel="noreferrer">[RFC-9111] Expires</a></p><p><a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Expires" target="_blank" rel="noreferrer">[MDN] Expires</a></p><p><a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Cache-Control" target="_blank" rel="noreferrer">[MDN] Cache-Control</a></p><p><a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/ETag" target="_blank" rel="noreferrer">[MDN] ETag</a></p></div></div></main><footer class="VPDocFooter" data-v-4ad9891f data-v-3ec2f4a2><!--[--><!--]--><div class="edit-info" data-v-3ec2f4a2><div class="edit-link" data-v-3ec2f4a2><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-3ec2f4a2><!--[--><svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24" class="edit-link-icon" aria-label="edit icon" data-v-3ec2f4a2><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-3ec2f4a2><p class="VPLastUpdated" data-v-3ec2f4a2 data-v-a4c9a2aa>Updated Date: <time datetime="2023-10-15T15:44:32.000Z" data-v-a4c9a2aa></time></p></div></div><nav class="prev-next" data-v-3ec2f4a2><div class="pager" data-v-3ec2f4a2><a class="pager-link prev" href="/article/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Proxy%E4%B8%8EReflect.html" data-v-3ec2f4a2><span class="desc" data-v-3ec2f4a2>Previous page</span><span class="title" data-v-3ec2f4a2>深入理解Proxy与Reflect</span></a></div><div class="pager" data-v-3ec2f4a2><a class="pager-link next" 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-3ec2f4a2><span class="desc" data-v-3ec2f4a2>Next page</span><span class="title" data-v-3ec2f4a2>深入理解浏览器运行原理</span></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-c9141815 data-v-9d485890><div class="container" data-v-9d485890><p class="message" data-v-9d485890>Released under the MIT License.</p><p class="copyright" data-v-9d485890>Copyright © 2019-present Ziu Chen</p></div></footer><!--[--><!--]--></div></div>
|
||
<script>window.__VP_HASH_MAP__=JSON.parse("{\"article_【2023】青训营 - 前端练习题汇总解析.md\":\"aa190ddf\",\"article_深入vue3源码,看看vue.use后究竟发生了什么?.md\":\"2b658e3e\",\"article_深入理解proxy与reflect.md\":\"401b4485\",\"article_深入理解浏览器缓存机制.md\":\"a6bea3f7\",\"index.md\":\"fe8c7cbb\",\"article_【字节跳动】前端面试题总结.md\":\"42768ab4\",\"project_smartwordbreak_log_index.md\":\"87149106\",\"project_smartwordbreak_statement_index.md\":\"1b715e22\",\"self_index.md\":\"491f0451\",\"works_contribution.md\":\"b5f9d194\",\"article_深入javascript数据类型.md\":\"6747103c\",\"project_markdown_shortcut_index.md\":\"1699a2d5\",\"article_一文读懂事件冒泡与事件捕获.md\":\"856738eb\",\"article_一文读懂伪类与伪元素.md\":\"dbc07ad4\",\"article_一文读懂函数中this指向问题.md\":\"12bfc833\",\"works_opensource.md\":\"9605f7f0\",\"article_【用友金融】前端面试题总结.md\":\"7d18297e\",\"article_深入理解浏览器运行原理.md\":\"7e8ced80\",\"project_clipboardmanager_guide_index.md\":\"f8c33081\",\"article_浅析defineproperty与proxy实现的双向绑定.md\":\"b8099d26\",\"note_react hooks.md\":\"2ef245f9\",\"note_redux.md\":\"cd32f22c\",\"project_clipboardmanager_index.md\":\"dc026d9b\",\"note_javascript.md\":\"7aa1be4e\",\"project_clipboardmanager_statement_index.md\":\"ca46cedc\",\"note_mysql.md\":\"723f9f3c\",\"article_【快手】深入理解前端面试题.md\":\"cd45f043\",\"project_jsrunner_index.md\":\"88004f21\",\"article_从0实现一个年度报告.md\":\"3f21cc7d\",\"note_ssr.md\":\"4af2a999\",\"project_clipboardmanager_log_index.md\":\"8031dc7b\",\"project_clipboardmanager_vip_index.md\":\"16aa5707\",\"project_smartwordbreak_index.md\":\"f4239657\",\"note_react router.md\":\"20bbcc63\",\"note_javascriptenhanced.md\":\"4355fe68\",\"article_彻底搞懂对象的数据属性描述符、存储属性描述符.md\":\"b0c08981\",\"project_jsrunner_log_index.md\":\"3a1c4f34\",\"note_front-end engineering.md\":\"76688693\",\"project_markdown_index.md\":\"1353487e\",\"project_markdown_log_index.md\":\"fd1f5d3a\",\"note_css.md\":\"81f696ed\",\"note_react.md\":\"9f1f5481\"}");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> |