<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>资源提示 on ZiYang FrontEnd Interview</title><link>https://fe-interview.pangcy.cn/tags/%E8%B5%84%E6%BA%90%E6%8F%90%E7%A4%BA/</link><description>Recent content in 资源提示 on ZiYang FrontEnd Interview</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 06 Mar 2025 13:07:39 +0800</lastBuildDate><atom:link href="https://fe-interview.pangcy.cn/tags/%E8%B5%84%E6%BA%90%E6%8F%90%E7%A4%BA/index.xml" rel="self" type="application/rss+xml"/><item><title>资源加载性能优化</title><link>https://fe-interview.pangcy.cn/docs/network/network-25/</link><pubDate>Tue, 04 Mar 2025 09:31:00 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/network/network-25/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>本题主要考核候选人对以下维度的理解：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>浏览器资源加载机制&lt;/strong>：区分preload/prefetch/dns-prefetch的工作原理与应用场景&lt;/li>
&lt;li>&lt;strong>HTTP协议演进认知&lt;/strong>：解析HTTP/2 Server Push的RTT优化原理&lt;/li>
&lt;li>&lt;strong>性能优化实践能力&lt;/strong>：使用现代API实现懒加载的技术选型与实现细节&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>资源提示的优先级控制（preload立即加载 vs prefetch空闲加载）&lt;/li>
&lt;li>DNS预解析与TCP连接建立的时序关系&lt;/li>
&lt;li>Server Push的主动推送机制与传统请求响应模型的差异&lt;/li>
&lt;li>IntersectionObserver替代传统滚动监听方案的优势&lt;/li>
&lt;li>懒加载实现中的临界条件处理（占位符、加载失败等情况）&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>HTTP/2 Server Push &amp;gt; 资源提示优先级 &amp;gt; IntersectionObserver API&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>&lt;strong>资源提示对比&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;code>preload&lt;/code>：强制浏览器立即请求指定资源（优先级：High），适用于当前导航立刻需要的资源（如首屏字体/关键CSS）&lt;/li>
&lt;li>&lt;code>prefetch&lt;/code>：低优先级预加载未来页面可能使用的资源（如下一页的图片），浏览器空闲时执行&lt;/li>
&lt;li>&lt;code>dns-prefetch&lt;/code>：提前解析跨域DNS，缩短后续请求的DNS查询时间（约20-120ms）&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>HTTP/2 Server Push&lt;/strong>：
通过服务端主动推送关联资源，减少客户端解析HTML后再次请求资源的RTT（Round Trip Time）。例如请求&lt;code>index.html&lt;/code>时主动推送&lt;code>style.css&lt;/code>，消除CSS文件请求的1个RTT（传统HTTP/1.1需要：HTML请求→HTML响应→CSS请求→CSS响应）。&lt;/p>
&lt;p>&lt;strong>IntersectionObserver&lt;/strong>：
通过异步观察目标元素与视窗交叉状态，避免传统滚动监听的高频计算。当图片进入视口时替换&lt;code>data-src&lt;/code>为真实src，实现按需加载。&lt;/p>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>误用preload加载非关键资源，导致关键资源被延迟&lt;/li>
&lt;li>认为dns-prefetch能加速同域资源（实际同域DNS已缓存）&lt;/li>
&lt;li>未配置Server Push缓存策略导致重复推送&lt;/li>
&lt;li>懒加载未设置阈值（threshold）导致图片加载过早&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>资源提示场景&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;code>preload&lt;/code>：首屏关键字体、折叠上方CSS/JS&lt;/li>
&lt;li>&lt;code>prefetch&lt;/code>：用户鼠标悬停时预取下一页商品数据&lt;/li>
&lt;li>&lt;code>dns-prefetch&lt;/code>：电商平台预解析第三方支付域名DNS&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>HTTP/2 Server Push&lt;/strong>：
服务端在响应主资源时主动推送子资源，消除客户端&amp;quot;发现-请求&amp;quot;的等待时间。例如推送首屏CSS文件可减少至少1次RTT，但需配合缓存策略避免过度推送。&lt;/p>
&lt;p>&lt;strong>IntersectionObserver懒加载&lt;/strong>：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="83c618e" class="language-javascript ">
 &lt;code>// 观察所有带data-src的图片
const observer = new IntersectionObserver((entries) =&amp;gt; {
 entries.forEach(entry =&amp;gt; {
 if (entry.isIntersecting) { 
 const img = entry.target
 img.src = img.dataset.src
 observer.unobserve(img) // 加载后解除观察
 }
 })
}, {
 rootMargin: &amp;#39;200px&amp;#39;, // 提前200px触发加载
 threshold: 0.01
})

document.querySelectorAll(&amp;#39;img[data-src]&amp;#39;).forEach(img =&amp;gt; observer.observe(img))&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;hr>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="编码优化点">编码优化点 &lt;a href="#%e7%bc%96%e7%a0%81%e4%bc%98%e5%8c%96%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>加载失败处理&lt;/strong>：添加&lt;code>onerror&lt;/code>事件切换备用源&lt;/li>
&lt;li>&lt;strong>占位策略&lt;/strong>：使用低质量图片占位（LQIP）提升体验&lt;/li>
&lt;li>&lt;strong>兼容方案&lt;/strong>：添加IntersectionObserver polyfill或降级为滚动监听&lt;/li>
&lt;/ol>
&lt;h3 id="扩展性建议">扩展性建议 &lt;a href="#%e6%89%a9%e5%b1%95%e6%80%a7%e5%bb%ba%e8%ae%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;strong>大流量场景&lt;/strong>：结合CDN预解析（如&lt;code>&amp;lt;link rel=&amp;quot;preconnect&amp;quot;&amp;gt;&lt;/code>）&lt;/li>
&lt;li>&lt;strong>低端设备&lt;/strong>：降低观察阈值，采用渐进加载策略&lt;/li>
&lt;li>&lt;strong>SEO优化&lt;/strong>：添加&lt;code>&amp;lt;noscript&amp;gt;&lt;/code>标签保证爬虫可抓取&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ol>
&lt;li>
&lt;p>&lt;strong>如何验证Server Push实际效果？&lt;/strong>&lt;/p></description></item></channel></rss>