<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>小红书-社招-5年 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/</link><description>Recent content in 小红书-社招-5年 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 01 Feb 2026 14:42:25 +0000</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/index.xml" rel="self" type="application/rss+xml"/><item><title>小红书-社招-5年 · 第 1 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/round-159/</link><pubDate>Sun, 01 Feb 2026 14:42:25 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/round-159/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/round-160/"&gt;第 2 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 该轮面试主要考察了前端基础知识，包括BFC、浮动元素、作用域、异步编程、Webpack、Vue等多方面的内容。题目涉及理论知识和代码实现。&lt;/p&gt;
&lt;p&gt;本轮共 18 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-5c174882-c1e7-4c08-a71a-f4c991be552f"&gt;1. BFC讲一下&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/5c174882-c1e7-4c08-a71a-f4c991be552f"&gt;什么是BFC？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;BFC（Block Formatting Context）&lt;/strong&gt; 是 CSS 中一个重要的布局概念，它描述了一个块级元素的内部布局和外部布局之间的关系。BFC 主要用于处理元素的布局、浮动、边距合并等问题。&lt;/p&gt;
&lt;h3 id="bfc-的作用"&gt;BFC 的作用&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;阻止外边距折叠&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;外边距折叠&lt;/strong&gt;：当两个块级元素垂直相邻时，它们的外边距会合并，形成一个更大的外边距。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BFC&lt;/strong&gt;：在 BFC 内部的元素的外边距不会影响到外部 BFC 的元素，避免了外边距折叠的问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;包含浮动元素&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;浮动元素&lt;/strong&gt;：通常会从其包含块中溢出。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BFC&lt;/strong&gt;：具有 BFC 的元素可以包含其内部的浮动元素，确保其高度包括浮动元素的高度。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;控制元素的布局&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BFC&lt;/strong&gt;：在 BFC 内部，元素的布局（如浮动、定位）会受到影响和控制，避免与外部元素发生冲突。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;防止元素重叠&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BFC&lt;/strong&gt;：能够隔离不同的 BFC 区域，避免元素之间的重叠或干扰。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="如何触发-bfc"&gt;如何触发 BFC&lt;/h3&gt;
&lt;p&gt;BFC 会在以下情况中被触发：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;块级格式化上下文的创建&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;元素的 &lt;code&gt;display&lt;/code&gt; 属性值为 &lt;code&gt;block&lt;/code&gt; 或 &lt;code&gt;inline-block&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;元素的 &lt;code&gt;position&lt;/code&gt; 属性值为 &lt;code&gt;absolute&lt;/code&gt; 或 &lt;code&gt;fixed&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;元素的 &lt;code&gt;float&lt;/code&gt; 属性值为 &lt;code&gt;left&lt;/code&gt; 或 &lt;code&gt;right&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;元素的 &lt;code&gt;overflow&lt;/code&gt; 属性值为 &lt;code&gt;hidden&lt;/code&gt;、&lt;code&gt;scroll&lt;/code&gt; 或 &lt;code&gt;auto&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;其他常见触发情况&lt;/strong&gt;：&lt;/p&gt;</description></item><item><title>小红书-社招-5年 · 第 2 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/round-160/</link><pubDate>Sun, 01 Feb 2026 14:42:25 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/round-160/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/round-159/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 该轮面试主要考察了浏览器的工作原理、缓存策略、跨域、Vue生命周期、组件通信等方面的知识。题目涉及理论知识和实际应用场景。&lt;/p&gt;
&lt;p&gt;本轮共 14 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-5def10e9-7825-4bd4-a76e-6d7eb555a2ce"&gt;1. 详细讲一下从url输入网址到页面渲染的过程&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/5def10e9-7825-4bd4-a76e-6d7eb555a2ce"&gt;简单描述从输入网址到页面显示的过程&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;当输入URL到页面加载完成，发生了以下几个关键过程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;DNS解析&lt;/strong&gt;：浏览器将URL解析为对应的IP地址。这个过程涉及多级DNS服务器，从本地缓存开始，如果没有找到，则递归查询根域名服务器、顶级域名服务器，直到找到目标服务器的IP地址。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TCP连接&lt;/strong&gt;：浏览器通过三次握手与服务器建立TCP连接。一旦连接建立，浏览器可以发送HTTP请求。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP请求&lt;/strong&gt;：浏览器构建HTTP请求报文，通过TCP连接发送到服务器。请求报文包含请求行、请求头和请求正文。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务器处理请求&lt;/strong&gt;：服务器接收HTTP请求，解析请求内容，执行相应的处理（如数据库查询、文件读取等），并构建HTTP响应报文。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP响应&lt;/strong&gt;：服务器将响应报文通过TCP连接发送回浏览器。响应报文包含状态码、响应头和响应正文。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;浏览器解析渲染&lt;/strong&gt;：浏览器接收到HTTP响应后，解析HTML文档构建DOM树，解析CSS构建CSSOM树，合并两者形成渲染树，然后开始渲染页面。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连接结束&lt;/strong&gt;：当浏览器完成页面渲染或收到服务器关闭连接的信号时，浏览器会发送TCP连接关闭的信号，服务器收到后，双方断开连接。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;很多大公司面试喜欢问这样一道面试题，输入URL到看见页面发生了什么？&lt;/p&gt;
&lt;p&gt;简单来说，共有以下几个过程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DNS解析&lt;/li&gt;
&lt;li&gt;发起TCP连接&lt;/li&gt;
&lt;li&gt;发送HTTP请求&lt;/li&gt;
&lt;li&gt;服务器处理请求并返回HTTP报文&lt;/li&gt;
&lt;li&gt;浏览器解析渲染页面&lt;/li&gt;
&lt;li&gt;连接结束&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面我们来看看具体的细节。&lt;/p&gt;
&lt;h2 id="dns解析"&gt;DNS解析&lt;/h2&gt;
&lt;p&gt;DNS解析实际上就是寻找你所需要的资源的过程。假设你输入&lt;code&gt;www.baidu.com&lt;/code&gt;，而这个网址并不是百度的真实地址，互联网中每一台机器都有唯一标识的IP地址，这个才是关键，但是它不好记，乱七八糟一串数字谁记得住啊，所以就需要一个网址和IP地址的转换，也就是DNS解析。&lt;/p&gt;
&lt;p&gt;DNS解析其实是一个递归的过程。&lt;/p&gt;
&lt;p&gt;输入&lt;code&gt;www.google.com&lt;/code&gt;网址后，首先在本地的域名服务器中查找，没找到去根域名服务器查找，没有再去com顶级域名服务器查找，，如此的类推下去，直到找到IP地址，然后把它记录在本地，供下次使用。大致过程就是.-&amp;gt; .com -&amp;gt;google.com. -&amp;gt; &lt;a href="https://www.google.com"&gt;www.google.com&lt;/a&gt;.。 (最后这个.对应的就是根域名服务器，默认情况下所有的网址的最后一位都是.，为了方便用户，通常都会省略，浏览器在请求DNS的时候会自动加上)&lt;/p&gt;
&lt;h3 id="dns优化"&gt;DNS优化&lt;/h3&gt;
&lt;p&gt;既然已经懂得了解析的具体过程，我们可以看到上述一共经过了N个过程，每个过程有一定的消耗和时间的等待，因此我们得想办法解决一下这个问题！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DNS缓存&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DNS存在着多级缓存，从离浏览器的距离排序的话，有以下几种: 浏览器缓存，系统缓存，路由器缓存，ISP服务器缓存，根域名服务器缓存，顶级域名服务器缓存，主域名服务器缓存。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DNS负载均衡&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;比如访问baidu.com的时候，每次响应的并非是同一个服务器（IP地址不同），一般大公司都有成百上千台服务器来支撑访问。DNS可以返回一个合适的机器的IP给用户，例如可以根据每台机器的负载量，该机器离用户地理位置的距离等等，这种过程就是DNS负载均衡。&lt;/p&gt;
&lt;h2 id="发起tcp连接"&gt;发起TCP连接&lt;/h2&gt;
&lt;p&gt;TCP提供一种可靠的传输，这个过程涉及到三次握手，四次挥手。&lt;/p&gt;
&lt;h3 id="三次握手"&gt;三次握手&lt;/h3&gt;
&lt;p&gt;&lt;img alt="三次握手示意图" loading="lazy" src="https://static.ecool.fun//article/f3f07532-8a7f-48f8-8f9e-d68ac149f9a2.png"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一次握手：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;客户端发送syn包(Seq=x)到服务器，并进入SYN_SEND状态，等待服务器确认；&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第二次握手：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;服务器收到syn包，必须确认客户的SYN（ack=x+1），同时自己也发送一个SYN包（Seq=y），即SYN+ACK包，此时服务器进入SYN_RECV状态；&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第三次握手：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;客户端收到服务器的SYN＋ACK包，向服务器发送确认包ACK(ack=y+1)，此包发送完毕，客户端和服务器进入ESTABLISHED状态，完成三次握手。&lt;/p&gt;
&lt;p&gt;握手过程中传送的包里不包含数据，三次握手完毕后，客户端与服务器才正式开始传送数据。理想状态下，TCP连接一旦建立，在通信双方中的任何一方主动关闭连接之前，TCP 连接都将被一直保持下去。&lt;/p&gt;
&lt;h3 id="四次挥手"&gt;四次挥手&lt;/h3&gt;
&lt;p&gt;数据传输完毕后，双方都可释放连接。最开始的时候，客户端和服务器都是处于ESTABLISHED状态，假设客户端主动关闭，服务器被动关闭。&lt;/p&gt;
&lt;p&gt;&lt;img alt="四次挥手示意图" loading="lazy" src="https://static.ecool.fun//article/dbf0912c-a6df-48d0-8981-7224eae4492f.png"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一次挥手：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;客户端发送一个FIN，用来关闭客户端到服务器的数据传送，也就是客户端告诉服务器：我已经不 会再给你发数据了(当然，在fin包之前发送出去的数据，如果没有收到对应的ack确认报文，客户端依然会重发这些数据)，但是，此时客户端还可以接受数据。&lt;/p&gt;
&lt;p&gt;FIN=1，其序列号为seq=u（等于前面已经传送过来的数据的最后一个字节的序号加1），此时，客户端进入FIN-WAIT-1（终止等待1）状态。 TCP规定，FIN报文段即使不携带数据，也要消耗一个序号。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第二次挥手：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;服务器收到FIN包后，发送一个ACK给对方并且带上自己的序列号seq，确认序号为收到序号+1（与SYN相同，一个FIN占用一个序号）。此时，服务端就进入了CLOSE-WAIT（关闭等待）状态。TCP服务器通知高层的应用进程，客户端向服务器的方向就释放了，这时候处于半关闭状态，即客户端已经没有数据要发送了，但是服务器若发送数据，客户端依然要接受。这个状态还要持续一段时间，也就是整个CLOSE-WAIT状态持续的时间。&lt;/p&gt;</description></item></channel></rss>