<?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>大厂面经 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E5%A4%A7%E5%8E%82%E9%9D%A2%E7%BB%8F/</link><description>Recent content in 大厂面经 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/tags/%E5%A4%A7%E5%8E%82%E9%9D%A2%E7%BB%8F/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>小红书-社招-3年 · 第 1 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-156/</link><pubDate>Sun, 01 Feb 2026 14:42:08 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-156/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-157/"&gt;第 2 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 这一轮主要考察了前端基础知识，包括JavaScript的基本类型和引用类型的存储、闭包的内存泄漏、垃圾回收机制、事件循环、React框架的理解等。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; Promise、CDN原理、Class、数据类型、浏览器渲染过程&lt;/p&gt;
&lt;p&gt;本轮共 24 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-ae4aa03a-06fe-41be-9c42-f53947f13f49"&gt;1. js中基本类型 和 引用类型的存储有什么不一样&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/ae4aa03a-06fe-41be-9c42-f53947f13f49"&gt;引用类型有哪些，有什么特点&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;在JavaScript中，引用类型是指非基本数据类型，它们是由对象、数组、函数等复杂数据结构组成的。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在JavaScript中，引用类型是指非基本数据类型，它们是由对象、数组、函数等复杂数据结构组成的。&lt;/p&gt;
&lt;p&gt;常见的引用类型包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;对象（Object）&lt;/code&gt;：对象是JavaScript中最基本的引用类型，它可以用来存储键值对，也可以通过原型链实现继承。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;数组（Array）&lt;/code&gt;：数组是一种有序的集合，可以存储任意类型的数据，它的长度是动态的，可以随时添加或删除元素。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;函数（Function）&lt;/code&gt;：函数是一种可执行的对象，可以封装一段可重复使用的代码。函数可以接收参数并返回值。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;引用类型的特点包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;引用类型的值是可变的：引用类型的值是存储在堆内存中的，当我们修改一个引用类型的值时，实际上是修改了它在内存中的地址，而不是修改了该值本身。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;引用类型值的比较是引用的比较：当使用&amp;quot;==&amp;ldquo;或&amp;rdquo;===&amp;ldquo;运算符比较两个引用类型的值时，它们会进行引用的比较，即判断它们是否指向同一个内存地址。只有当两个引用指向同一个对象时，它们才被认为是相等的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;引用类型可以有自己的属性和方法：引用类型的值可以拥有自己的属性和方法。例如，数组对象有长度属性和一些常用的数组方法（例如push、pop、sort等），而函数对象有call、apply等方法。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;引用类型可以通过原型链实现继承：通过原型链，引用类型可以继承父类型的属性和方法。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;基本类型（如数字、字符串、布尔值）在JavaScript中是按值传递的，而引用类型是按引用传递的。&lt;/p&gt;
&lt;p&gt;这意味着当将一个引用类型的值赋给另一个变量时，实际上是将内存地址复制给了新的变量，两个变量引用的是同一对象。而基本类型的值赋给另一个变量时，会创建一个新的值并赋给新的变量。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-6dd983d9-39fc-48ca-9e22-7599ab339f5b"&gt;2. 闭包的内存泄漏应该如何监控和解决？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/6dd983d9-39fc-48ca-9e22-7599ab339f5b"&gt;如何检查Javascript中的内存泄漏？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;Chrome 浏览器查看内存占用，按照以下步骤操作。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="浏览器"&gt;浏览器&lt;/h2&gt;
&lt;p&gt;Chrome 浏览器查看内存占用，按照以下步骤操作。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image.png" loading="lazy" src="https://static.ecool.fun//article/b822300b-cf04-4c9f-9d88-06bd331726c0.png"&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1、打开开发者工具，选择 Timeline 面板
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2、在顶部的Capture字段里面勾选 Memory
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;3、点击左上角的录制按钮。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;4、在页面上进行各种操作，模拟用户的使用情况。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;5、一段时间后，点击对话框的 stop 按钮，面板上就会显示这段时间的内存占用情况。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果内存占用基本平稳，接近水平，就说明不存在内存泄漏。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image.png" loading="lazy" src="https://static.ecool.fun//article/5b616638-2dbc-49a7-9bde-97271ec206b1.png"&gt;&lt;/p&gt;
&lt;p&gt;反之，就是内存泄漏了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image.png" loading="lazy" src="https://static.ecool.fun//article/a05a6942-5cbe-42c8-a213-9122a9a851db.png"&gt;&lt;/p&gt;
&lt;h2 id="命令行"&gt;命令行&lt;/h2&gt;
&lt;p&gt;命令行可以使用 Node 提供的process.memoryUsage方法。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;process&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;memoryUsage&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// { rss: 27709440,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// heapTotal: 5685248,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// heapUsed: 3449392,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// external: 8772 }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;process.memoryUsage返回一个对象，包含了 Node 进程的内存占用信息。该对象包含四个字段，单位是字节，含义如下。&lt;/p&gt;</description></item><item><title>小红书-社招-1年 · 第 1 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/round-154/</link><pubDate>Sun, 01 Feb 2026 14:40:35 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/round-154/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/round-155/"&gt;第 2 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 这一轮主要考察了前端技术栈的深度和广度，包括CSS框架、响应式设计、渲染优化、Vue框架的高级特性、HTTP协议、浏览器渲染机制等方面的知识。&lt;/p&gt;
&lt;p&gt;本轮共 22 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-aa8173c10147"&gt;1. 项目中为何选择 Tailwind CSS ？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;灵活性, 可维护性, 现代前端工具链&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;Tailwind CSS 是一个高度可定制的低级 CSS 框架，它提供了大量的原子类，可以快速构建一致且响应式的布局。选择 Tailwind CSS 的原因可能包括其灵活性、可维护性以及与现代前端工具链的良好集成。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-fa06c194-9fab-4cf0-8cc7-dda90c2c4f97"&gt;2. Tailwind 是怎么解决样式冲突的？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/fa06c194-9fab-4cf0-8cc7-dda90c2c4f97"&gt;Tailwind 是怎么解决样式冲突的？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;Tailwind 通过原子化 utility 类、统一选择器权重、避免层级嵌套、构建期生成样式以及可预测的覆盖规则，从架构层面降低样式冲突的发生概率。它不是依赖命名规范解决冲突，而是通过设计约束和单一职责类模型，使样式天然解耦，从而让冲突可控且可预测。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;这个问题如果只回答“因为类名不会冲突”是远远不够的。&lt;/p&gt;
&lt;p&gt;Tailwind 解决样式冲突，本质上是通过 &lt;strong&gt;设计约束 + 原子化模型 + 构建期生成策略&lt;/strong&gt;，从源头消除冲突的产生条件，而不是事后避免覆盖。&lt;/p&gt;
&lt;p&gt;下面从机制层面拆解。&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id="一传统-css-为什么容易冲突"&gt;一、传统 CSS 为什么容易冲突&lt;/h1&gt;
&lt;p&gt;传统样式冲突来自三个方面：&lt;/p&gt;
&lt;h3 id="1-选择器冲突"&gt;1. 选择器冲突&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;btn&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;color&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;red&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;button&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;color&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;blue&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;不同模块命名不规范会互相覆盖。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="2-层级嵌套带来的权重问题"&gt;2. 层级嵌套带来的权重问题&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;page&lt;/span&gt; .&lt;span style="color:#a6e22e"&gt;btn&lt;/span&gt; { &lt;span style="color:#960050;background-color:#1e0010"&gt;...&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;权重升级，导致后续难以覆盖。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="3-样式全局污染"&gt;3. 样式全局污染&lt;/h3&gt;
&lt;p&gt;CSS 默认是全局作用域，没有隔离边界。&lt;/p&gt;</description></item><item><title>360-实习 · 第 1 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-83/round-132/</link><pubDate>Sat, 31 Jan 2026 09:54:14 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-83/round-132/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-83/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 这一轮主要考察了候选人的自我介绍、职业规划、项目经验、前端技术细节以及算法问题。面试氛围较为全面，涵盖了从基础到高级的多个方面。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;面试时间：&lt;/strong&gt; 45分钟&lt;/p&gt;
&lt;p&gt;本轮共 21 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-12b75c445924"&gt;1. 自我介绍&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;个人背景, 工作经验, 技术栈, 项目经验, 未来展望&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;自我介绍应包括个人背景、工作经验、技术栈、项目经验和对未来的展望。重点在于展示自己的专业能力和对前端技术的热情。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-74d4b354dd42"&gt;2. 你的职业规划与前端技术方向的关系？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;技术趋势, 个人兴趣, 学习和实践, 技能提升, 未来发展&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;回答时可以结合当前的技术趋势和个人兴趣，说明如何通过不断学习和实践来提升自己在前端领域的技能。同时，可以提到对未来技术发展的看法和如何适应这些变化。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-cd57a5aa-c239-4cb2-b2b5-d0d6a49f80f3"&gt;3. 讲一个你参与过的项目&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/cd57a5aa-c239-4cb2-b2b5-d0d6a49f80f3"&gt;你参与过哪些前端基建方面的建设？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;前端基建涵盖了从项目架构、构建工具配置到开发环境、自动化流程和安全等多个方面。良好的前端基建可以提升开发效率、代码质量和系统性能，为项目的长期维护和扩展打下坚实的基础。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;可以从以下方面进行回答：&lt;/p&gt;
&lt;h3 id="1-项目架构"&gt;&lt;strong&gt;1. 项目架构&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目录结构&lt;/strong&gt;：定义项目文件和目录的组织结构，确保项目的可维护性和可扩展性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码规范&lt;/strong&gt;：统一代码风格和规范，使用 ESLint、Prettier 等工具进行代码检查和格式化。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模块化&lt;/strong&gt;：采用模块化设计，将代码拆分为独立的模块，提高可重用性和可维护性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;脚手架&lt;/strong&gt;：自动生成项目的基础结构，包括目录结构、配置文件、示例代码等。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-构建工具和配置"&gt;&lt;strong&gt;2. 构建工具和配置&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;构建工具&lt;/strong&gt;：使用工具如 Webpack、Vite、Rollup 等进行项目的构建和打包。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置管理&lt;/strong&gt;：配置构建工具以支持各种功能，如代码分割、热重载、环境变量等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优化&lt;/strong&gt;：配置代码压缩、缓存策略、Tree Shaking 等，提升构建产物的性能和效率。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-开发环境"&gt;&lt;strong&gt;3. 开发环境&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;开发服务器&lt;/strong&gt;：设置本地开发服务器，支持热重载和调试功能。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;环境配置&lt;/strong&gt;：管理开发、测试、生产环境的配置和变量。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-包管理"&gt;&lt;strong&gt;4. 包管理&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;依赖管理&lt;/strong&gt;：使用 npm、Yarn 或 pnpm 等工具管理项目依赖，确保依赖版本一致性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;发布管理&lt;/strong&gt;：管理和发布自定义的 npm 包或组件库。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5-自动化流程"&gt;&lt;strong&gt;5. 自动化流程&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CI/CD&lt;/strong&gt;：配置持续集成（CI）和持续部署（CD）流程，自动化构建、测试和部署。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;测试&lt;/strong&gt;：集成单元测试、集成测试和端到端测试工具，如 Jest、Cypress 等，确保代码质量。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="6-代码质量"&gt;&lt;strong&gt;6. 代码质量&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;静态分析&lt;/strong&gt;：使用 ESLint、TSLint 等工具进行代码静态检查。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;测试覆盖率&lt;/strong&gt;：监控测试覆盖率，确保关键代码路径被充分测试。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="7-文档"&gt;&lt;strong&gt;7. 文档&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;代码文档&lt;/strong&gt;：编写和维护项目文档，包括 API 文档、开发指南和使用说明。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动化文档生成&lt;/strong&gt;：使用工具如 Storybook、JSDoc 等生成组件库和 API 文档。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="8-组件库"&gt;&lt;strong&gt;8. 组件库&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;设计系统&lt;/strong&gt;：构建和维护一套一致的设计系统和组件库，提高开发效率和界面一致性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;共享组件&lt;/strong&gt;：创建和管理共享组件，促进代码复用。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="9-性能优化"&gt;&lt;strong&gt;9. 性能优化&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;前端性能&lt;/strong&gt;：优化页面加载速度、响应时间和渲染性能。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络请求&lt;/strong&gt;：管理和优化网络请求策略，减少请求次数和数据传输量。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="10-安全"&gt;&lt;strong&gt;10. 安全&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;安全最佳实践&lt;/strong&gt;：遵循前端安全最佳实践，如防范 XSS 和 CSRF 攻击。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;敏感数据保护&lt;/strong&gt;：确保敏感数据不被暴露或滥用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-2a354c037923"&gt;4. 项目中遇到的印象最深的难题是什么？如何解决的？&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;难题背景, 影响, 解决方案, 最终结果&lt;/p&gt;</description></item><item><title>百度-百家号-实习 · 第 1 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-82/round-131/</link><pubDate>Sat, 31 Jan 2026 09:19:52 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-82/round-131/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-82/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 该轮主要考察前端基础知识、JavaScript高级特性、HTTP协议、Vue与React框架对比、Git操作以及算法实现能力。问题涵盖理论理解与实际应用，氛围较为专业。&lt;/p&gt;
&lt;p&gt;本轮共 16 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-25a1d366-42f6-42e2-9a41-b6dd4624fd55"&gt;1. 如何判断一个变量是数组？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/25a1d366-42f6-42e2-9a41-b6dd4624fd55"&gt;判断数组的方式有哪些？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐方法&lt;/strong&gt;：使用 &lt;code&gt;Array.isArray()&lt;/code&gt;，这是最简单、最可靠的方式来检查一个值是否为数组。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;其他方法&lt;/strong&gt;：&lt;code&gt;instanceof&lt;/code&gt; 和 &lt;code&gt;Object.prototype.toString.call()&lt;/code&gt; 也很有效，但有一些特定的局限性。&lt;code&gt;constructor&lt;/code&gt; 和 &lt;code&gt;isPrototypeOf()&lt;/code&gt; 方法不如 &lt;code&gt;Array.isArray()&lt;/code&gt; 可靠，且在某些情况下可能会出现问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;判断一个值是否为数组的方式有多种：&lt;/p&gt;
&lt;h3 id="1-arrayisarray"&gt;1. &lt;strong&gt;&lt;code&gt;Array.isArray()&lt;/code&gt; 方法&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;描述&lt;/strong&gt;：这是 ES5 引入的标准方法，推荐用于检查一个值是否为数组。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;语法&lt;/strong&gt;：&lt;code&gt;Array.isArray(value)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(Array.&lt;span style="color:#a6e22e"&gt;isArray&lt;/span&gt;([&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;])); &lt;span style="color:#75715e"&gt;// true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(Array.&lt;span style="color:#a6e22e"&gt;isArray&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;hello&amp;#39;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-instanceof"&gt;2. &lt;strong&gt;&lt;code&gt;instanceof&lt;/code&gt; 操作符&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;描述&lt;/strong&gt;：使用 &lt;code&gt;instanceof&lt;/code&gt; 操作符来判断对象是否是 &lt;code&gt;Array&lt;/code&gt; 的实例。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;语法&lt;/strong&gt;：&lt;code&gt;value instanceof Array&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;([&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;] &lt;span style="color:#66d9ef"&gt;instanceof&lt;/span&gt; Array); &lt;span style="color:#75715e"&gt;// true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;hello&amp;#39;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;instanceof&lt;/span&gt; Array); &lt;span style="color:#75715e"&gt;// false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-objectprototypetostringcall"&gt;3. &lt;strong&gt;&lt;code&gt;Object.prototype.toString.call()&lt;/code&gt; 方法&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;描述&lt;/strong&gt;：使用 &lt;code&gt;Object.prototype.toString.call()&lt;/code&gt; 可以准确判断一个对象的类型，包括数组。它返回 &lt;code&gt;[object Array]&lt;/code&gt; 对于数组，其他类型则返回不同的结果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;语法&lt;/strong&gt;：&lt;code&gt;Object.prototype.toString.call(value)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(Object.&lt;span style="color:#a6e22e"&gt;prototype&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;toString&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;call&lt;/span&gt;([&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;])); &lt;span style="color:#75715e"&gt;// [object Array]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(Object.&lt;span style="color:#a6e22e"&gt;prototype&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;toString&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;call&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;hello&amp;#39;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// [object String]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-constructor"&gt;4. &lt;strong&gt;&lt;code&gt;constructor&lt;/code&gt; 属性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;描述&lt;/strong&gt;：检查 &lt;code&gt;constructor&lt;/code&gt; 属性是否为 &lt;code&gt;Array&lt;/code&gt;。这种方法不如 &lt;code&gt;Array.isArray()&lt;/code&gt; 可靠，因为 &lt;code&gt;constructor&lt;/code&gt; 可以被改变。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;语法&lt;/strong&gt;：&lt;code&gt;value.constructor === Array&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;([&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;constructor&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; Array); &lt;span style="color:#75715e"&gt;// true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;hello&amp;#39;&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;constructor&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; Array); &lt;span style="color:#75715e"&gt;// false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5-arrayprototypeisprototypeof"&gt;5. &lt;strong&gt;&lt;code&gt;Array.prototype.isPrototypeOf()&lt;/code&gt; 方法&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;描述&lt;/strong&gt;：检查数组的 &lt;code&gt;prototype&lt;/code&gt; 是否在目标对象的 &lt;code&gt;prototype&lt;/code&gt; 链上。这种方法也可以用来判断一个对象是否为数组。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;语法&lt;/strong&gt;：&lt;code&gt;Array.prototype.isPrototypeOf(value)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(Array.&lt;span style="color:#a6e22e"&gt;prototype&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;isPrototypeOf&lt;/span&gt;([&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;])); &lt;span style="color:#75715e"&gt;// true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(Array.&lt;span style="color:#a6e22e"&gt;prototype&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;isPrototypeOf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;hello&amp;#39;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="6-使用"&gt;6. &lt;strong&gt;使用 &lt;code&gt;constructor&lt;/code&gt; 属性和原型链&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;描述&lt;/strong&gt;：结合 &lt;code&gt;constructor&lt;/code&gt; 属性和原型链检查。这个方法有一定的局限性，不推荐使用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;isArray&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;value&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;typeof&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;value&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;object&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;constructor&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; Array;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;isArray&lt;/span&gt;([&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;])); &lt;span style="color:#75715e"&gt;// true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;isArray&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;hello&amp;#39;&lt;/span&gt;)); &lt;span style="color:#75715e"&gt;// false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-9627e396b5fc"&gt;2. 讲一下闭包及其优缺点。&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;函数嵌套, 词法作用域, 内存管理&lt;/p&gt;</description></item><item><title>百度-搜索-春招 · 第 1 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-81/round-130/</link><pubDate>Sat, 31 Jan 2026 09:19:33 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-81/round-130/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-81/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 该轮主要考察前端开发相关知识，包括动画实现、性能优化、React优化、Web Accessibility、计时器处理、WebSocket、缓存策略、国际化、兼容性问题等。题目以主观题为主，注重对核心原理和实际应用场景的理解。&lt;/p&gt;
&lt;p&gt;本轮共 18 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-c97dc39dce4b"&gt;1. 实现一个动画，当用户鼠标悬停在按钮上时，按钮逐渐变大&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;CSS transition, 动画性能优化, 硬件加速, 事件监听&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在实现此类动画时，可以使用CSS的transition属性或JavaScript的requestAnimationFrame方法。重点在于控制动画的流畅性和性能。可以通过设置合适的过渡时间（transition-duration）和使用硬件加速（如transform: scale()）来提升性能。此外，注意避免不必要的重排和重绘，确保动画的平滑性。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-5adab921-8dfb-4a65-9f44-38ae8a70820f"&gt;2. 如何避免动画过程中的卡顿？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/5adab921-8dfb-4a65-9f44-38ae8a70820f"&gt;在解决动画卡顿问题时，会引导硬件加速，那么硬件加速的原理是什么？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;硬件加速是指利用 GPU（图形处理单元）来执行图形和动画相关的计算任务，以减轻 CPU（中央处理单元）的负担。GPU 专为处理图形和图像的高吞吐量操作而设计，因此在执行动画和复杂图形渲染时，硬件加速可以提供更流畅的体验。&lt;/p&gt;
&lt;h4 id="原理解析"&gt;原理解析&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GPU vs CPU&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GPU 拥有更多的核心，适合并行处理大量计算任务，而 CPU 核心较少，更适合串行处理复杂逻辑。&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;GPU 优化了图形渲染流程，包括顶点处理、像素着色等，这些是动画和图形显示的基础。&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;通过硬件加速，可以减少浏览器的重绘（repaint）和回流（reflow）次数，这些操作通常由 DOM 变更触发，非常消耗性能。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;合成层（Compositing Layer）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;浏览器使用合成层来合并多个层的图形，GPU 可以快速地在这些层上进行变换和动画。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CSS 属性触发&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;某些 CSS 属性，如 &lt;code&gt;transform&lt;/code&gt; 的 3D 变换（&lt;code&gt;translate3d&lt;/code&gt;、&lt;code&gt;scale3d&lt;/code&gt; 等）和 &lt;code&gt;opacity&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;
&lt;ul&gt;
&lt;li&gt;浏览器会根据性能和资源情况，自动决定是否使用硬件加速。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="考察重点"&gt;考察重点&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;理解：硬件加速的基本概念和 GPU 在图形渲染中的作用。&lt;/li&gt;
&lt;li&gt;应用：知道哪些 CSS 属性可以触发硬件加速，以及如何利用它们来优化动画性能。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;面试中可能会经常会碰到怎么解决动画卡顿的问题，然后会引导到硬件加速。那么究竟什么是硬件加速，为什么它可以提高咱们的动画效率？我们今天就来一探究竟。&lt;/p&gt;</description></item><item><title>百度-商业化-秋招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-80/round-129/</link><pubDate>Fri, 17 Oct 2025 08:26:28 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-80/round-129/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-80/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 这场面试主要围绕前端项目的实际工程能力展开，重点考察了候选人对动态路由、权限控制和状态管理的理解与实践。
同时涉及网络请求优化、缓存机制及组件复用等中高级工程问题，体现出对项目可维护性和性能的关注。
面试还关注了候选人对 TypeScript 应用、学习方法和职业规划的思考，考察其成长潜力与技术视野。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 跨域相关&lt;/p&gt;
&lt;p&gt;本轮共 16 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-eef1fff3-2f61-40d2-b529-e89daabbf0b0"&gt;1. 如何在前端项目中实现动态路由？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/eef1fff3-2f61-40d2-b529-e89daabbf0b0"&gt;如何在前端项目中实现动态路由？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;动态路由的核心是将路由配置从静态定义转为运行时生成或挂载。常见做法包括“前端维护完整路由表后过滤”以及“后端下发路由配置”。&lt;/p&gt;
&lt;p&gt;具体实现依赖框架提供的 API（如 &lt;code&gt;addRoute&lt;/code&gt;、&lt;code&gt;useRoutes&lt;/code&gt;），同时需要兼顾权限控制、懒加载与导航组件的解耦，才能在保证安全性的同时保持可扩展性和良好的用户体验。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在前端项目中实现动态路由，本质上是根据用户权限、接口返回的数据或者运行时条件，动态地生成或加载路由配置，从而决定页面的可访问性和导航结构。&lt;/p&gt;
&lt;p&gt;以 React Router 和 Vue Router 为例，核心思路有一些共通点：
在应用启动时，会有一个静态的基础路由表，用来保证最基本的页面可以正常访问（例如登录页、404 页、Layout 容器等）。而真正需要按用户角色、接口数据控制的路由，则通过接口请求或预置配置动态挂载进路由系统。&lt;/p&gt;
&lt;p&gt;常见的实现方式有两类：&lt;/p&gt;
&lt;p&gt;一种是前端自行维护完整的路由表，用户登录后，后端返回权限信息（角色、菜单、可访问模块 ID 等），前端在已有的路由表中做过滤，只保留当前用户有权限的部分，再动态挂载到路由系统。这种方式对前端掌控力更强，体验流畅，但需要在前端同步维护一份路由和权限的映射关系。&lt;/p&gt;
&lt;p&gt;另一种是由后端直接下发路由配置（通常带有 path、component 标识、子路由结构等），前端拿到配置后再通过组件映射表动态生成路由。这种方式能减轻前端维护压力，但会带来接口设计和前后端耦合的问题。&lt;/p&gt;
&lt;p&gt;在技术层面，React Router v6 提供了 &lt;code&gt;useRoutes&lt;/code&gt; 可以直接基于对象动态生成路由，Vue Router 也支持 &lt;code&gt;router.addRoute&lt;/code&gt; 在运行时动态添加路由。对于懒加载组件，还需要结合 &lt;code&gt;import()&lt;/code&gt; 或 &lt;code&gt;defineAsyncComponent&lt;/code&gt;（Vue）来实现，避免一次性加载所有页面。&lt;/p&gt;
&lt;p&gt;此外，动态路由不仅仅是技术实现，还涉及安全性和用户体验。例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在前端动态路由实现时，不能只依赖前端的路由控制，还需要后端接口做权限校验，避免用户绕过前端访问受限页面。&lt;/li&gt;
&lt;li&gt;路由结构最好和菜单、面包屑等导航组件解耦，通过统一的数据结构管理，保证后续扩展的灵活性。&lt;/li&gt;
&lt;li&gt;在大规模项目中，动态路由还常与微前端、模块化加载结合，按需挂载子应用或子模块。&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-fb3f4b9d-6d6c-4b51-8c8d-105a621b420b"&gt;2. Vue3的addRoute与React Router的动态useRoutes有何区别？如何解决动态路由刷新后失效的问题？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/fb3f4b9d-6d6c-4b51-8c8d-105a621b420b"&gt;Vue3的addRoute与React Router的动态useRoutes有何区别？如何解决动态路由刷新后失效的问题？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;Vue3 的 &lt;code&gt;addRoute&lt;/code&gt; 属于“增量挂载”，可以在运行时动态向现有路由表中追加新配置；React Router 的 &lt;code&gt;useRoutes&lt;/code&gt; 则是基于配置对象动态生成，强调整体渲染而不是单点挂载。动态路由刷新后失效的根本原因是路由配置只存在于内存中，需要在应用初始化时通过本地存储或接口请求恢复路由数据，才能保证页面刷新后仍能正确访问。&lt;/p&gt;</description></item><item><title>腾讯-3年社招-前端面试 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-79/round-127/</link><pubDate>Sun, 07 Sep 2025 02:45:19 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-79/round-127/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-79/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-79/round-128/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 这些题目全面考察了前端工程师在实际项目中需要掌握的核心技术和解决问题的能力，涵盖了从基础原理到工程实践的各个层面。&lt;/p&gt;
&lt;p&gt;本轮共 23 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-327b17e537b3"&gt;1. 自我介绍、项目介绍&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;技术栈熟练度、架构经验、性能优化成果、团队协作能力&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;具有3年前端开发经验，专注于现代化前端技术栈和工程化实践。主要负责过大型电商平台的前端架构设计和性能优化工作，熟练掌握 Vue/React 生态系统。在项目中主导了从传统架构向微前端架构的迁移，通过模块联邦和组件库建设提升了团队开发效率。同时在性能优化方面有丰富实践，将核心页面的首屏加载时间优化至2秒以内。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-264a86fa57fa"&gt;2. 可视化搭建平台中，如何设计数据规范保证组件间数据兼容性？请求收效的具体实现方案是什么？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;Schema规范、数据校验、适配器模式、请求优化策略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;建立统一的数据协议规范，定义标准的组件 Schema 结构，包含 props、events、slots 等接口描述。通过 JSON Schema 进行数据校验，确保组件间数据传递的类型安全。实现数据适配器模式，当组件接口不兼容时自动进行数据转换。请求收效方面，采用请求去重和缓存策略，相同请求在短时间内只发送一次，同时建立请求优先级队列，确保关键数据的及时响应。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-7fdf24ca2fb8"&gt;3. 组件的拖拽行为如何实现？如何为组件动态注入行为（如拖拽、缩放）？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;事件序列处理、状态管理、装饰器模式、行为解耦&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;拖拽实现基于原生 Drag API 或鼠标事件，通过监听 mousedown、mousemove、mouseup 事件序列。建立拖拽状态管理，记录拖拽起始位置、当前位置和目标位置。动态行为注入采用装饰器模式或高阶组件，将行为逻辑与组件本身解耦。通过 mixin 或 composition API 的方式，在运行时为组件添加拖拽、缩放等交互能力。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-4da1a84bbb8d"&gt;4. 如何解决拖拽过程中频繁触发事件导致的性能问题？&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;节流防抖、requestAnimationFrame、事件委托、计算优化&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;使用节流（throttle）限制事件触发频率，通常设置为 16ms 以保持 60fps 的流畅度。采用 requestAnimationFrame 优化动画渲染，确保在浏览器重绘时机执行位置更新。实现事件委托减少事件监听器数量，在容器元素上统一处理拖拽事件。对于复杂计算，使用防抖（debounce）延迟执行，避免在拖拽过程中进行不必要的重计算。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-26e22fa9-becc-4552-b79a-da2f67451455"&gt;5. 性能优化关注的指标有哪些（如FCP、TTI）？你用了哪些具体手段？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/26e22fa9-becc-4552-b79a-da2f67451455"&gt;前端性能优化指标有哪些？怎么进行性能检测？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-4"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;前端性能评估主要围绕三个维度展开：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;页面加载速度、交互响应能力以及页面稳定性。常见指标包括 FP、FCP、LCP 等加载指标，FID 和 INP 等交互指标，以及 CLS 布局稳定性指标。&lt;/li&gt;
&lt;li&gt;性能检测通常分为两类方式：开发阶段使用 Lighthouse、Chrome DevTools、WebPageTest 等工具进行实验室分析；&lt;/li&gt;
&lt;li&gt;线上环境通过 Performance API 或 web-vitals 采集真实用户性能数据，并结合监控平台进行统计与优化。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;前端性能通常不会只看单一指标，而是从&lt;strong&gt;用户感知加载速度、交互响应速度以及页面稳定性&lt;/strong&gt;三个维度进行评估。当前行业中比较主流的一套指标体系来自 Google 提出的 &lt;strong&gt;Web Vitals&lt;/strong&gt;，并结合传统的加载性能指标共同评估。&lt;/p&gt;</description></item><item><title>腾讯-3年社招-前端面试 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-79/round-128/</link><pubDate>Sun, 07 Sep 2025 02:45:19 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-79/round-128/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-79/round-127/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-79/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 13 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-f957ef7db458"&gt;1. 讲一下你的低代码平台架构设计&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;分层架构、组件引擎、JSON Schema、热更新机制&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;低代码平台采用分层架构设计：底层是组件引擎，负责组件的注册、渲染和生命周期管理；中间层是可视化编辑器，提供拖拽、属性配置和预览功能；上层是业务逻辑层，处理数据绑定、事件处理和页面路由。技术栈选择 Vue 3 + TypeScript，通过 JSON Schema 描述组件结构，使用虚拟 DOM 进行高效渲染。同时建立了组件市场和模板库，支持组件的版本管理和热更新机制。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-3be20a16e893"&gt;2. 动态加载第三方组件时，如何解决样式冲突与DOM管理问题？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;样式隔离、容器化渲染、事件总线、冲突检测&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;样式隔离通过 CSS Modules 或 Shadow DOM 实现，为每个组件创建独立的样式作用域。建立样式优先级管理机制，通过 CSS 变量和主题系统统一管理全局样式。DOM管理采用容器化策略，每个第三方组件在独立的容器中渲染，通过事件总线进行通信。同时实现样式冲突检测工具，在组件加载时自动检测并解决潜在冲突。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-fa9afd48a98f"&gt;3. 当业务需求超出平台预设组件能力时，你们是怎么扩展的&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;插槽扩展、开发工具链、能力评估、贡献机制&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;建立组件扩展机制，支持通过插槽（slot）和高阶组件进行功能扩展。提供自定义组件开发工具链，包括脚手架、调试工具和发布流程。实现组件能力评估系统，当检测到需求超出现有能力时，自动推荐相似组件或提供扩展建议。同时建立组件贡献机制，允许开发者提交自定义组件到组件库，经过审核后供全平台使用。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-1e64532367d6"&gt;4. 组件的热更新策略是怎么处理的，在不影响用户的使用情况下&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;渐进式更新、状态保持、回滚机制、用户确认&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;采用渐进式热更新策略，通过版本控制和灰度发布确保更新的安全性。实现组件状态保持机制，在更新过程中保存组件的当前状态，更新完成后恢复状态。建立回滚机制，当检测到更新异常时自动回滚到稳定版本。同时提供更新通知和用户确认机制，让用户选择合适的时机进行更新，避免在关键操作时中断用户体验。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-fe5534202ada"&gt;5. 组件通信机制如何设计&lt;/h2&gt;
&lt;h3 id="题目要点-4"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;多层次通信、消息路由、协议标准化、调试工具&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;设计多层次的通信机制：父子组件通过 props 和 events 通信，兄弟组件通过事件总线或状态管理，跨层级组件使用 provide/inject 或全局状态。建立消息路由系统，支持组件间的异步通信和消息队列。实现通信协议标准化，定义统一的消息格式和处理流程。同时提供通信调试工具，帮助开发者追踪消息流向和排查通信问题。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-388ffde4eced"&gt;6. 移动端适配是什么做的&lt;/h2&gt;
&lt;h3 id="题目要点-5"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;响应式设计、弹性布局、手势支持、性能优化&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;采用响应式设计和移动优先策略，使用 rem/vw 单位实现弹性布局。建立设备适配规则库，根据屏幕尺寸和设备类型自动调整组件样式。实现触摸手势支持，优化移动端的交互体验。同时建立性能优化机制，针对移动设备的性能特点进行资源加载和渲染优化，确保在低性能设备上也能流畅运行。&lt;/p&gt;</description></item><item><title>腾讯-2年社招-前端面试 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-78/round-125/</link><pubDate>Sun, 07 Sep 2025 02:17:29 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-78/round-125/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-78/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-78/round-126/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 23 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-d92deba5d64c"&gt;1. Vue 3.0 相比 Vue 2.0 有哪些改进？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;响应式系统升级、Composition API、性能优化、TypeScript支持、Fragment支持&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;Vue 3.0 在架构层面进行了重大重构，采用了基于 Proxy 的响应式系统替代了 Object.defineProperty，这使得可以直接监听数组变化和动态属性添加。组合式 API 的引入提供了更好的逻辑复用和类型推导能力。在性能方面，通过 Tree-shaking 支持、更小的包体积、以及编译时优化显著提升了运行效率。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-0fc6cee72f3d"&gt;2. Composition API 解决了 Options API 的哪些问题？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;逻辑聚合、代码复用、类型推导、避免mixin问题&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;Options API 在处理复杂组件时会出现逻辑分散的问题，相关的数据、方法、计算属性被强制分离到不同的选项中。Composition API 通过 setup 函数将相关逻辑聚合在一起，提高了代码的可维护性。同时解决了 mixin 命名冲突和来源不清晰的问题，提供了更好的 TypeScript 类型推导支持。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-3c46deb606e6"&gt;3. Proxy 相比 Object.defineProperty 在响应式上有何优势？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;对象级别监听、动态属性支持、数组监听、更多拦截操作&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;Proxy 可以直接监听整个对象而不需要遍历每个属性，支持动态属性的添加和删除监听。对于数组操作，Proxy 可以直接监听数组的变化，而 Object.defineProperty 需要重写数组方法。Proxy 还支持更多的拦截操作，如 has、deleteProperty 等，提供了更完整的响应式能力。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-8d6eee18b772"&gt;4. nextTick 如何保证 DOM 更新后执行回调？&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;事件循环、微任务队列、异步更新、降级策略&lt;/p&gt;</description></item><item><title>腾讯-2年社招-前端面试 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-78/round-126/</link><pubDate>Sun, 07 Sep 2025 02:17:29 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-78/round-126/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-78/round-125/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-78/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 9 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-9a287344c514"&gt;1. 讲一下你觉得比较有亮点的项目&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;技术选型合理性、渐进式迁移策略、自动化工具、性能保障&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在负责的一个大型电商平台重构项目中，面临着从传统 jQuery 架构向现代化 Vue 3 + TypeScript 架构迁移的挑战。项目的亮点在于采用了渐进式迁移策略，通过微前端架构实现新老系统的平滑过渡。设计了一套自动化的代码转换工具，将重复性的迁移工作自动化，提升了整体迁移效率 60%。同时建立了完善的性能监控体系，确保迁移过程中用户体验不受影响。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-3d6a09a5ba0d"&gt;2. 项目的难点，你是怎么推动的&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;风险控制、分阶段实施、灰度发布、跨团队协作&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;最大的难点是在不影响线上业务的前提下完成大规模重构。通过制定详细的迁移计划，将整个项目拆分为多个独立的里程碑，每个阶段都有明确的交付物和验收标准。建立了灰度发布机制，新功能先在小范围用户中验证，逐步扩大覆盖范围。同时与产品、测试、运维团队建立了紧密的协作机制，确保各个环节的顺畅衔接。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-3118e233931d"&gt;3. 页面性能优化你做了哪些工作&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;多维度优化、量化效果、监控体系、持续改进&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;从多个维度进行了系统性优化：资源层面实施了代码分割和懒加载，将首屏加载时间减少 40%；网络层面启用了 HTTP/2 和资源预加载，优化了关键渲染路径；渲染层面使用了虚拟滚动和组件缓存，提升了长列表的交互性能；同时建立了性能监控体系，通过 Performance API 和用户行为分析持续跟踪优化效果。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-d7098a03adf1"&gt;4. 相关的指标有哪些，怎么去衡量的，标准是什么&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;Core Web Vitals、RUM监控、分类基准、持续监测&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;建立了完整的性能指标体系：Core Web Vitals 作为核心指标，包括 LCP（2.5s 以内）、FID（100ms 以内）、CLS（0.1 以内）；业务指标包括首屏加载时间、页面完全加载时间、接口响应时间等。通过 RUM（真实用户监控）收集线上数据，结合 Lighthouse 进行定期检测。制定了不同页面类型的性能基准，如首页 LCP 控制在 2s 内，列表页控制在 2.5s 内。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-95185ca6-291f-4160-b65d-f291dfdf8a4f"&gt;5. WebSocket 协议原理&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/95185ca6-291f-4160-b65d-f291dfdf8a4f"&gt;说下 websocket 的连接原理&lt;/a&gt;&lt;/p&gt;</description></item><item><title>腾讯-1年社招-前端面试 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-77/round-124/</link><pubDate>Thu, 04 Sep 2025 14:50:28 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-77/round-124/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-77/round-123/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-77/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 10 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-052576c3597e"&gt;1. 讲一下你的第一个项目&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;突出难点与解决方案，亮点强调可扩展性与价值。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;第一个项目是一个内部管理系统，主要功能是数据可视化和表单管理。难点在于表单项类型复杂、交互逻辑多。解决方案是抽象出一套动态表单引擎，通过 JSON 配置生成组件，既降低了开发成本，也提升了可扩展性。项目的亮点在于统一了交互和样式规范，同时通过可配置化提高了可维护性。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-5166f4b076aa"&gt;2. 为什么选择 Vue3 + Vite 而非 React/Webpack&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;Vue3 → 响应式系统和语法优势；Vite → 构建性能显著提升。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;Vue3 在响应式系统上引入了 Proxy，更适合处理复杂响应式数据，语法上对团队更友好。Vite 基于 ESBuild 和原生 ESM，构建速度远快于 Webpack，特别是在开发阶段的冷启动和热更新体验明显更优。而 Webpack 尽管生态成熟，但在开发构建效率上落后。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-1ecf3069eb75"&gt;3. Vite 的构建速度比 Webpack 快多少&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;冷启动快一个数量级，HMR 延迟极低，原因是按需编译 vs 整包构建。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在实际项目中，冷启动通常能快 10 倍以上。例如一个中大型项目，Webpack 启动需要 20-30 秒，Vite 一般在 1-3 秒即可完成；热更新延迟也从秒级缩短到 100ms 以内。这是因为 Vite 基于原生 ESM 做按需编译，而 Webpack 是整包构建。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-40f1ae7b12e8"&gt;4. FCP 从 3.2s 降到 1.1s，具体做了哪些优化？&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;构建优化 + 资源优化 + 网络优化 + SSR 骨架屏。&lt;/p&gt;</description></item><item><title>腾讯-1年社招-前端面试 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-77/round-123/</link><pubDate>Thu, 04 Sep 2025 14:50:27 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-77/round-123/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-77/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-77/round-124/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 15 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-c3858e222cfb"&gt;1. 讲一下项目的难点和亮点&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;突出解决问题的能力，说明遇到过的复杂问题和优化方案，亮点要体现价值和可扩展性。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在大型前端项目中，常见难点在于性能优化和复杂业务的抽象。比如数据量大时页面渲染和交互卡顿，需要通过虚拟列表、懒加载、分片渲染等方式解决；跨端适配和复杂状态管理也是典型难点。亮点可以体现在工程化和架构设计上，例如通过模块化拆分、微前端架构提高可维护性，或通过自动化工具链提升研发效率。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-b8b956cfe46c"&gt;2. 项目的规范是如何制定的，如何执行的&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;强调自动化工具与制度双管齐下，执行靠工具、评审和 CI 流程。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;前端规范一般从编码规范、组件封装规范、目录结构、Git 提交规范等方面制定。执行时可以依赖工具保障，比如 ESLint + Prettier 自动化格式化，Husky + lint-staged 在提交时校验，CI/CD 流程中增加检测。对组件层面，约定统一的 API 风格和文档，保证多人协作一致性。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-7d27dc57-5d95-4e3f-88a7-eb685b7c21e4"&gt;3. 说说vue中的diff算法&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/7d27dc57-5d95-4e3f-88a7-eb685b7c21e4"&gt;说说vue中的diff算法&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;diff&lt;/code&gt;算法是一种高效的比较算法，主要用于比较虚拟&lt;code&gt;DOM&lt;/code&gt;节点，以确定如何更新真实&lt;code&gt;DOM&lt;/code&gt;。它具有两个特点：只会在同层级进行比较，不会跨层级比较；在比较的过程中，循环从两边向中间收拢。&lt;/p&gt;
&lt;p&gt;在Vue中，&lt;code&gt;diff&lt;/code&gt;算法用于比较新旧&lt;code&gt;VNode&lt;/code&gt;节点，以决定如何更新真实&lt;code&gt;DOM&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这个过程分为以下几个步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;比较新旧&lt;code&gt;VNode&lt;/code&gt;节点&lt;/strong&gt;：如果新旧节点相同，则不做任何操作；如果新旧节点都不存在子节点，则直接结束比较；如果新旧节点都有子节点，则进入&lt;code&gt;updateChildren&lt;/code&gt;函数比较子节点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更新子节点&lt;/strong&gt;：在&lt;code&gt;updateChildren&lt;/code&gt;函数中，设置新旧&lt;code&gt;VNode&lt;/code&gt;的头尾指针，然后从两边向中间比较。如果新旧头尾指针相同，则直接&lt;code&gt;patchVnode&lt;/code&gt;；如果新旧头尾指针不同，则根据情况调用&lt;code&gt;patchVnode&lt;/code&gt;、&lt;code&gt;createElm&lt;/code&gt;创建新节点，或者从哈希表寻找&lt;code&gt;key&lt;/code&gt;一致的旧&lt;code&gt;VNode&lt;/code&gt;节点再进行分情况操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;patchVnode&lt;/code&gt;方法&lt;/strong&gt;：如果新旧节点都有文本节点且不相等，则设置真实&lt;code&gt;dom&lt;/code&gt;的文本节点为新节点的文本节点；如果旧节点有子节点而新节点没有，则删除旧节点的子节点；如果旧节点没有子节点而新节点有，则将新节点的子节点真实化后添加到旧节点；如果两者都有子节点，则进入&lt;code&gt;updateChildren&lt;/code&gt;函数比较子节点。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;通过&lt;code&gt;diff&lt;/code&gt;算法，Vue能够高效地比较新旧&lt;code&gt;VNode&lt;/code&gt;节点，以决定如何更新真实&lt;code&gt;DOM&lt;/code&gt;，从而提高页面渲染的性能。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一是什么"&gt;一、是什么&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;diff&lt;/code&gt; 算法是一种通过同层的树节点进行比较的高效算法&lt;/p&gt;
&lt;p&gt;其有两个特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;比较只会在同层级进行, 不会跨层级比较&lt;/li&gt;
&lt;li&gt;在diff比较的过程中，循环从两边向中间比较&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;diff&lt;/code&gt; 算法的在很多场景下都有应用，在 &lt;code&gt;vue&lt;/code&gt; 中，作用于虚拟 &lt;code&gt;dom&lt;/code&gt; 渲染成真实 &lt;code&gt;dom&lt;/code&gt; 的新旧 &lt;code&gt;VNode&lt;/code&gt; 节点比较&lt;/p&gt;
&lt;h2 id="二比较方式"&gt;二、比较方式&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;diff&lt;/code&gt;整体策略为：深度优先，同层比较&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;比较只会在同层级进行, 不会跨层级比较&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://static.ecool.fun//article/6366ea3c-b5f9-4add-a1d9-8fb1e7b6c726.png"&gt;&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;比较的过程中，循环从两边向中间收拢&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://static.ecool.fun//article/66a1b47c-6fd5-4a1a-80a9-a7bbfdf30022.png"&gt;&lt;/p&gt;</description></item><item><title>字节-技术中台-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-76/round-121/</link><pubDate>Tue, 02 Sep 2025 07:35:12 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-76/round-121/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-76/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-76/round-122/"&gt;第 2 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察校招生的前端基础知识、框架理解（Vue和React）、TypeScript应用、手写代码能力以及解决实际问题的能力。面试官重点关注以下几个方面：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;前端框架深度理解与实践&lt;/strong&gt;：不仅要求掌握Vue和React的基础知识，更强调对框架设计原理（如Vue的响应式、虚拟DOM）的理解，以及在实际项目中的应用能力（如Vuex到Pinia的迁移，以及在React中模拟Vue特性的思路）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JavaScript 核心与异步编程&lt;/strong&gt;：对&lt;code&gt;Object.defineProperty&lt;/code&gt;的数据劫持原理、Promise的深入理解及其各种组合与错误处理方式（&lt;code&gt;Promise.all&lt;/code&gt;、&lt;code&gt;Promise.allSettled&lt;/code&gt;），以及&lt;code&gt;async/await&lt;/code&gt;与Promise的关系是考察重点。手写算法题（数组扁平化、深拷贝）考验基础编码功底。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TypeScript 实际应用&lt;/strong&gt;：考察对TypeScript的熟练程度，包括基本类型、高级类型（如索引签名定义动态属性）的运用，以及如何在项目中利用TypeScript提升代码质量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工程化与性能优化&lt;/strong&gt;：Monorepo 多包依赖管理及冲突解决是工程实践的体现。图片懒加载的实现方式（尤其是&lt;code&gt;Intersection Observer API&lt;/code&gt;的应用）及其阈值优化，体现了对前端性能优化的关注和实践经验。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;整体而言，面试不仅考察&amp;quot;是什么&amp;quot;，更侧重&amp;quot;为什么&amp;quot;和&amp;quot;如何做&amp;quot;，需要候选人能够结合实际项目经验进行深入分析和解答。&lt;/p&gt;
&lt;p&gt;本轮共 20 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-8d95efee0278"&gt;1. 你刚才提到了一些项目经历，讲一个你觉的最有成就感的？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;这道题是典型的主观题，面试官并不期待一个&amp;quot;唯一标准答案&amp;quot;。&lt;/li&gt;
&lt;li&gt;主要考察的是答题者的表达能力、系统性思考问题的方式、对项目及技术的理解深度以及从项目中复盘和学习的能力。&lt;/li&gt;
&lt;li&gt;答题结构建议：简述项目背景与挑战 → 描述你的解决方案及遇到的困难 → 总结项目成果与个人成长。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在过去的项目经历中，让我最有成就感的是负责公司内部一个复杂的用户权限管理系统重构。这个系统当时面临着用户反馈权限配置混乱、性能瓶颈突出、以及新功能迭代困难等问题。&lt;/p&gt;
&lt;p&gt;当时的核心挑战在于，我们有上百种细粒度的权限点，并且需要支持多维度、动态的权限组合，这在旧系统中已经形成了一个巨大的权限矩阵，任何改动都牵一发而动全身。我首先主导了权限模型的梳理和抽象，将权限点进行了归类和分级，并引入了基于角色的访问控制（RBAC）模型，同时考虑了自定义策略的扩展性。技术选型上，我们从传统的后端硬编码权限逻辑，逐步迁移到了前后端分离、统一鉴权服务的方式，并通过引入缓存机制优化了权限查询性能。&lt;/p&gt;
&lt;p&gt;在实现过程中，最大的难点是如何在不影响现有业务的前提下，平滑地进行新旧权限系统的切换。为此，我设计了一套灰度发布方案，通过用户白名单和功能开关，逐步验证新系统的稳定性和准确性。在这个过程中，我们也遇到了一些意想不到的数据同步和兼容性问题，例如在特定场景下，新旧权限解析不一致导致的用户访问异常。我积极与后端团队、产品经理沟通，快速定位问题，并及时调整了数据同步策略和回滚机制，确保了业务的连续性。&lt;/p&gt;
&lt;p&gt;最终，重构后的权限系统不仅将权限配置的效率提升了30%，还将核心鉴权接口的响应时间从原来的数百毫秒优化到了几十毫秒，极大地提升了系统的性能和稳定性。更重要的是，它为后续的新业务快速上线提供了坚实的基础，权限迭代周期缩短了50%以上。通过这个项目，我不仅深化了对权限系统设计的理解，也锻炼了我在复杂项目中进行技术选型、架构设计、风险管理和跨团队协作的能力。这次经历让我深切体会到，解决核心痛点并为业务带来实际价值，才是技术工作的最大成就感。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-d3991a27b3f9"&gt;2. 项目里 Monorepo 管理多包依赖怎么实现的；&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Monorepo 概念：理解 Monorepo 的基本思想和优势。&lt;/li&gt;
&lt;li&gt;多包依赖管理工具：了解 Lerna、Yarn Workspaces 或 pnpm Workspaces 等工具。&lt;/li&gt;
&lt;li&gt;实现方式：掌握如何配置和使用这些工具来管理多包依赖，包括安装、发布、运行脚本等。&lt;/li&gt;
&lt;li&gt;软链接/硬链接：理解这些工具如何通过符号链接解决依赖共享和版本管理问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="11-原理说明"&gt;1.1 原理说明&lt;/h5&gt;
&lt;p&gt;Monorepo 是一种代码仓库管理策略，它将多个项目的代码存储在同一个版本控制仓库中，而不是为每个项目创建独立的仓库。这种方式的出现是为了解决多项目开发中代码共享、依赖管理、版本控制和协作效率等问题。它与传统的 Multirepo（多仓库）模式相对。&lt;/p&gt;
&lt;p&gt;其核心原理在于通过特定的工具（如 Lerna、Yarn Workspaces 或 pnpm Workspaces）来管理仓库内的多个子包（package），实现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;统一的依赖管理&lt;/strong&gt;：所有包的依赖都集中在一个地方（通常是根目录的 &lt;code&gt;package.json&lt;/code&gt; 或各自的 &lt;code&gt;package.json&lt;/code&gt; 结合工具配置），避免了重复安装和版本不一致的问题。工具会通过软链接或硬链接的方式将依赖安装到各个子包的 &lt;code&gt;node_modules&lt;/code&gt; 中，实现依赖的共享和复用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;统一的构建、测试、发布流程&lt;/strong&gt;：可以配置统一的脚本来执行所有或部分包的构建、测试和发布流程，简化 CI/CD。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码共享与重用&lt;/strong&gt;：各个子包可以直接相互引用，无需发布到 npm 等外部仓库，方便代码共享和模块化开发。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="12-核心用法--示例代码"&gt;1.2 核心用法 + 示例代码&lt;/h5&gt;
&lt;p&gt;以 Yarn Workspaces 为例，它作为 Yarn 包管理器的内置功能，提供了一种轻量级的 Monorepo 解决方案。&lt;/p&gt;</description></item><item><title>字节跳动-商业化-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-75/round-119/</link><pubDate>Tue, 02 Sep 2025 07:31:02 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-75/round-119/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-75/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-75/round-120/"&gt;第 2 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察前端基础知识、React框架原理、算法能力等多个维度的内容。重点关注CSS布局、页面性能优化、React核心概念等方面。&lt;/p&gt;
&lt;p&gt;本轮共 18 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-96560c8c639c"&gt;1. 如何实现一个宽高自适应的正方形元素？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CSS布局技巧和响应式设计能力&lt;/li&gt;
&lt;li&gt;百分比单位在CSS中的特殊性质理解&lt;/li&gt;
&lt;li&gt;现代CSS新特性的应用能力&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="11-原理说明"&gt;1.1 原理说明&lt;/h5&gt;
&lt;p&gt;实现宽高自适应的正方形元素的核心在于确保元素的高度能够根据其宽度以1:1的比例进行等比缩放。这通常通过利用CSS中某些属性的特殊计算方式来实现，或者通过现代CSS特性直接声明。以下是几种常见方案的核心原理：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;使用padding-top/padding-bottom百分比&lt;/strong&gt;：在CSS盒模型中，&lt;code&gt;padding&lt;/code&gt;属性的百分比值是相对于父元素的&lt;strong&gt;宽度&lt;/strong&gt;来计算的，即使是&lt;code&gt;padding-top&lt;/code&gt;和&lt;code&gt;padding-bottom&lt;/code&gt;也是如此。因此，当我们将一个元素的&lt;code&gt;height&lt;/code&gt;设为0，并将&lt;code&gt;padding-top&lt;/code&gt;或&lt;code&gt;padding-bottom&lt;/code&gt;设为&lt;code&gt;100%&lt;/code&gt;时，它的高度实际上会等于其父元素的宽度，从而形成一个完美的正方形（假设其宽度也为100%）。这种方法利用了这一特性来&amp;quot;撑开&amp;quot;元素的高度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用aspect-ratio（现代浏览器支持）&lt;/strong&gt;：&lt;code&gt;aspect-ratio&lt;/code&gt;是CSS的一个新属性，它允许开发者直接指定一个元素的宽高比，浏览器会根据这个比率自动计算元素的尺寸。例如，&lt;code&gt;aspect-ratio: 1/1&lt;/code&gt;会强制元素保持1:1的正方形比例。这是一个更语义化、更现代的解决方案，减少了传统方法的 hackiness。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用vw单位&lt;/strong&gt;：&lt;code&gt;vw&lt;/code&gt;（viewport width）是一个相对单位，&lt;code&gt;1vw&lt;/code&gt;等于视口宽度的1%。通过将元素的&lt;code&gt;width&lt;/code&gt;和&lt;code&gt;height&lt;/code&gt;都设置为相同的&lt;code&gt;vw&lt;/code&gt;值，例如&lt;code&gt;50vw&lt;/code&gt;，可以确保它们始终保持相等的尺寸，并随着视口宽度的变化而自适应缩放，从而形成正方形。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些方案各有优缺点，如兼容性、代码语义性等，选择哪种方案取决于具体的项目需求和目标浏览器环境。&lt;/p&gt;
&lt;h5 id="12-核心用法--示例代码"&gt;1.2 核心用法 + 示例代码&lt;/h5&gt;
&lt;p&gt;在实际开发中，这些方案可以根据兼容性需求和代码简洁性进行选择。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方案1：使用padding-top/padding-bottom百分比&lt;/strong&gt;
这种方法兼容性好，几乎所有浏览器都支持。常用于需要兼容旧版浏览器或在图片、视频容器中保持比例的场景。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;square&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 宽度可以设置为百分比、固定值或vw等 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;padding-top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* padding百分比相对于父元素宽度计算，确保高度与宽度相等 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;#eee&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* 内部内容可以通过绝对定位放置，以避免被padding挤压 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;position&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;relative&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;square-content&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;position&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;absolute&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;display&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;flex&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;justify-content&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;center&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;align-items&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;center&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;#333&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;HTML结构示例:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;square&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;square-content&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 自适应正方形
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;方案2：使用aspect-ratio（现代浏览器支持）&lt;/strong&gt;
这是CSS3新增的属性，语义化最好，代码最简洁。适用于现代浏览器环境，是推荐的首选方案。&lt;/p&gt;</description></item><item><title>字节-国际电商-前端面试 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-74/round-118/</link><pubDate>Tue, 02 Sep 2025 07:09:39 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-74/round-118/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-74/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 考察面试者的表达能力、总结归纳能力和个人亮点。&lt;/p&gt;
&lt;p&gt;本轮共 17 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-12b75c445924"&gt;1. 自我介绍&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;主观型问题，无唯一标准答案。&lt;/strong&gt; 面试官主要考察答题者的表达能力、总结归纳能力、沟通技巧以及对自身经历和技术栈的清晰认知。&lt;/li&gt;
&lt;li&gt;答题时建议围绕&amp;quot;我是谁&amp;quot;、&amp;ldquo;我做了什么&amp;rdquo;、&amp;ldquo;我做得怎么样&amp;quot;和&amp;quot;我为什么选择贵公司&amp;quot;这几个核心点展开，突出个人亮点与岗位匹配度。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;各位面试官好，我叫[您的姓名]，毕业于[您的学校]，专业是[您的专业]。在校期间，我专注于前端开发方向的学习与实践。在技术栈方面，我熟练掌握 HTML、CSS、JavaScript 基础，并深入学习了 Vue.js 框架，对 Vue 生态系统，如 Vuex、Vue Router 也有实际应用经验。在实习期间，我主要负责[您的项目职责，例如：公司官网前端页面的开发与维护，参与了XX功能模块的重构]。具体工作中，我曾独立负责[具体某个功能或模块]，通过[具体技术或方法]，实现了[具体效果或优化]，比如在[某项目中]实现了[某个功能]，有效提升了用户体验[或业务效率]。我个人对前端技术充满热情，具备良好的学习能力和解决问题的能力，期待能将我的技能和经验应用到贵公司，与团队一同成长。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-cd610cb03548"&gt;2. 在学校期间有没有参与过什么技术社团或项目，对你的前端学习有什么帮助？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;主观型问题，无唯一标准答案。&lt;/strong&gt; 面试官主要考察答题者在校期间对技术的热情、主动学习能力、团队协作能力以及将理论知识应用于实践的能力。他们希望了解你如何将课外活动与前端学习结合，并从中获得了哪些成长。&lt;/li&gt;
&lt;li&gt;答题时建议突出你在社团/项目中承担的角色、遇到的挑战、如何解决问题、学到的技术知识以及对个人成长的影响。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在校期间，我积极参与了学校的[例如：创新创业协会或某个技术兴趣小组]。在这些活动中，我曾参与一个[例如：校园兼职平台]的小型项目开发。当时，我们团队面临的挑战是[例如：如何利用有限的资源快速搭建一个具备基本交互功能的前端原型]。我主动承担了前端页面的开发工作，通过自学 Vue.js 的组件化思想和路由管理，将页面拆分为可复用的组件，并实现了前端路由功能。虽然项目规模不大，但它让我第一次有机会将课堂上学习的 HTML、CSS、JavaScript 知识体系化地应用到实际开发中。通过这次经历，我不仅锻炼了独立解决问题的能力，还体会到了团队协作的重要性，比如在开发中与后端同学进行接口联调、与设计师沟通 UI 实现细节等，这对我后续的实习和前端学习都产生了积极的推动作用。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-3cf5356e8d84"&gt;3. 说说你实习项目中遇到的技术难点，以及你是如何解决的？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;主观型问题，无唯一标准答案。&lt;/strong&gt; 面试官主要考察答题者对项目实践的深入理解、问题解决能力、技术深度以及学习和复盘能力。他们希望了解你在面对挑战时，如何分析问题、寻找解决方案并最终达成目标。&lt;/li&gt;
&lt;li&gt;答题时建议围绕&amp;quot;遇到什么难点&amp;rdquo;、&amp;ldquo;如何分析与定位问题&amp;rdquo;、&amp;ldquo;采用了哪些技术方案&amp;rdquo;、&amp;ldquo;解决了什么问题&amp;quot;以及&amp;quot;从中获得了哪些经验和教训&amp;quot;等核心点展开，强调思考过程和技术细节。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在我的实习项目中，我曾遇到一个比较棘手的性能问题。我们负责的一个电商列表页面，随着商品数量的增多，首次加载时间变得非常慢，用户体验受到严重影响。通过浏览器开发者工具分析，我发现主要瓶颈在于大量图片资源的加载以及首屏渲染时数据量过大导致的卡顿。&lt;/p&gt;
&lt;p&gt;为了解决这个问题，我首先考虑了&lt;strong&gt;图片懒加载&lt;/strong&gt;。我引入了一个 &lt;code&gt;Intersection Observer API&lt;/code&gt; 的实现，使得图片只有在进入用户视口时才开始加载，这显著减少了初始的 HTTP 请求数量和带宽消耗。其次，针对数据量大的问题，我调研并实现了&lt;strong&gt;虚拟列表&lt;/strong&gt;。核心思路是只渲染当前可见区域的列表项，并动态计算滚动时的偏移量和渲染范围。这避免了一次性渲染数千个 DOM 节点造成的性能压力。具体实现中，我维护了一个可滚动区域，根据滚动位置动态更新展示的数据索引，并结合 &lt;code&gt;requestAnimationFrame&lt;/code&gt; 确保滚动动画的流畅性。&lt;/p&gt;
&lt;p&gt;经过这些优化措施，页面的首次加载时间从原来的 8 秒降低到了 2 秒以内，列表滚动时的卡顿现象也基本消除。这个过程让我对前端性能优化有了更深层次的理解，特别是如何结合浏览器 API 和数据结构优化来解决实际问题，也锻炼了我分析和解决复杂性能瓶颈的能力。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-d61a01743b6a"&gt;4. 解释一下 TS 泛型的概念和作用&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;泛型概念&lt;/strong&gt;：面试官想确认面试者对泛型的基本定义、作用和设计目的的理解。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;泛型作用&lt;/strong&gt;：考察泛型在增强代码灵活性、类型安全和重用性方面的具体应用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实际应用&lt;/strong&gt;：理解泛型在实际开发中如何应用于函数、接口、类等场景，以及其在大型项目中的价值。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;1.1 原理说明&lt;/p&gt;</description></item><item><title>百度-小程序-暑期实习 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-73/round-117/</link><pubDate>Thu, 21 Aug 2025 15:43:17 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-73/round-117/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-73/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 21 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-a5330a58-5be0-4f4f-8394-43392311ddaa"&gt;1. 深拷贝浅拷贝有什么区别？怎么实现深拷贝？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/a5330a58-5be0-4f4f-8394-43392311ddaa"&gt;深拷贝浅拷贝有什么区别？怎么实现深拷贝？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;JS数据类型分别基本数据类型和引用数据类型，基本数据类型保存的是值，引用类型保存的是引用地址(this指针)。&lt;/p&gt;
&lt;p&gt;浅拷贝共用一个引用地址，深拷贝会创建新的内存地址。&lt;/p&gt;
&lt;h4 id="浅拷贝方法"&gt;浅拷贝方法&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;直接对象复制&lt;/li&gt;
&lt;li&gt;Object.assign&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="深拷贝"&gt;深拷贝&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;JSON.stringify转为字符串再JSON.parse&lt;/li&gt;
&lt;li&gt;深度递归遍历&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一数据类型存储"&gt;一、数据类型存储&lt;/h2&gt;
&lt;p&gt;前面文章我们讲到，&lt;code&gt;JavaScript&lt;/code&gt;中存在两大数据类型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基本类型&lt;/li&gt;
&lt;li&gt;引用类型&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;基本类型数据保存在在栈内存中&lt;/p&gt;
&lt;p&gt;引用类型数据保存在堆内存中，引用数据类型的变量是一个指向堆内存中实际对象的引用，存在栈中&lt;/p&gt;
&lt;h2 id="二浅拷贝"&gt;二、浅拷贝&lt;/h2&gt;
&lt;p&gt;浅拷贝，指的是创建新的数据，这个数据有着原始数据属性值的一份精确拷贝&lt;/p&gt;
&lt;p&gt;如果属性是基本类型，拷贝的就是基本类型的值。如果属性是引用类型，拷贝的就是内存地址&lt;/p&gt;
&lt;p&gt;即浅拷贝是拷贝一层，深层次的引用类型则共享内存地址&lt;/p&gt;
&lt;p&gt;下面简单实现一个浅拷贝&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;shallowClone&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;newObj&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;hasOwnProperty&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;)){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;newObj&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;newObj&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在&lt;code&gt;JavaScript&lt;/code&gt;中，存在浅拷贝的现象有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Object.assign&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Array.prototype.slice()&lt;/code&gt;, &lt;code&gt;Array.prototype.concat()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用拓展运算符实现的复制&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="objectassign"&gt;Object.assign&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;age&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;18&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;nature&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;smart&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;good&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;names&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name1&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;fx&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name2&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;xka&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;love&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;fx is a great girl&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;newObj&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Object.&lt;span style="color:#a6e22e"&gt;assign&lt;/span&gt;({}, &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="slice"&gt;slice()&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;One&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Two&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Three&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;slice&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;love&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;Two&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;love&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="concat"&gt;concat()&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;One&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Two&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Three&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;concat&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;love&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;Two&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;love&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="拓展运算符"&gt;拓展运算符&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;One&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Two&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Three&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [...&lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;love&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;Two&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;love&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="三深拷贝"&gt;三、深拷贝&lt;/h2&gt;
&lt;p&gt;深拷贝开辟一个新的栈，两个对象的属性完全相同，但是对应两个不同的地址，修改一个对象的属性，不会改变另一个对象的属性&lt;/p&gt;</description></item><item><title>百度-用户增长-秋招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-72/round-116/</link><pubDate>Thu, 21 Aug 2025 15:39:11 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-72/round-116/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-72/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 20 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-7266893b44e3"&gt;1. 有没有使用 Node.js 进行开发的经历？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;“不仅仅用过 Node.js，而且能说清楚在前端团队里它解决了哪些实际问题，产生了什么价值。”&lt;/strong&gt;
这样比单纯回答“用过/没用过”更有亮点。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;考察的核心是：&lt;strong&gt;对 Node.js 的理解深度&lt;/strong&gt;和&lt;strong&gt;在前端/全栈中的实际应用场景&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;回答时可以从以下几个角度展开：&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="1-使用场景"&gt;1. 使用场景&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;前端工程化工具链&lt;/strong&gt;：
使用 Node.js 驱动构建工具（Webpack、Vite、Rollup 等），编写脚本实现自动化构建、代码检查、Mock Server 搭建。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务端接口开发&lt;/strong&gt;：
基于 Express、Koa、NestJS 搭建轻量级 API 服务，用于前后端分离项目的接口模拟或小型后台系统。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中间层 / BFF（Backend for Frontend）&lt;/strong&gt;：
在复杂业务中，用 Node.js 实现前后端解耦，比如统一处理接口聚合、鉴权、缓存。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSR / SSG 场景&lt;/strong&gt;：
使用 Next.js 或 Nuxt.js，借助 Node.js 渲染首屏，提升 SEO 和加载体验。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;运维与脚本&lt;/strong&gt;：
编写部署脚本、自动生成文件、批量处理数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="2-具体任务"&gt;2. 具体任务&lt;/h3&gt;
&lt;p&gt;可以结合自身经历强调：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;是否搭建过 Mock 服务，辅助前后端并行开发；&lt;/li&gt;
&lt;li&gt;是否写过中间层解决跨域、接口聚合问题；&lt;/li&gt;
&lt;li&gt;是否在工程化中写过 Node.js 工具脚本（如自动生成路由表、埋点收集脚本）；&lt;/li&gt;
&lt;li&gt;是否参与过服务端渲染或静态站点生成相关开发。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="3-收获和亮点"&gt;3. 收获和亮点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;对 &lt;strong&gt;事件驱动、非阻塞 I/O&lt;/strong&gt; 有更深理解，能写出高并发场景下的稳定服务；&lt;/li&gt;
&lt;li&gt;学会了在前端视角下如何更好地和后端衔接；&lt;/li&gt;
&lt;li&gt;在实际项目中通过 Node.js 提升了团队的开发效率（例如通过脚本工具减少重复劳动）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-84f9eb35b071"&gt;2. CSS 3D 变形有哪些常见的属性和方法？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;CSS 3D 变形（3D Transform）是 CSS3 提供的一组属性，用来在三维空间中对元素进行旋转、缩放、平移、倾斜等操作。&lt;/p&gt;</description></item><item><title>百度-APP产品研发-秋招 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-69/round-115/</link><pubDate>Wed, 20 Aug 2025 14:54:45 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-69/round-115/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-69/round-112/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-69/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;面试时间：&lt;/strong&gt; 60分钟&lt;/p&gt;
&lt;p&gt;本轮共 21 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-81b93f8982e5"&gt;1. 讲一下你在官网开发中的主要职责，开发的模块以及你觉的比较亮点的地方&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;如果是面试官问到“官网开发中的主要职责、开发的模块以及比较亮点的地方”，一般可以从以下几个角度来回答，既展示你的全局把控能力，又体现你在某些点上有深度。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;如果是面试官问到“官网开发中的主要职责、开发的模块以及比较亮点的地方”，一般可以从以下几个角度来回答，既展示你的全局把控能力，又体现你在某些点上有深度。&lt;/p&gt;
&lt;p&gt;下面是一个参考思路：&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="1-主要职责"&gt;1. 主要职责&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;官网整体架构搭建&lt;/strong&gt;：根据业务和设计稿，使用 React/Vue + Vite/Next.js/Nuxt.js 等技术栈完成整体框架搭建，包括路由、状态管理、多语言支持等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公共模块封装&lt;/strong&gt;：抽象公共组件（如导航栏、页脚、轮播、富文本渲染、内容卡片等），提高复用率，减少重复开发。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能优化&lt;/strong&gt;：处理首屏加载速度、资源拆分、图片懒加载、SSR/SSG、SEO 优化。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;协作沟通&lt;/strong&gt;：与产品、UI、后端保持沟通，保证页面上线节奏和质量。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="2-负责的模块可根据实际情况举例"&gt;2. 负责的模块（可根据实际情况举例）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;首页&lt;/strong&gt;：承担品牌形象展示，涉及 banner 动效、动态数据展示、视频播放等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;产品/解决方案页&lt;/strong&gt;：结合后端接口，展示不同产品模块，支持筛选、搜索、动态路由。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;活动/新闻动态页&lt;/strong&gt;：接入 CMS（如 Strapi、Sanity、WordPress 等），支持运营人员通过后台直接发布。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多语言切换模块&lt;/strong&gt;：基于 i18n 实现官网多语言，支持自动识别浏览器语言，静态资源跟随切换。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SEO 优化模块&lt;/strong&gt;：处理 meta 信息、OG 标签、站点地图、robots.txt，提升搜索引擎收录效果。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="3-亮点难点突破"&gt;3. 亮点/难点突破&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;性能优化亮点&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;利用 SSR/SSG（Next.js/Nuxt.js）提升首屏渲染速度，Lighthouse 分数提升到 90+。&lt;/li&gt;
&lt;li&gt;使用图片 CDN + WebP 格式，首页加载时间缩短 30%。&lt;/li&gt;
&lt;li&gt;按需加载组件、拆分 bundle，减少首次请求体积。&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;CMS 系统&lt;/strong&gt;，实现官网内容可配置，避免频繁改代码上线，运营可直接维护。&lt;/li&gt;
&lt;li&gt;封装通用“模块化组件”，如 Banner、富文本、图文组合，做到拖拽/配置式渲染。&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;（基于 Lottie 或 GSAP），提升视觉冲击力。&lt;/li&gt;
&lt;li&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>百度-APP产品研发-秋招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-69/round-112/</link><pubDate>Tue, 19 Aug 2025 14:47:24 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-69/round-112/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-69/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-69/round-115/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 15 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-8b516cb7-fa94-4d68-929f-d3c628d1b7a2"&gt;1. 前端实现动画有哪些方式？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/8b516cb7-fa94-4d68-929f-d3c628d1b7a2"&gt;前端实现动画有哪些方式？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;前端开发中，实现动画的方法多种多样，每种方法都有其适用场景和优缺点。以下是一些常见的实现方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CSS 动画&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;@keyframes&lt;/code&gt; 和 &lt;code&gt;animation&lt;/code&gt; 属性定义动画。&lt;/li&gt;
&lt;li&gt;优点：易于实现，性能好，易于维护。&lt;/li&gt;
&lt;li&gt;缺点：功能相对简单，难以实现复杂的交互动画。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CSS 过渡（Transitions）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;transition&lt;/code&gt; 属性在状态变化时实现平滑过渡。&lt;/li&gt;
&lt;li&gt;优点：简单易用，性能优秀。&lt;/li&gt;
&lt;li&gt;缺点：只能用于状态变化的过渡，不适合复杂动画。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;JavaScript 动画&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 JavaScript 直接操作 DOM 元素的样式属性实现动画。&lt;/li&gt;
&lt;li&gt;优点：灵活性高，可以控制动画的每一个细节。&lt;/li&gt;
&lt;li&gt;缺点：可能影响性能，需要更多的代码实现。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Web Animations API&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;Element.animate()&lt;/code&gt; 方法实现动画。&lt;/li&gt;
&lt;li&gt;优点：提供更丰富的动画控制和更一致的跨浏览器支持。&lt;/li&gt;
&lt;li&gt;缺点：兼容性不如 CSS 动画。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SVG 动画&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 SVG 元素和 SMIL（Synchronized Multimedia Integration Language）或 CSS 动画实现动画。&lt;/li&gt;
&lt;li&gt;优点：适合矢量图形动画，易于集成。&lt;/li&gt;
&lt;li&gt;缺点：浏览器支持和性能可能不如 CSS 动画。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Canvas&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 HTML &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt; 元素和 JavaScript 绘制动画。&lt;/li&gt;
&lt;li&gt;优点：适合复杂的图形和游戏动画。&lt;/li&gt;
&lt;li&gt;缺点：实现复杂，需要手动管理每一帧的绘制。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CSS 3D 变换&lt;/strong&gt;：&lt;/p&gt;</description></item><item><title>美团-零售-秋招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-68/round-111/</link><pubDate>Mon, 04 Aug 2025 07:49:59 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-68/round-111/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-68/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察前端基础知识，包括数据结构、网络协议、操作系统、JavaScript、CSS、React以及算法等方面。&lt;/p&gt;
&lt;p&gt;本轮共 12 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-2de490946b38"&gt;1. 数组和链表的区别，读取 和 删除 的时间复杂度&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;数据结构基础&lt;/strong&gt;：考察对数组和链表这两种基本数据结构概念的理解，包括它们的存储方式和特点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;时间复杂度分析&lt;/strong&gt;：评估数据结构在不同操作下的性能表现，这是衡量算法效率的关键指标。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;&lt;strong&gt;1.1 原理说明&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;链表&lt;/strong&gt;：链表是一种将元素存储在非连续内存空间中的数据结构。每个元素（称为节点）包含数据本身以及指向下一个元素的指针（或引用）。节点之间通过这些指针逻辑上连接起来，但不要求物理上连续。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;联系与区别&lt;/strong&gt;：数组和链表都是线性数据结构，用于有序地存储和组织数据。它们的主要区别在于内存的物理存储方式和由此带来的对元素访问、插入、删除操作的效率差异。数组支持随机访问，而链表只能顺序访问。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;为什么会出现这个技术需求或问题&lt;/strong&gt;：不同的数据存储和操作场景对数据结构有不同的性能要求。当需要快速随机访问数据时，数组由于其连续存储特性表现更优；而当需要频繁地进行插入和删除操作时，链表由于其灵活的指针连接方式，避免了大量元素移动，因此效率更高。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;1.2 核心用法 + 示例代码&lt;/strong&gt;&lt;/p&gt;
&lt;ul&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;code&gt;O(1)&lt;/code&gt;。无论数组大小，访问任何元素所需时间都是恒定的。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;40&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;]); &lt;span style="color:#75715e"&gt;// 输出 30，直接访问，时间复杂度 O(1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;链表&lt;/strong&gt;：必须从链表的头部节点开始，沿着指针逐个遍历，直到找到目标元素。因此，时间复杂度为 &lt;code&gt;O(n)&lt;/code&gt;，其中 &lt;code&gt;n&lt;/code&gt; 是链表的长度。在最坏情况下，需要遍历整个链表。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Node&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;constructor&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;val&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;val&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;val&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;head&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Node&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;head&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Node&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;head&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Node&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;head&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;current&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;val&lt;/span&gt; &lt;span style="color:#f92672"&gt;!==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;30&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;current&lt;/span&gt; &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;val&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Not found&amp;#39;&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 输出 30，需要遍历，时间复杂度 O(n)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;code&gt;O(n)&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;splice&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 删除索引为2的元素（即3），后续元素（4, 5）前移，时间复杂度 O(n)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 输出 [1, 2, 4, 5]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;链表&lt;/strong&gt;：如果已知要删除节点的前一个节点，删除操作只需要修改前一个节点的指针，使其指向被删除节点的下一个节点。这个操作的时间复杂度为 &lt;code&gt;O(1)&lt;/code&gt;。如果需要先查找再删除，则总时间复杂度为 &lt;code&gt;O(n)&lt;/code&gt;（查找的开销）。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 假设我们有一个链表 1 -&amp;gt; 2 -&amp;gt; 3，我们要删除值为 2 的节点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 模拟找到值为 1 的节点 (prevNode) 和值为 2 的节点 (nodeToDelete)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;headDelete&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Node&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;node2&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Node&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;node3&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Node&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;headDelete&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;node2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;node2&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;node3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;prevNode&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;headDelete&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 值为 1 的节点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nodeToDelete&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;node2&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 值为 2 的节点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;prevNode&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nodeToDelete&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 将 1 的 next 指向 3，时间复杂度 O(1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 现在链表变为 1 -&amp;gt; 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;优势总结&lt;/strong&gt;：&lt;/p&gt;</description></item><item><title>美团-打车-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-67/round-110/</link><pubDate>Mon, 04 Aug 2025 07:21:50 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-67/round-110/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-67/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察前端基础、框架原理以及性能优化等方面的知识。&lt;/p&gt;
&lt;p&gt;本轮共 26 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-07fdb7cd02ac"&gt;1. 1. 项目的难点与亮点是什么？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;说明该题是主观型问题，不考&amp;quot;唯一标准答案&amp;quot;。&lt;/li&gt;
&lt;li&gt;面试官主要考察答题者的表达能力、思路系统性、技术理解和复盘能力。&lt;/li&gt;
&lt;li&gt;答题结构建议：首先简述项目背景，接着阐述难点（遇到的问题、如何解决、技术选型考量），再说明亮点（创新点、技术深度、业务价值），最后进行总结和反思。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我们团队在开发 XXX 项目时，有一个核心模块是 YYYY。这个模块的主要难点在于需要处理高并发的数据同步和复杂的权限控制逻辑。具体来说，我们面临的挑战包括：&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;strong&gt;解决思路&lt;/strong&gt;：我们分析了瓶颈，发现是由于频繁的数据库写入和全量数据推送导致的。经过讨论，我们最终选择了基于 WebSocket 实现增量数据推送，并引入了消息队列（Kafka）来削峰填谷，后端对数据进行聚合后再批量写入。在前端，我们设计了一个轻量级的数据缓存层，只在接收到增量更新时局部刷新UI，大大减少了DOM操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术权衡&lt;/strong&gt;：我们对比过轮询、长轮询等方案，但它们在实时性和资源消耗上都不如 WebSocket 配合增量更新。虽然引入消息队列和 WebSocket 增加了系统复杂度，但在百万级并发场景下，它提供了更优的性能和更低的资源占用。&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;：我们设计了一套基于 RBAC（Role-Based Access Control）的权限模型，但在前端实现时，为了避免每次操作都去后端校验权限，我们引入了前端权限路由守卫和组件级权限指令。在用户登录时，后端会返回一个精简的权限列表，前端根据这个列表动态生成菜单、路由，并控制组件的可见性及交互。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术权衡&lt;/strong&gt;：这种前后端结合的权限控制方式，兼顾了安全性和用户体验。虽然前端增加了权限逻辑处理，但减少了不必要的后端请求，提升了页面响应速度。我们还考虑过将权限完全放到后端控制，但那样会导致频繁的网络请求，用户体验会下降。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;项目的亮点主要体现在两个方面：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;技术深度与创新&lt;/strong&gt;：我们引入的 WebSocket + Kafka 的实时数据同步方案，有效地支撑了高并发场景下的数据一致性和实时性要求，这是项目在技术上的一大突破。此外，我们还自主研发了一套可视化配置工具，让业务人员可以灵活配置数据同步规则，极大地提高了运营效率。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;业务价值与用户体验提升&lt;/strong&gt;：通过解决上述难点，我们成功将核心页面的数据实时同步延迟从平均 5 秒降低到 500 毫秒以内，用户在操作时的卡顿感几乎消除，大幅提升了用户满意度。同时，权限系统的灵活配置也让业务扩展变得更加便捷，支持了新业务的快速上线。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在整个过程中，我们团队通过深入分析、多方案对比和持续优化，不仅攻克了技术难点，也为业务带来了实际的价值。这次经历让我对高并发系统设计和复杂权限管理有了更深刻的理解，也锻炼了我在权衡技术方案和解决实际问题方面的能力。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-7df4d539008c"&gt;2. 2. 解决难点时，是否对比过多种方案？最终选择的方案有何权衡？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;说明该题是主观型问题，不考&amp;quot;唯一标准答案&amp;quot;。&lt;/li&gt;
&lt;li&gt;面试官主要考察答题者解决问题的思路、方案对比能力、技术选型和权衡能力，以及对项目实际情况的理解。&lt;/li&gt;
&lt;li&gt;答题结构建议：首先选择一个具体的项目难点，围绕该难点，阐述曾考虑的多种解决方案，对比它们的优劣（技术、成本、风险等），最终说明选择当前方案的理由及权衡过程，并可提及后续优化方向。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在我的前端项目中，曾遇到一个挑战，就是如何高效地管理和渲染大规模的动态表单。传统的方案是直接通过 JSON 配置动态生成表单项，但这在表单项过多、层级嵌套复杂时，会导致渲染性能下降，并且表单校验逻辑难以统一管理。&lt;/p&gt;
&lt;p&gt;当时我们主要对比了以下几种方案：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;方案一：纯粹的 JSON Schema 驱动，一次性渲染&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;缺点&lt;/strong&gt;：对于包含上百个字段甚至更多字段的复杂表单，一次性渲染会导致首次加载时间过长，页面卡顿。当表单数据频繁变化时，DOM 更新开销大，用户体验差。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权衡&lt;/strong&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>腾讯-CSIG一校招 · 第 1 轮 · 第一轮</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-66/round-108/</link><pubDate>Mon, 28 Jul 2025 14:52:54 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-66/round-108/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-66/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-66/round-109/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 一面主要考察前端基础，难度不大。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;面试时间：&lt;/strong&gt; 90分钟&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 基础概念理解深入，能够解释原理和应用场景&lt;/p&gt;
&lt;p&gt;代码实现思路清晰，考虑边界情况和性能优化&lt;/p&gt;
&lt;p&gt;对前端技术栈有系统性认知，了解技术发展趋势&lt;/p&gt;
&lt;p&gt;具备解决实际问题的能力和工程化思维&lt;/p&gt;
&lt;p&gt;本轮共 12 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-9d0178e8aef9"&gt;1. 为什么选择前端&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;作为校招生，回答&amp;quot;为什么选择前端&amp;quot;时要避免空喊&amp;quot;热爱&amp;quot;或跟风，建议用&lt;strong&gt;具体经历+能力匹配+行业洞察&lt;/strong&gt;的三段式结构，既体现思考深度又展示成长潜力。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;以下是分场景的高分回答模板：&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="版本一技术驱动型适合有项目经历的同学"&gt;&lt;strong&gt;版本一：技术驱动型（适合有项目经历的同学）&lt;/strong&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;选择前端源于两次关键经历：&lt;br&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;大一用Vue重构学院官网&lt;/strong&gt;时，发现通过组件化开发能将设计稿像素级还原，这种&amp;rsquo;所见即所得&amp;rsquo;的即时反馈让我着迷；&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在实习中做低代码平台&lt;/strong&gt;时，用React+D3.js实现拖拽生成图表，体会到前端不仅是实现UI，更是连接用户与数据的桥梁。&lt;br&gt;
前端技术迭代快（如WebAssembly、微前端）的特点，恰好匹配我热衷通过技术解决实际问题的性格。贵司的XX业务（如电商/数据可视化）对交互体验要求极高，我的XX项目经验（举例）能快速落地。&amp;rdquo;&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="版本二用户导向型适合非科班转行的同学"&gt;&lt;strong&gt;版本二：用户导向型（适合非科班转行的同学）&lt;/strong&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;虽然我是工业设计专业，但&lt;strong&gt;大三时用Figma做APP原型&lt;/strong&gt;时，发现静态设计无法验证用户真实体验。于是自学Three.js做了3D产品展示页，通过A/B测试发现3D交互使用户停留时长提升40%。这让我意识到：前端是设计落地的&amp;rsquo;最后一公里&amp;rsquo;。&lt;br&gt;
前端独有的**&amp;lsquo;技术+设计+心理学&amp;rsquo;交叉属性**（如用Framer-motion设计微交互引导用户操作），让我能用代码延续设计价值。贵司注重用户体验（如引用官网案例），我的设计背景+代码能力能提供差异化视角。&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="版本三行业趋势型适合技术视野广的同学"&gt;&lt;strong&gt;版本三：行业趋势型（适合技术视野广的同学）&lt;/strong&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;选择前端是因为它是&lt;strong&gt;最接近技术变革一线&lt;/strong&gt;的领域：&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;云原生时代&lt;/strong&gt;：前端从浏览器扩展到全端（如Electron桌面应用、小程序）；&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI赋能&lt;/strong&gt;：WebGL+TF.js让前端直接运行AI模型（如实时人脸检测）；&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IoT场景&lt;/strong&gt;：前端技术控制智能家居（如用WebSerial协议与硬件通信）。&lt;br&gt;
我在&lt;strong&gt;开源项目参与过WebRTC实时互动功能开发&lt;/strong&gt;，体会到前端工程师正在定义下一代人机交互标准。贵司的XX业务（如智能硬件/元宇宙）正处于这些趋势的交汇点，我的XX技能（如WebGL/跨端开发）能直接贡献。&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="避坑提示"&gt;&lt;strong&gt;避坑提示&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;不要只说&amp;quot;喜欢 visible 的结果&amp;quot;&lt;/strong&gt;：改为**&amp;ldquo;享受从像素级还原到性能优化的全链路挑战&amp;rdquo;**（体现技术深度）。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;避免&amp;quot;前端简单&amp;quot;的刻板印象&lt;/strong&gt;：改为**&amp;ldquo;前端是工程复杂度最高的领域之一，需同时处理兼容性、状态管理、性能优化多端适配&amp;rdquo;**（展示认知）。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关联公司业务&lt;/strong&gt;：提前研究官网/技术博客，比如：&amp;ldquo;注意到贵司用Next.js重构了主站，我对其中SSG/ISR的SEO优化策略很感兴趣&amp;rdquo;（体现调研）。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;最后，用&lt;strong&gt;成长型结尾&lt;/strong&gt;强化潜力：&amp;ldquo;作为校招生，我清楚自己缺乏高并发场景经验，但已系统学习Chrome DevTools性能分析，并模拟过百万级PV的SSR优化（举例），期待在贵司的实际业务中深化这些能力。&amp;rdquo;&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-6610c0a2f308"&gt;2. 框架理解 - Nest.js设计思想&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;分层架构、功能增强、多种设计模式应用&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;Nest.js基于Express或Fastify进行封装，采用分层架构设计。底层HTTP服务器提供基础的请求处理能力，Nest.js在此基础上添加了依赖注入、装饰器、模块化等企业级特性。这确实类似装饰器模式，每一层都在不改变核心功能的前提下增强框架能力。&lt;/p&gt;
&lt;p&gt;除了装饰器模式，还了解观察者模式（发布-订阅），常用于事件系统和状态管理；工厂模式，用于创建不同类型的对象实例；单例模式，确保全局唯一实例等。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-fff5f90bab8c"&gt;3. 闭包概念和产生原因&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;词法作用域、变量访问权限、执行环境保持&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;闭包是指函数能够访问其外部作用域变量的特性。产生闭包的原因是JavaScript的词法作用域机制，函数在定义时就确定了可访问的变量范围，即使在其他执行环境中调用也能保持这种访问能力。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;createCounter&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;count&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#f92672"&gt;++&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;count&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;counter&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;createCounter&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;counter&lt;/span&gt;()); &lt;span style="color:#75715e"&gt;// 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;counter&lt;/span&gt;()); &lt;span style="color:#75715e"&gt;// 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h2 id="question-subjective-b79de4be96a2"&gt;4. 闭包内存问题及解决方案&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;引用保持、垃圾回收阻塞、手动清理、变量提取&lt;/p&gt;</description></item><item><title>腾讯-CSIG一校招 · 第 1 轮 · 第二轮</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-66/round-109/</link><pubDate>Mon, 28 Jul 2025 14:52:54 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-66/round-109/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-66/round-108/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-66/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 第二轮对技术深度有一定的考察。
对构建工具有深入理解，能够分析技术选型原因
掌握React核心概念和性能优化技巧
具备网络协议和安全知识
代码实现能力强，能够设计合理的算法和架构
理解设计模式在实际场景中的应用&lt;/p&gt;
&lt;p&gt;本轮共 14 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-f1c0f4f71588"&gt;1. Node中间件的作用和使用&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;请求拦截处理、横切关注点、链式执行、功能解耦&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;中间件是在请求和响应之间执行的函数，用于处理横切关注点。在Express/Nest.js中，中间件按顺序执行，每个中间件可以修改请求对象、响应对象，或者终止请求-响应循环。&lt;/p&gt;
&lt;p&gt;常用的中间件包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;身份验证中间件：验证用户token&lt;/li&gt;
&lt;li&gt;日志中间件：记录请求信息&lt;/li&gt;
&lt;li&gt;错误处理中间件：统一处理异常&lt;/li&gt;
&lt;li&gt;CORS中间件：处理跨域请求&lt;/li&gt;
&lt;li&gt;参数验证中间件：验证请求参数格式&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-c12bd009cf82"&gt;2. 大模型的理解和应用&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;语言模型、涌现能力、开发辅助、安全考虑&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;大模型是基于Transformer架构的深度学习模型，通过大规模数据训练获得强大的语言理解和生成能力。主要特点是参数量巨大、涌现能力强、通用性好。&lt;/p&gt;
&lt;p&gt;在开发中的应用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;代码生成和补全：提高开发效率&lt;/li&gt;
&lt;li&gt;文档生成：自动生成API文档和注释&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;/details&gt;
&lt;h2 id="question-subjective-0ea3ab62cd5f"&gt;3. Webpack vs Vite 的理解和区别&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;构建原理差异、性能表现、生态成熟度、配置复杂度&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;Webpack是基于模块打包的构建工具，通过入口文件分析依赖关系，将所有资源打包成bundle。Vite是基于ES模块的构建工具，开发时利用浏览器原生ES模块支持，生产时使用Rollup打包。&lt;/p&gt;
&lt;p&gt;主要区别：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;启动速度&lt;/strong&gt;：Vite利用ES模块按需加载，启动更快；Webpack需要预先打包&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;热更新&lt;/strong&gt;：Vite基于ES模块的HMR更精确；Webpack需要重新打包相关模块&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生态系统&lt;/strong&gt;：Webpack生态更成熟，插件丰富；Vite相对较新但发展迅速&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置复杂度&lt;/strong&gt;：Vite开箱即用，配置简单；Webpack配置相对复杂&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-29f2b86eee7f"&gt;4. 项目选择构建工具的考虑&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;开发体验优先、项目延续性、团队熟悉度、稳定性考虑&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;个人项目选择Vite主要考虑开发体验，启动快、热更新迅速，配置简单，适合快速原型开发。实习项目使用Webpack主要因为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;历史项目延续性，已有完整的配置和工作流&lt;/li&gt;
&lt;li&gt;团队熟悉度高，维护成本低&lt;/li&gt;
&lt;li&gt;生态系统成熟，特殊需求的插件支持更好&lt;/li&gt;
&lt;li&gt;大型项目的稳定性考虑&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-4d144b12214f"&gt;5. Vite 开发环境与生产环境差异&lt;/h2&gt;
&lt;h3 id="题目要点-4"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;按需加载vs完整打包、开发体验vs生产优化、不同构建工具&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;开发环境：&lt;/p&gt;</description></item><item><title>京东-零售-实习 · 第 1 轮 · 第一轮</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-65/round-107/</link><pubDate>Mon, 28 Jul 2025 14:15:34 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-65/round-107/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-65/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 主要考察前端基础，难度不大。&lt;/p&gt;
&lt;p&gt;本轮共 14 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-12b75c445924"&gt;1. 自我介绍&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;突出专业背景、技术栈掌握情况、学习能力和求职意向，简洁明了地展现个人优势。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;本科就读于XXX大学计算机科学与技术专业，在校期间系统学习了前端开发相关技术栈，包括HTML、CSS、JavaScript基础，以及React、Vue等现代框架。通过课程项目和个人实践，积累了一定的开发经验。&lt;/p&gt;
&lt;p&gt;在技术方面，熟练掌握ES6+语法、响应式布局、组件化开发思想，了解前端工程化工具如Webpack、Vite的使用。同时对前端性能优化、用户体验提升有一定认识。&lt;/p&gt;
&lt;p&gt;学习能力较强，能够快速适应新技术和开发环境，具备良好的问题分析和解决能力。希望能够加入贵公司，在实际项目中进一步提升技术水平，为团队贡献价值。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-68717ac93ae3"&gt;2. 说一说做过的项目中的难点和亮点&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;通过具体的技术难题展现问题解决能力，用数据量化优化效果，体现技术深度和实践价值。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;&lt;strong&gt;难点：&lt;/strong&gt; 在开发电商类项目时，遇到了商品列表的性能问题。当商品数据量达到几千条时，页面渲染明显卡顿。通过分析发现是频繁的DOM操作和重复渲染导致的。&lt;/p&gt;
&lt;p&gt;解决方案是实现了虚拟滚动技术，只渲染可视区域内的商品项，配合防抖优化搜索功能，最终将首屏渲染时间从3秒优化到800毫秒。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;亮点：&lt;/strong&gt; 设计了一套可复用的表单验证组件库。通过高阶组件模式封装了常见的验证逻辑，支持链式调用和自定义验证规则。这套组件在后续项目中被多次复用，提高了开发效率约30%。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-2c9499a66d1c"&gt;3. 手写秒杀倒计时组件&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;实现了完整的倒计时功能，包括时间计算、格式化显示、状态管理和生命周期处理，考虑了边界情况和用户体验。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;use client&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;React&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;react&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;useState&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;useEffect&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;useCallback&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;react&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CountdownProps&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;targetTimestamp&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;number&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 目标时间戳（毫秒）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;onEnd&lt;/span&gt;&lt;span style="color:#f92672"&gt;?:&lt;/span&gt; () =&amp;gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 倒计时结束回调
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TimeLeft&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;days&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;number&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;hours&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;number&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;minutes&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;number&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;seconds&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;number&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Countdown&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;React&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;FC&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;CountdownProps&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ({ &lt;span style="color:#a6e22e"&gt;targetTimestamp&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;onEnd&lt;/span&gt; }) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; [&lt;span style="color:#a6e22e"&gt;timeLeft&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;setTimeLeft&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;useState&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;TimeLeft&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;({ &lt;span style="color:#a6e22e"&gt;days&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;hours&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;minutes&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;seconds&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; [&lt;span style="color:#a6e22e"&gt;isActive&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;setIsActive&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;useState&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;calculateTimeLeft&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;useCallback&lt;/span&gt;(()&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TimeLeft&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;now&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Date.&lt;span style="color:#a6e22e"&gt;now&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;difference&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;targetTimestamp&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;now&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;difference&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;setIsActive&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;onEnd&lt;/span&gt;&lt;span style="color:#f92672"&gt;?&lt;/span&gt;.()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;days&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;hours&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;minutes&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;seconds&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;days&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Math.&lt;span style="color:#a6e22e"&gt;floor&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;difference&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;24&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;hours&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Math.&lt;span style="color:#a6e22e"&gt;floor&lt;/span&gt;((&lt;span style="color:#a6e22e"&gt;difference&lt;/span&gt; &lt;span style="color:#f92672"&gt;%&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;24&lt;/span&gt;)) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;minutes&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Math.&lt;span style="color:#a6e22e"&gt;floor&lt;/span&gt;((&lt;span style="color:#a6e22e"&gt;difference&lt;/span&gt; &lt;span style="color:#f92672"&gt;%&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;)) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;seconds&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Math.&lt;span style="color:#a6e22e"&gt;floor&lt;/span&gt;((&lt;span style="color:#a6e22e"&gt;difference&lt;/span&gt; &lt;span style="color:#f92672"&gt;%&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;)) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;days&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;hours&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;minutes&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;seconds&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }, [&lt;span style="color:#a6e22e"&gt;targetTimestamp&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;onEnd&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;useEffect&lt;/span&gt;(() =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;isActive&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;timer&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;setInterval&lt;/span&gt;(() =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;setTimeLeft&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;calculateTimeLeft&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }, &lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 初始化时立即计算一次
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;setTimeLeft&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;calculateTimeLeft&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; () =&amp;gt; &lt;span style="color:#a6e22e"&gt;clearInterval&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;timer&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }, [&lt;span style="color:#a6e22e"&gt;calculateTimeLeft&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;isActive&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;formatNumber&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;num&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;number&lt;/span&gt;)&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;string&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;num&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;toString&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;padStart&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;isActive&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;className&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;countdown-container&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;span&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;className&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;countdown-ended&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;秒杀已结束&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/span&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;className&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;countdown-container&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;className&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;countdown-wrapper&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#a6e22e"&gt;timeLeft&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;days&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;className&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;time-unit&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;span&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;className&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;time-number&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;formatNumber&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;timeLeft&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;days&lt;/span&gt;)}&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/span&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;span&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;className&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;time-label&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;天&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/span&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;span&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;className&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;separator&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;:&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/span&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;className&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;time-unit&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;span&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;className&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;time-number&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;formatNumber&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;timeLeft&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;hours&lt;/span&gt;)}&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/span&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;span&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;className&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;time-label&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;时&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/span&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;span&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;className&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;separator&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;:&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/span&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;className&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;time-unit&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;span&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;className&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;time-number&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;formatNumber&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;timeLeft&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;minutes&lt;/span&gt;)}&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/span&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;span&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;className&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;time-label&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;分&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/span&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;span&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;className&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;separator&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;:&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/span&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;className&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;time-unit&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;span&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;className&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;time-number&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;formatNumber&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;timeLeft&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;seconds&lt;/span&gt;)}&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/span&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;span&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;className&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;time-label&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;秒&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/span&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 使用示例
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;App&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;React&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;FC&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 设置一个5分钟后的时间戳
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;targetTime&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Date.&lt;span style="color:#a6e22e"&gt;now&lt;/span&gt;() &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;handleCountdownEnd&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;秒杀活动结束&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;className&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;app&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;h1&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;京东秒杀倒计时&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/h1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Countdown&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;targetTimestamp&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;targetTime&lt;/span&gt;} &lt;span style="color:#a6e22e"&gt;onEnd&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{&lt;span style="color:#a6e22e"&gt;handleCountdownEnd&lt;/span&gt;} &lt;span style="color:#f92672"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;App&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h2 id="question-subjective-bcdccaf58f83"&gt;4. 当前项目还有哪些可以优化的地方&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;从性能、体验、质量三个维度分析优化空间，体现对项目全局的思考和持续改进意识。&lt;/p&gt;</description></item><item><title>阿里巴巴-社招-5年 · 第 1 轮 · HR面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/round-106/</link><pubDate>Mon, 28 Jul 2025 13:18:04 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/round-106/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/round-105/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 7 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-f6ccab796d11"&gt;1. 离职的原因是什么&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-a7bdf7b22dda"&gt;2. 你熟悉 VUE 吗&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-425cfbd0d4de"&gt;3. 学习一些新技术，或者是业务中碰到的一些难题，你是针对性去解决会比较多一些，还是说你有系统的学习的一些规划呢&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-84b1ddf2b948"&gt;4. 工作过程中哪些成长比较大，遇到过哪些难题，怎么解决的&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-216e80a8f518"&gt;5. 你们的加班强度怎么样&lt;/h2&gt;
&lt;h3 id="题目要点-4"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-c4fc6896bfab"&gt;6. 你如何看待团队合作&lt;/h2&gt;
&lt;h3 id="题目要点-5"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-2fffcc2da94c"&gt;7. 离职的时候你怎么处理跟前同事的关系的&lt;/h2&gt;
&lt;h3 id="题目要点-6"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;hr&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/round-105/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;</description></item><item><title>阿里巴巴-社招-5年 · 第 1 轮 · 三面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/round-105/</link><pubDate>Mon, 28 Jul 2025 13:14:50 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/round-105/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/round-104/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/round-106/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 7 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-fe2a1570592c"&gt;1. 请用3分钟介绍魔方组件项目，突出技术决策过程&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-aa197d633ddb"&gt;2. 项目中遇到的最大技术挑战及解决思路&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-99061663aec1"&gt;3. 性能优化项目的ROI如何评估&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;性能优化 ROI 是投入产出比的度量，结合成本和业务收益评估&lt;br&gt;&lt;/li&gt;
&lt;li&gt;需明确优化目标、估算投入、预估收益，计算合理 ROI&lt;br&gt;&lt;/li&gt;
&lt;li&gt;关注性能指标与业务指标的映射关系，结合数据分析&lt;br&gt;&lt;/li&gt;
&lt;li&gt;兼顾技术收益和用户体验提升，避免盲目优化&lt;br&gt;&lt;/li&gt;
&lt;li&gt;持续跟踪优化效果，动态调整投资策略&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;理解性能优化的投入与收益关系&lt;br&gt;&lt;/li&gt;
&lt;li&gt;掌握定量和定性评估性能优化效果的方法&lt;br&gt;&lt;/li&gt;
&lt;li&gt;了解业务指标与性能指标的关联性&lt;br&gt;&lt;/li&gt;
&lt;li&gt;能结合项目实际情况合理规划和衡量优化价值&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二参考答案"&gt;二、参考答案&lt;/h2&gt;
&lt;h3 id="21-roi-的定义与核心思想"&gt;2.1 ROI 的定义与核心思想&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ROI（Return on Investment）即“投资回报率”，衡量投入资源与产出收益的比率&lt;br&gt;&lt;/li&gt;
&lt;li&gt;性能优化的 ROI 评估即衡量优化投入（时间、人力、成本）与带来的业务或技术收益是否成正比&lt;br&gt;&lt;/li&gt;
&lt;li&gt;目标是确保资源有效利用，避免盲目优化&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-性能优化投入的量化"&gt;2.2 性能优化投入的量化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;开发成本&lt;/strong&gt;：开发和测试性能优化方案所需的人力、时间&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基础设施成本&lt;/strong&gt;：可能新增的硬件资源或第三方服务开销&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;维护成本&lt;/strong&gt;：优化方案上线后的维护和升级投入&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="23-性能优化收益的量化"&gt;2.3 性能优化收益的量化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;业务指标提升&lt;/strong&gt;：如转化率、用户留存率、页面访问量、用户满意度等&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术指标改善&lt;/strong&gt;：首屏时间（FCP）、最大内容渲染时间（LCP）、交互响应时间、错误率降低等&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;运营成本降低&lt;/strong&gt;：服务器压力减轻、带宽节省、用户投诉减少等&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="24-关联业务价值与性能指标"&gt;2.4 关联业务价值与性能指标&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;通过数据分析建立性能指标与业务指标的映射关系，比如：&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;首屏加载时间缩短 1 秒，转化率提升 5%&lt;br&gt;&lt;/li&gt;
&lt;li&gt;页面响应延迟减少，用户流失率降低&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;结合历史数据或行业调研，预估性能改进带来的经济效益&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="25-评估流程示例"&gt;2.5 评估流程示例&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;明确优化目标&lt;/strong&gt;：确定需优化的性能瓶颈和预期改进幅度&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;估算投入成本&lt;/strong&gt;：评估开发时间、人力、资源等投入&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;预估收益&lt;/strong&gt;：基于数据和业务指标推算收益大小&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;计算 ROI&lt;/strong&gt;：收益 / 投入，判断是否值得投资&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;持续监控&lt;/strong&gt;：优化上线后跟踪实际效果，调整策略&lt;br&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="26-风险与非量化因素考虑"&gt;2.6 风险与非量化因素考虑&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;用户体验提升虽难量化，但对品牌和用户粘性极重要&lt;br&gt;&lt;/li&gt;
&lt;li&gt;竞争压力、市场趋势等外部因素可能影响 ROI&lt;br&gt;&lt;/li&gt;
&lt;li&gt;技术债务减少，长期维护成本降低也是重要收益&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="三常见误区或面试陷阱"&gt;三、常见误区或面试陷阱&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;❌ 只关注技术指标优化，忽视业务价值转化&lt;br&gt;&lt;/li&gt;
&lt;li&gt;❌ 低估开发和维护成本，导致投入超出预期&lt;br&gt;&lt;/li&gt;
&lt;li&gt;❌ 盲目追求极致性能，忽略边际效益递减&lt;br&gt;&lt;/li&gt;
&lt;li&gt;❌ 缺乏数据支持，ROI 评估主观臆断&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-896a0dfe68d9"&gt;4. 项目风险遇到过哪些 ，怎么解决的&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;</description></item><item><title>阿里巴巴-社招-5年 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/round-104/</link><pubDate>Mon, 28 Jul 2025 13:12:16 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/round-104/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/round-103/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/round-105/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 浏览器的缓存机制、react hooks&lt;/p&gt;
&lt;p&gt;本轮共 11 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-ec00bef3ae1f"&gt;1. 魔方组件的整体架构设计，包括其模块划分和核心功能&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-5fbb94f70c45"&gt;2. 你们是如何选择技术栈的？有哪些关键因素影响了决策&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-6609cb7e68a2"&gt;3. 魔方组件如何实现动态加载，以提升初始加载性能&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-6341793e1f2f"&gt;4. 魔方组件如何管理组件的配置信息？组件之间的通信是如何处理的&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-1c18a4d18c05"&gt;5. 三维模型的加载性能，将加载时间从10秒缩短至3秒都做了哪些操作&lt;/h2&gt;
&lt;h3 id="题目要点-4"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-eccb4b551bdc"&gt;6. 这个项目中在移动端，你们是如何处理不同设备的适配问题的&lt;/h2&gt;
&lt;h3 id="题目要点-5"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-d2890bee3f50"&gt;7. 有没有用服务端渲染（SSR）？如果有，你们是如何实现的&lt;/h2&gt;
&lt;h3 id="题目要点-6"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SSR 是服务器预先渲染页面，提高首屏性能和 SEO&lt;br&gt;&lt;/li&gt;
&lt;li&gt;常用框架有 Next.js、Nuxt.js，也可自研实现&lt;br&gt;&lt;/li&gt;
&lt;li&gt;实现时结合服务器渲染和客户端 Hydration 完成完整页面交互&lt;br&gt;&lt;/li&gt;
&lt;li&gt;需处理代码共享、数据预取、样式加载及性能优化&lt;br&gt;&lt;/li&gt;
&lt;li&gt;了解 SSR 的局限性和优化难点，合理权衡使用场景&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;理解 SSR 的基本概念和优势&lt;br&gt;&lt;/li&gt;
&lt;li&gt;掌握常见 SSR 实现方案及其原理&lt;br&gt;&lt;/li&gt;
&lt;li&gt;理解 SSR 与客户端渲染（CSR）的区别和协同方式&lt;br&gt;&lt;/li&gt;
&lt;li&gt;了解 SSR 在项目中的具体落地方法和技术选型&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二参考答案"&gt;二、参考答案&lt;/h2&gt;
&lt;h3 id="21-ssr-的基本概念"&gt;2.1 SSR 的基本概念&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SSR（Server-Side Rendering）是指在服务器端完成页面的 HTML 渲染，再将完整的 HTML 返回给客户端&lt;br&gt;&lt;/li&gt;
&lt;li&gt;相比纯客户端渲染，SSR 提升了首屏渲染速度和 SEO 友好性&lt;br&gt;&lt;/li&gt;
&lt;li&gt;用户拿到的是已渲染好的页面，浏览器可以更快显示内容&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-ssr-的优势和适用场景"&gt;2.2 SSR 的优势和适用场景&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;首屏速度快&lt;/strong&gt;：浏览器无需等待大量 JS 执行即可显示页面&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SEO 优化&lt;/strong&gt;：搜索引擎能抓取到完整的内容，提升排名&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;社交分享友好&lt;/strong&gt;：分享链接时可显示完整预览&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;适合内容型或公共站点&lt;/strong&gt;，电商、新闻、博客等场景&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="23-常见-ssr-实现方案"&gt;2.3 常见 SSR 实现方案&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Next.js&lt;/strong&gt;（React）：提供开箱即用的 SSR 支持和静态生成&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nuxt.js&lt;/strong&gt;（Vue）：Vue 生态的 SSR 框架，支持服务端渲染和静态导出&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自研 SSR&lt;/strong&gt;：使用 Node.js 搭配 ReactDOMServer 或 Vue SSR API 手动实现&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;传统模板引擎&lt;/strong&gt;：如 EJS、Handlebars 等，服务器渲染 HTML&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="24-我们项目中-ssr-的实现方式"&gt;2.4 我们项目中 SSR 的实现方式&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用了 [Next.js / Nuxt.js / 自研 SSR] 作为 SSR 框架&lt;br&gt;&lt;/li&gt;
&lt;li&gt;服务器通过 Node.js 环境调用 ReactDOMServer.renderToString 或 Vue SSR 的 renderToString，生成完整 HTML&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合路由系统，实现根据请求 URL 渲染对应页面&lt;br&gt;&lt;/li&gt;
&lt;li&gt;页面返回时携带初始数据（通过服务端数据预取），客户端接管 Hydration，实现页面交互&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合缓存策略，优化性能和响应速度&lt;br&gt;&lt;/li&gt;
&lt;li&gt;配合 Webpack 和 Babel，保证服务端代码和客户端代码一致性&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="25-实现过程中需注意的问题"&gt;2.5 实现过程中需注意的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;服务端和客户端代码共享及差异处理（避免浏览器 API 直接调用）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;初始数据的获取与注入，保证页面完整性和交互&lt;br&gt;&lt;/li&gt;
&lt;li&gt;处理样式加载，避免闪烁（FOUC）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;性能优化，如页面缓存、资源压缩和异步加载&lt;br&gt;&lt;/li&gt;
&lt;li&gt;服务器负载和扩展性考虑&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="三常见误区或面试陷阱"&gt;三、常见误区或面试陷阱&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;❌ 认为 SSR 只是在服务器渲染静态 HTML，忽略客户端 Hydration&lt;br&gt;&lt;/li&gt;
&lt;li&gt;❌ 忽视服务端渲染的性能开销和状态同步难题&lt;br&gt;&lt;/li&gt;
&lt;li&gt;❌ 直接复用客户端代码，未处理服务端无 DOM 的环境差异&lt;br&gt;&lt;/li&gt;
&lt;li&gt;❌ 忽略 SEO 以外的性能和用户体验提升点&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-3785aa20675d"&gt;8. 项目中使用了哪些状态管理工具？为什么选择这些工具&lt;/h2&gt;
&lt;h3 id="题目要点-7"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;状态管理工具选择基于项目规模、团队经验和性能需求&lt;br&gt;&lt;/li&gt;
&lt;li&gt;Redux 适合大型复杂应用，MobX 适合响应式需求&lt;br&gt;&lt;/li&gt;
&lt;li&gt;Context 适合轻量局部状态管理&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合工具生态和中间件支持，提升开发效率和维护性&lt;br&gt;&lt;/li&gt;
&lt;li&gt;合理划分全局与局部状态，避免状态管理复杂化&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点-1"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;理解不同状态管理工具的特点及适用场景&lt;br&gt;&lt;/li&gt;
&lt;li&gt;掌握项目中选择状态管理工具的决策逻辑&lt;br&gt;&lt;/li&gt;
&lt;li&gt;能清晰阐述所选工具带来的优势和解决的问题&lt;br&gt;&lt;/li&gt;
&lt;li&gt;了解状态管理的基本概念和复杂度控制方法&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二参考答案-1"&gt;二、参考答案&lt;/h2&gt;
&lt;h3 id="21-项目中使用的状态管理工具"&gt;2.1 项目中使用的状态管理工具&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Redux&lt;/strong&gt;&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;适用于大型复杂应用，状态集中管理&lt;br&gt;&lt;/li&gt;
&lt;li&gt;具备时间旅行调试、可预测状态变更、丰富中间件生态&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MobX&lt;/strong&gt;&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;响应式状态管理，自动追踪依赖，适合数据驱动视图更新&lt;br&gt;&lt;/li&gt;
&lt;li&gt;代码简洁，学习曲线较低&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;React Context + useReducer/useState&lt;/strong&gt;&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;轻量级状态共享方案，适合中小型或局部状态管理&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recoil / Zustand / Valtio 等轻量方案&lt;/strong&gt;&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;现代灵活的状态管理，适合部分场景需求&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vuex（Vue 项目）&lt;/strong&gt;&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;Vue 官方状态管理库，集中管理全局状态，支持插件扩展&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-选择这些工具的理由"&gt;2.2 选择这些工具的理由&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;项目规模与复杂度&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;</description></item><item><title>阿里巴巴-社招-5年 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/round-103/</link><pubDate>Mon, 28 Jul 2025 12:42:07 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/round-103/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-64/round-104/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; React 生命周期、react hooks、JSX、react 渲染机制、React函数组件更新、react 组件设计模式&lt;/p&gt;
&lt;p&gt;本轮共 38 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-0e1759e87727"&gt;1. 你参与的主要项目是什么？是桌面端还是移动端项目&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-d691062b1d66"&gt;2. 在项目中主要使用了哪些技术栈&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-3ee00ddb36c7"&gt;3. 你对 Vue 有多少了解&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Vue 是数据驱动 + 响应式的组件化框架，适合快速构建中大型项目&lt;br&gt;&lt;/li&gt;
&lt;li&gt;熟悉其核心机制：响应式原理、组件生命周期、指令语法、虚拟 DOM&lt;br&gt;&lt;/li&gt;
&lt;li&gt;掌握 Vue Router、Vuex/Pinia 等配套生态工具&lt;br&gt;&lt;/li&gt;
&lt;li&gt;能区分并熟练使用 Vue 2 和 Vue 3 的开发模式&lt;br&gt;&lt;/li&gt;
&lt;li&gt;具备优化性能、提升可维护性的工程意识&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;探查候选人对 Vue 核心原理、语法机制的理解深度&lt;br&gt;&lt;/li&gt;
&lt;li&gt;判断是否具备实战经验、组件开发能力、性能优化能力&lt;br&gt;&lt;/li&gt;
&lt;li&gt;涵盖响应式系统、组件通信、生命周期、指令系统、虚拟 DOM、Diff 等关键技术点&lt;br&gt;&lt;/li&gt;
&lt;li&gt;Vue 生态栈是否熟悉，如 Vue Router、Vuex / Pinia、Composition API、Vue 3 升级等&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二参考答案"&gt;二、参考答案&lt;/h2&gt;
&lt;h3 id="21-vue-框架的整体认知"&gt;2.1 Vue 框架的整体认知&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Vue 是一个 &lt;strong&gt;轻量、渐进式的前端框架&lt;/strong&gt;，核心关注 View 层，易学易用，适合快速开发中大型应用&lt;/li&gt;
&lt;li&gt;支持响应式绑定、组件化开发、指令系统、虚拟 DOM、跨平台（如 H5、小程序）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vue 的核心组成包括：&lt;/p&gt;</description></item><item><title>阿里巴巴-社招-3年 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-63/round-102/</link><pubDate>Mon, 28 Jul 2025 12:38:24 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-63/round-102/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-63/round-101/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-63/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; react hooks、高阶组件、列表和key、react 渲染机制、react 组件设计模式、前端模块化、Webpack与Vite&lt;/p&gt;
&lt;p&gt;本轮共 12 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-f9a4ad22386a"&gt;1. 讲一下你对Hooks 了解&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Hooks 是函数组件状态和副作用管理的新方案&lt;br&gt;&lt;/li&gt;
&lt;li&gt;常用 Hooks 有 &lt;code&gt;useState&lt;/code&gt;、&lt;code&gt;useEffect&lt;/code&gt;、&lt;code&gt;useMemo&lt;/code&gt;、&lt;code&gt;useCallback&lt;/code&gt; 等&lt;br&gt;&lt;/li&gt;
&lt;li&gt;Hook 调用必须遵循规则，保证顺序稳定&lt;br&gt;&lt;/li&gt;
&lt;li&gt;自定义 Hooks 用于逻辑复用，提高代码可维护性&lt;br&gt;&lt;/li&gt;
&lt;li&gt;理解 Hook 设计原理，有助于写出高质量 React 代码&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;理解 React Hooks 的设计初衷与核心概念&lt;br&gt;&lt;/li&gt;
&lt;li&gt;掌握常用 Hooks（如 useState、useEffect、useMemo、useCallback 等）的作用与使用场景&lt;br&gt;&lt;/li&gt;
&lt;li&gt;理解 Hooks 规则及其背后的原理机制&lt;br&gt;&lt;/li&gt;
&lt;li&gt;认识 Hooks 对函数组件状态管理和生命周期的改进&lt;br&gt;&lt;/li&gt;
&lt;li&gt;了解自定义 Hooks 的设计思路及复用价值&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二参考答案"&gt;二、参考答案&lt;/h2&gt;
&lt;h3 id="21-hooks-的定义与设计初衷"&gt;2.1 Hooks 的定义与设计初衷&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：Hooks 是 React 16.8 引入的函数组件状态和副作用管理的特性&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设计目标&lt;/strong&gt;：&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;解决类组件中状态逻辑难以复用和组件嵌套过深的问题&lt;br&gt;&lt;/li&gt;
&lt;li&gt;让函数组件拥有类似类组件的状态和生命周期能力&lt;br&gt;&lt;/li&gt;
&lt;li&gt;简化组件逻辑，提升代码可读性和复用性&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-常用-hooks-及其作用"&gt;2.2 常用 Hooks 及其作用&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hooks&lt;/th&gt;
&lt;th&gt;功能描述&lt;/th&gt;
&lt;th&gt;典型使用场景&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;useState&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;在函数组件中声明状态变量&lt;/td&gt;
&lt;td&gt;组件内部状态管理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;useEffect&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;处理副作用（订阅、异步请求、DOM操作等）&lt;/td&gt;
&lt;td&gt;替代类组件的生命周期钩子&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;useContext&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;订阅 React Context，实现跨组件数据传递&lt;/td&gt;
&lt;td&gt;共享全局状态、主题、语言等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;useMemo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;记忆计算结果，避免不必要的重复计算&lt;/td&gt;
&lt;td&gt;性能优化，避免昂贵计算重复执行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;useCallback&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;记忆函数实例，避免子组件重复渲染&lt;/td&gt;
&lt;td&gt;优化子组件性能，防止无意义的 props 变化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;useRef&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;保存可变值，不触发组件重新渲染&lt;/td&gt;
&lt;td&gt;访问 DOM 节点或保存不变引用&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="23-hooks-的规则与原理"&gt;2.3 Hooks 的规则与原理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;规则&lt;/strong&gt;：&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;只能在函数组件或自定义 Hooks 中调用&lt;br&gt;&lt;/li&gt;
&lt;li&gt;只能顶层调用，不能在循环、条件或嵌套函数中调用，保证 Hook 调用顺序稳定&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;原理&lt;/strong&gt;：React 通过维护一个 Hook 链表和调用顺序，关联 Hook 状态与对应组件实例，实现状态的持久化和更新&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="24-自定义-hooks"&gt;2.4 自定义 Hooks&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;将组件中可复用的状态逻辑抽象成函数&lt;br&gt;&lt;/li&gt;
&lt;li&gt;函数内部调用其他 Hooks，实现逻辑复用与拆分&lt;br&gt;&lt;/li&gt;
&lt;li&gt;提高代码复用性和可维护性&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="三常见误区或面试陷阱"&gt;三、常见误区或面试陷阱&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;误用 Hook 规则，导致调用顺序不稳定&lt;br&gt;&lt;/li&gt;
&lt;li&gt;过度使用 &lt;code&gt;useEffect&lt;/code&gt;，产生复杂副作用链和性能问题&lt;br&gt;&lt;/li&gt;
&lt;li&gt;误解 &lt;code&gt;useMemo&lt;/code&gt; 和 &lt;code&gt;useCallback&lt;/code&gt; 的使用时机和作用&lt;br&gt;&lt;/li&gt;
&lt;li&gt;忽略依赖项数组，导致副作用不正确执行&lt;br&gt;&lt;/li&gt;
&lt;li&gt;不了解自定义 Hooks 是普通函数，不能在其中调用 Hook 规则外的逻辑&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-ba3489d6bd89"&gt;2. 对比 Class 组件的 Mixin 模式，Hooks 如何解决逻辑复用问题？Mixin 的主要缺陷是什么&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Mixin 依赖多继承，存在命名冲突、状态污染、难维护等问题&lt;br&gt;&lt;/li&gt;
&lt;li&gt;Hooks 通过函数组合和自定义 Hook 实现逻辑复用，避免冲突和复杂继承&lt;br&gt;&lt;/li&gt;
&lt;li&gt;Hooks 提升代码可读性、维护性、测试性和类型支持&lt;br&gt;&lt;/li&gt;
&lt;li&gt;React 官方推荐使用 Hooks 替代 Mixin 模式&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点-1"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;理解 Class 组件中 Mixin 的工作方式及缺陷&lt;br&gt;&lt;/li&gt;
&lt;li&gt;掌握 Hooks 解决组件逻辑复用的机制和优势&lt;br&gt;&lt;/li&gt;
&lt;li&gt;比较两种方案在代码组织、维护性和复用性上的差异&lt;br&gt;&lt;/li&gt;
&lt;li&gt;理解现代 React 设计理念和组件开发最佳实践&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二参考答案-1"&gt;二、参考答案&lt;/h2&gt;
&lt;h3 id="21-mixin-模式及其缺陷"&gt;2.1 Mixin 模式及其缺陷&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mixin 定义&lt;/strong&gt;：通过多个类混入（mixin）共享方法和状态，Class 组件通过继承或组合多个 mixin 实现代码复用&lt;br&gt;&lt;/p&gt;</description></item><item><title>阿里巴巴-社招-3年 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-63/round-101/</link><pubDate>Mon, 28 Jul 2025 12:26:34 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-63/round-101/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-63/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-63/round-102/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; react 事件机制、React 生命周期、state 与 props&lt;/p&gt;
&lt;p&gt;本轮共 13 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-ee8affda6741"&gt;1. 实现全屏水平垂直居中、宽高为屏幕宽度一半的正方形&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;利用 &lt;code&gt;vw&lt;/code&gt; 单位定义宽高，保证正方形且相对视口大小&lt;/li&gt;
&lt;li&gt;Flexbox 和绝对定位 + transform 是常用居中方案&lt;/li&gt;
&lt;li&gt;重置默认 margin 和设置容器高度保证布局准确&lt;/li&gt;
&lt;li&gt;任选方案均可，Flexbox 代码简洁，绝对定位兼容性好&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;掌握 CSS 布局基础知识&lt;br&gt;&lt;/li&gt;
&lt;li&gt;熟悉视口单位（vw、vh）的使用&lt;br&gt;&lt;/li&gt;
&lt;li&gt;理解水平垂直居中多种实现方式&lt;br&gt;&lt;/li&gt;
&lt;li&gt;了解盒模型和尺寸计算&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二参考答案"&gt;二、参考答案&lt;/h2&gt;
&lt;h3 id="21-需求分析"&gt;2.1 需求分析&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;元素宽度和高度为屏幕宽度的 50%（即 50vw）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;元素是正方形，宽高相等&lt;br&gt;&lt;/li&gt;
&lt;li&gt;水平和垂直方向均居中显示&lt;br&gt;&lt;/li&gt;
&lt;li&gt;兼容主流现代浏览器&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-代码实现示例"&gt;2.2 代码实现示例&lt;/h3&gt;
&lt;h4 id="方法一使用-flexbox"&gt;方法一：使用 Flexbox&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;container&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;square&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;html&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;body&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; .&lt;span style="color:#a6e22e"&gt;container&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;margin&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;vh&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;display&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;flex&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;justify-content&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;center&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 水平居中 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;align-items&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;center&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 垂直居中 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;square&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;vw&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;vw&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 保证正方形 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;#4CAF50&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="方法二使用绝对定位--transform"&gt;方法二：使用绝对定位 + transform&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;square&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;square&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;position&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;absolute&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;vw&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;vw&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;#2196F3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;transform&lt;/span&gt;: translate(&lt;span style="color:#ae81ff"&gt;-50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;-50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;html&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#f92672"&gt;body&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;margin&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;vh&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="23-说明"&gt;2.3 说明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;50vw&lt;/code&gt; 表示视口宽度的一半&lt;/li&gt;
&lt;li&gt;Flexbox 方案利用容器的弹性布局实现简单居中&lt;/li&gt;
&lt;li&gt;绝对定位方案通过 &lt;code&gt;top:50%&lt;/code&gt;, &lt;code&gt;left:50%&lt;/code&gt; 定位中心点，再用 &lt;code&gt;transform&lt;/code&gt; 修正偏移&lt;/li&gt;
&lt;li&gt;两种方案均保证元素在视口中央且尺寸为屏幕宽度一半的正方形&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="三常见误区或面试陷阱"&gt;三、常见误区或面试陷阱&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;忽略 viewport 单位，使用百分比 &lt;code&gt;%&lt;/code&gt; 宽高导致高度受父元素限制&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;margin: auto&lt;/code&gt; 只实现水平居中，未垂直居中&lt;/li&gt;
&lt;li&gt;transform 偏移值写错方向或单位&lt;/li&gt;
&lt;li&gt;未重置 &lt;code&gt;html, body&lt;/code&gt; 的 margin 和高度，导致布局异常&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-efad8bc5b4fe"&gt;2. 如何通过 padding-bottom 实现自适应正方形&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;百分比 padding-bottom 是相对于元素宽度计算的&lt;/li&gt;
&lt;li&gt;设置宽度，padding-bottom 等于宽度比例即可实现宽高比&lt;/li&gt;
&lt;li&gt;纯 CSS 实现响应式正方形，无需 JS 计算&lt;/li&gt;
&lt;li&gt;配合 position 及 transform 可实现内部内容居中&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点-1"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;理解 CSS 盒模型及百分比 padding 的计算规则&lt;br&gt;&lt;/li&gt;
&lt;li&gt;熟悉通过内边距（padding）比例实现自适应高度的布局技巧&lt;br&gt;&lt;/li&gt;
&lt;li&gt;掌握纯 CSS 无需固定高度实现宽高比控制的方法&lt;br&gt;&lt;/li&gt;
&lt;li&gt;了解响应式设计及视口适配相关概念&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二参考答案-1"&gt;二、参考答案&lt;/h2&gt;
&lt;h3 id="21-核心原理说明"&gt;2.1 核心原理说明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;百分比 padding 的高度计算基于元素的宽度&lt;/strong&gt;&lt;br&gt;
例如，&lt;code&gt;padding-bottom: 100%&lt;/code&gt; 表示内边距底部高度是元素自身宽度的 100%&lt;br&gt;&lt;/li&gt;
&lt;li&gt;利用这一特性，设置一个元素的宽度，然后用 &lt;code&gt;padding-bottom&lt;/code&gt; 来控制高度，从而实现固定宽高比（正方形为 1:1）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;这种方式不依赖固定高度或 JS，纯 CSS 实现响应式正方形&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-具体实现方式"&gt;2.2 具体实现方式&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;square&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;square&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;vw&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 宽度为视口宽度的一半 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;padding-bottom&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;vw&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 内边距底部为宽度的 100%，实现高度与宽度相等 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;#f60&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;position&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;relative&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 便于放置绝对定位内容（如文字） */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* 如果需要内部内容绝对居中，可添加： */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;square&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; .&lt;span style="color:#a6e22e"&gt;content&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;position&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;absolute&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;transform&lt;/span&gt;: translate(&lt;span style="color:#ae81ff"&gt;-50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;-50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="23-使用场景"&gt;2.3 使用场景&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;自适应正方形容器&lt;/li&gt;
&lt;li&gt;图片或视频占位框&lt;/li&gt;
&lt;li&gt;响应式卡片、图标区域布局&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="三常见误区或面试陷阱-1"&gt;三、常见误区或面试陷阱&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;误以为 padding 百分比是基于高度计算（实际上是基于宽度）&lt;/li&gt;
&lt;li&gt;忽略内容本身不占高度，需要通过 &lt;code&gt;position: relative&lt;/code&gt; 和绝对定位解决内容布局&lt;/li&gt;
&lt;li&gt;没有设置元素的 &lt;code&gt;width&lt;/code&gt;，导致 padding 计算无意义&lt;/li&gt;
&lt;li&gt;使用固定 &lt;code&gt;height&lt;/code&gt; 反而破坏响应式效果&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-c8954730cddb"&gt;3. 若要求正方形内嵌图片保持比例且不拉伸，如何实现&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;容器用 padding-bottom 创建自适应正方形&lt;/li&gt;
&lt;li&gt;图片使用 &lt;code&gt;object-fit: contain&lt;/code&gt; 保持比例且不拉伸&lt;/li&gt;
&lt;li&gt;绝对定位图片居中显示，宽高100%填充容器&lt;/li&gt;
&lt;li&gt;设置 &lt;code&gt;overflow: hidden&lt;/code&gt; 避免溢出&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点-2"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;理解图片的默认渲染行为及尺寸适配&lt;br&gt;&lt;/li&gt;
&lt;li&gt;掌握 CSS 中图片等媒体对象的缩放控制属性（object-fit）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;熟悉容器布局，确保图片在固定宽高正方形内自适应显示&lt;br&gt;&lt;/li&gt;
&lt;li&gt;了解响应式设计和兼容性考虑&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二参考答案-2"&gt;二、参考答案&lt;/h2&gt;
&lt;h3 id="21-核心概念说明"&gt;2.1 核心概念说明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;图片默认行为&lt;/strong&gt;：图片按原始宽高比显示，若强制设置宽高可能导致变形&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;object-fit&lt;/code&gt; 属性&lt;/strong&gt;：用于控制替换元素（如 img、video）内容的填充方式&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;object-fit: contain&lt;/code&gt; 保持图片比例，完整显示，可能留空白&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;object-fit: cover&lt;/code&gt; 保持比例，填满容器，超出部分裁剪&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合容器尺寸和 &lt;code&gt;object-fit&lt;/code&gt; 可灵活控制图片展示效果&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-具体实现示例"&gt;2.2 具体实现示例&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;square&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;img&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;your-image.jpg&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;alt&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;示例图片&amp;#34;&lt;/span&gt; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;square&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;vw&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;padding-bottom&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;vw&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 自适应正方形 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;position&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;relative&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;overflow&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;hidden&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 防止图片溢出 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;square&lt;/span&gt; &lt;span style="color:#f92672"&gt;img&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;position&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;absolute&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;object-fit&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;contain&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 保持比例且不拉伸 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;transform&lt;/span&gt;: translate(&lt;span style="color:#ae81ff"&gt;-50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;-50&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="23-说明-1"&gt;2.3 说明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;padding-bottom&lt;/code&gt; 创建正方形容器&lt;/li&gt;
&lt;li&gt;&lt;code&gt;position: relative&lt;/code&gt; + &lt;code&gt;position: absolute&lt;/code&gt; 定位图片，方便居中&lt;/li&gt;
&lt;li&gt;图片宽高设为 100%，配合 &lt;code&gt;object-fit: contain&lt;/code&gt; 保持原始比例且不被拉伸&lt;/li&gt;
&lt;li&gt;&lt;code&gt;overflow: hidden&lt;/code&gt; 防止图片超出容器边界显示&lt;/li&gt;
&lt;li&gt;可根据需求改为 &lt;code&gt;object-fit: cover&lt;/code&gt; 实现填充并裁剪效果&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="三常见误区或面试陷阱-2"&gt;三、常见误区或面试陷阱&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;不设置 &lt;code&gt;object-fit&lt;/code&gt;，直接用 &lt;code&gt;width&lt;/code&gt; 和 &lt;code&gt;height&lt;/code&gt; 100%，图片可能被拉伸变形&lt;/li&gt;
&lt;li&gt;忽略容器定位，导致图片无法居中或布局错乱&lt;/li&gt;
&lt;li&gt;未设置 &lt;code&gt;overflow: hidden&lt;/code&gt;，图片溢出影响页面布局&lt;/li&gt;
&lt;li&gt;误用 &lt;code&gt;background-image&lt;/code&gt; 和 &lt;code&gt;background-size&lt;/code&gt;，与 img 标签区别不清&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-417ebda0-3f2d-48d3-95ec-ae1838bf39cb"&gt;4. 怎么理解回流跟重绘？什么场景下会触发？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/417ebda0-3f2d-48d3-95ec-ae1838bf39cb"&gt;怎么理解回流跟重绘？什么场景下会触发？&lt;/a&gt;&lt;/p&gt;</description></item><item><title>阿里巴巴-社招-2年 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-62/round-100/</link><pubDate>Mon, 28 Jul 2025 12:14:53 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-62/round-100/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-62/round-99/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-62/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; call、apply和bind、性能优化、浏览器渲染过程、浏览器的缓存机制&lt;/p&gt;
&lt;p&gt;本轮共 10 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-83d197f5cd81"&gt;1. 假设现在有一个老项目需从React 17升级至React 18，你会怎么做&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;先升级 react/react-dom 版本，再更改根渲染方式为 &lt;code&gt;createRoot&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;理解 React 18 并发特性，调整相关组件代码&lt;/li&gt;
&lt;li&gt;确认并升级第三方依赖，保证兼容性&lt;/li&gt;
&lt;li&gt;充分测试，监控性能，平滑迁移&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;理解 React 18 的新特性及其对应用的影响&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;掌握 React 18 升级步骤及兼容性处理&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;了解新版本的渲染机制变化（如并发特性）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;熟悉常见问题排查与升级风险规避&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二参考答案"&gt;二、参考答案&lt;/h2&gt;
&lt;h3 id="21-升级前准备"&gt;2.1 升级前准备&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;阅读官方升级指南&lt;/strong&gt;（React 官方文档提供详尽升级说明）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;检查项目依赖版本&lt;/strong&gt;，确保 React 相关依赖（如 ReactDOM、react-scripts 等）兼容 React 18&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;备份代码及建立测试环境&lt;/strong&gt;，保证升级过程可回滚&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-主要升级步骤"&gt;2.2 主要升级步骤&lt;/h3&gt;
&lt;h4 id="1升级-react-和-reactdom-版本"&gt;1）升级 React 和 ReactDOM 版本&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm install react@18 react-dom@18
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yarn add react@18 react-dom@18
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="2更新根节点渲染方式"&gt;2）更新根节点渲染方式&lt;/h4&gt;
&lt;p&gt;React 18 引入了新的根 API：&lt;code&gt;createRoot&lt;/code&gt;，替代 React 17 的 &lt;code&gt;ReactDOM.render&lt;/code&gt;。&lt;/p&gt;</description></item><item><title>阿里巴巴-社招-2年 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-62/round-99/</link><pubDate>Mon, 28 Jul 2025 12:07:25 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-62/round-99/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-62/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-62/round-100/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; react hooks、WeakMap 和 WeakSet&lt;/p&gt;
&lt;p&gt;本轮共 12 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-fb756a4e7c84"&gt;1. ES6相关属性都用过那些&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;熟悉 ES6 关键新特性和语法糖&lt;/li&gt;
&lt;li&gt;了解特性设计目的，提升代码可维护性和性能&lt;/li&gt;
&lt;li&gt;结合项目场景合理运用，避免滥用带来的副作用&lt;/li&gt;
&lt;li&gt;使用 ESLint 及 Babel 保证兼容性和规范&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;全面了解 ES6（ECMAScript 2015）新特性&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;掌握模块化、变量声明、函数、对象、数组、字符串、类、Promise 等核心特性&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;能说明特性使用场景、优势及与旧版本对比&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;具备在项目中合理应用 ES6 特性的能力&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二参考答案"&gt;二、参考答案&lt;/h2&gt;
&lt;h3 id="11-变量声明"&gt;1.1 变量声明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;let&lt;/code&gt; 和 &lt;code&gt;const&lt;/code&gt;：块级作用域，解决 &lt;code&gt;var&lt;/code&gt; 变量提升和重复声明问题&lt;/li&gt;
&lt;li&gt;推荐使用 &lt;code&gt;const&lt;/code&gt; 声明常量，&lt;code&gt;let&lt;/code&gt; 声明可变变量，避免全局污染&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="12-模板字符串template-literals"&gt;1.2 模板字符串（Template Literals）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用反引号 &lt;code&gt;`&lt;/code&gt; 支持多行字符串和内嵌表达式 &lt;code&gt;${expr}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;替代传统字符串拼接，提升可读性&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="13-解构赋值destructuring"&gt;1.3 解构赋值（Destructuring）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;支持数组和对象解构，简化变量赋值&lt;/li&gt;
&lt;li&gt;常用于函数参数处理、数据提取&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="14-箭头函数arrow-functions"&gt;1.4 箭头函数（Arrow Functions）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;简洁函数表达式，自动绑定 &lt;code&gt;this&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;不可作为构造函数，不绑定 &lt;code&gt;arguments&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;常用于回调和函数简写&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="15-扩展运算符spread和剩余参数rest"&gt;1.5 扩展运算符（Spread）和剩余参数（Rest）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;扩展运算符 &lt;code&gt;...&lt;/code&gt; 用于数组和对象展开&lt;/li&gt;
&lt;li&gt;剩余参数用于函数参数收集&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="16-对象字面量增强"&gt;1.6 对象字面量增强&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;属性简写、方法简写、计算属性名&lt;/li&gt;
&lt;li&gt;支持简洁声明和动态键名&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="17-类class"&gt;1.7 类（Class）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ES6 引入基于原型的语法糖，支持继承、构造函数、静态方法&lt;/li&gt;
&lt;li&gt;提升面向对象编程体验&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="18-promise-和异步编程"&gt;1.8 Promise 和异步编程&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;用于异步流程控制，解决回调地狱&lt;/li&gt;
&lt;li&gt;支持链式调用和错误捕获&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="19-模块module"&gt;1.9 模块（Module）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;import&lt;/code&gt; 和 &lt;code&gt;export&lt;/code&gt; 语法，支持静态分析和按需加载&lt;/li&gt;
&lt;li&gt;替代传统的 CommonJS、AMD 模块规范&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="110-symbol-类型"&gt;1.10 Symbol 类型&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;新增基本类型，表示独一无二的值&lt;/li&gt;
&lt;li&gt;常用于定义对象的私有属性和常量&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="111-set-和-map-数据结构"&gt;1.11 Set 和 Map 数据结构&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Set：无重复元素集合&lt;/li&gt;
&lt;li&gt;Map：键值对集合，键可以是任意类型&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="112-iterator-和-generator"&gt;1.12 Iterator 和 Generator&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;统一遍历接口&lt;/li&gt;
&lt;li&gt;Generator 生成器函数，用于异步流程和惰性计算&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="113-其他"&gt;1.13 其他&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;for...of&lt;/code&gt; 循环：遍历可迭代对象&lt;/li&gt;
&lt;li&gt;默认参数和函数参数尾逗号&lt;/li&gt;
&lt;li&gt;数组新增方法如 &lt;code&gt;Array.from&lt;/code&gt;、&lt;code&gt;find&lt;/code&gt;、&lt;code&gt;findIndex&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="三常见使用场景及优势"&gt;三、常见使用场景及优势&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特性&lt;/th&gt;
&lt;th&gt;使用场景&lt;/th&gt;
&lt;th&gt;优势与改进点&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;let&lt;/code&gt;/&lt;code&gt;const&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;代替 &lt;code&gt;var&lt;/code&gt;，块级作用域变量声明&lt;/td&gt;
&lt;td&gt;避免变量提升和作用域污染&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;模板字符串&lt;/td&gt;
&lt;td&gt;拼接复杂字符串和多行文本&lt;/td&gt;
&lt;td&gt;可读性高，减少错误&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;解构赋值&lt;/td&gt;
&lt;td&gt;参数提取、数组拆包、函数返回值拆分&lt;/td&gt;
&lt;td&gt;代码简洁，语义清晰&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;箭头函数&lt;/td&gt;
&lt;td&gt;回调函数、简化函数定义&lt;/td&gt;
&lt;td&gt;自动绑定 &lt;code&gt;this&lt;/code&gt;，代码更短&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;扩展运算符&lt;/td&gt;
&lt;td&gt;数组合并、对象拷贝&lt;/td&gt;
&lt;td&gt;简化代码，避免手动循环&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Promise&lt;/td&gt;
&lt;td&gt;异步请求、链式调用&lt;/td&gt;
&lt;td&gt;解决回调地狱，增强异步流程可读性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;模块化&lt;/td&gt;
&lt;td&gt;项目拆分、代码复用&lt;/td&gt;
&lt;td&gt;标准化模块，支持静态分析&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Set/Map&lt;/td&gt;
&lt;td&gt;需要高效查找、去重、键值映射的场景&lt;/td&gt;
&lt;td&gt;性能优于传统对象和数组&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="四常见误区或面试陷阱"&gt;四、常见误区或面试陷阱&lt;/h2&gt;
&lt;h4 id="-误区一滥用箭头函数导致-this-绑定错误"&gt;❌ 误区一：滥用箭头函数导致 &lt;code&gt;this&lt;/code&gt; 绑定错误&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;不适合需要动态 &lt;code&gt;this&lt;/code&gt; 的场景（如对象方法）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="-误区二未充分利用解构赋值写出冗长代码"&gt;❌ 误区二：未充分利用解构赋值，写出冗长代码&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;理解解构赋值提升代码清晰度&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="-误区三promise-误用未捕获异常导致异常丢失"&gt;❌ 误区三：Promise 误用未捕获异常，导致异常丢失&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;应正确使用 &lt;code&gt;.catch&lt;/code&gt; 或 &lt;code&gt;try...catch&lt;/code&gt; 包裹 &lt;code&gt;async/await&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-5fadc194d07e"&gt;2. 为什么WeakMap的键必须是对象&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;WeakMap 键必须是对象，因为弱引用机制只能作用于对象&lt;/li&gt;
&lt;li&gt;对基本类型无法进行弱引用，无法参与垃圾回收机制&lt;/li&gt;
&lt;li&gt;WeakMap 设计用于保存对象私有数据，避免内存泄漏&lt;/li&gt;
&lt;li&gt;与普通 Map 区别在于弱引用和不可枚举特性&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点-1"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;理解 WeakMap 的设计初衷和底层实现机制&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;掌握 WeakMap 与普通 Map 的区别&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;了解 JavaScript 垃圾回收机制与弱引用的关系&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;能说明 WeakMap 键限制为对象的技术原因及应用场景&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二参考答案-1"&gt;二、参考答案&lt;/h2&gt;
&lt;h3 id="11-weakmap-的基本概念"&gt;1.1 WeakMap 的基本概念&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;WeakMap 是一种键为对象，值任意的数据结构&lt;/li&gt;
&lt;li&gt;与普通 Map 不同，WeakMap 对键对象的引用是“弱引用”&lt;/li&gt;
&lt;li&gt;当键对象不存在其它引用时，能被垃圾回收器回收，避免内存泄漏&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="12-键必须是对象的原因"&gt;1.2 键必须是对象的原因&lt;/h3&gt;
&lt;h4 id="1弱引用必须指向对象"&gt;1）弱引用必须指向对象&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;JavaScript 的弱引用机制只能对对象类型生效&lt;/li&gt;
&lt;li&gt;基本类型（如字符串、数字）是值类型，无法被弱引用追踪和回收&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2垃圾回收机制要求"&gt;2）垃圾回收机制要求&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;只有对象才存在垃圾回收标记和生命周期管理&lt;/li&gt;
&lt;li&gt;WeakMap 通过弱引用允许键对象在无外部引用时自动回收&lt;/li&gt;
&lt;li&gt;如果允许基本类型作为键，则无法做到弱引用，违背 WeakMap 设计初衷&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3设计意图和使用场景"&gt;3）设计意图和使用场景&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;用于存储与对象相关联的私有数据，避免内存泄漏&lt;/li&gt;
&lt;li&gt;例如框架中保存某个 DOM 节点的元数据，DOM 节点销毁时对应数据自动释放&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="13-weakmap-与-map-的区别"&gt;1.3 WeakMap 与 Map 的区别&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特性&lt;/th&gt;
&lt;th&gt;Map&lt;/th&gt;
&lt;th&gt;WeakMap&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;键类型&lt;/td&gt;
&lt;td&gt;任意类型&lt;/td&gt;
&lt;td&gt;只能是对象&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;是否可枚举&lt;/td&gt;
&lt;td&gt;可遍历所有键值&lt;/td&gt;
&lt;td&gt;不可遍历&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;引用强度&lt;/td&gt;
&lt;td&gt;对键保持强引用，阻止垃圾回收&lt;/td&gt;
&lt;td&gt;对键保持弱引用，不阻止垃圾回收&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;适用场景&lt;/td&gt;
&lt;td&gt;普通键值映射&lt;/td&gt;
&lt;td&gt;关联对象私有数据，自动回收&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="14-常见误区或面试陷阱"&gt;1.4 常见误区或面试陷阱&lt;/h3&gt;
&lt;h4 id="-误区一认为-weakmap-可以用基本类型作为键"&gt;❌ 误区一：认为 WeakMap 可以用基本类型作为键&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;会导致运行时错误，WeakMap 只能接受对象作为键&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="-误区二误用-weakmap-导致内存泄漏"&gt;❌ 误区二：误用 WeakMap 导致内存泄漏&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;忽略 WeakMap 不可遍历特性，误判数据存在与否&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-bf18925ca33f"&gt;3. Map支持哪些非对象键&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Map 支持所有基本类型和对象作为键&lt;/li&gt;
&lt;li&gt;包括字符串、数字、布尔值、Symbol、null、undefined&lt;/li&gt;
&lt;li&gt;与 WeakMap 只能用对象键不同，Map 更灵活&lt;/li&gt;
&lt;li&gt;理解键类型和对应的行为差异，避免键冲突&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点-2"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;理解 JavaScript Map 的键类型及其存储机制&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;掌握 Map 与 WeakMap 键的差异&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;了解基本类型和对象类型作为键的行为和区别&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;能说明非对象键在 Map 中的实际使用场景&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二参考答案-2"&gt;二、参考答案&lt;/h2&gt;
&lt;h3 id="11-map-键的类型支持"&gt;1.1 Map 键的类型支持&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Map 的键可以是任意值，包括基本类型和对象类型&lt;/p&gt;</description></item><item><title>阿里巴巴-社招-1年 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-61/round-98/</link><pubDate>Mon, 28 Jul 2025 11:54:27 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-61/round-98/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-61/round-97/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-61/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; react hooks、性能优化&lt;/p&gt;
&lt;p&gt;本轮共 10 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-8c25c1ddc7f3"&gt;1. 你们项目为什么选Redux而非MobX&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Redux 强调可预测性、单向数据流、纯函数 reducer，适合复杂项目&lt;/li&gt;
&lt;li&gt;丰富的调试工具和社区中间件支持开发效率和可维护性&lt;/li&gt;
&lt;li&gt;MobX 响应式自动追踪，适合快速开发，但隐式依赖增加调试难度&lt;/li&gt;
&lt;li&gt;团队规模和项目复杂度是选择状态管理方案的关键因素&lt;/li&gt;
&lt;li&gt;现代 Redux 已大幅简化，代码冗余感降低&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;是否理解 Redux 和 MobX 两种状态管理库的设计理念与差异&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;是否能结合项目实际需求，论述选择某一方案的合理性&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;是否掌握 Redux 在复杂状态管理中的优势与局限&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;是否能表达对团队协作、维护性和性能的综合考虑&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二参考答案"&gt;二、参考答案&lt;/h2&gt;
&lt;h3 id="11-原理说明"&gt;1.1 原理说明&lt;/h3&gt;
&lt;h4 id="redux"&gt;Redux&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基于 Flux 架构思想，使用单一全局状态树（Store）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;状态只读，通过派发（dispatch）纯函数（Reducer）更新状态&lt;/li&gt;
&lt;li&gt;强调&lt;strong&gt;不可变数据和纯函数&lt;/strong&gt;，方便调试和时间旅行（time-travel debugging）&lt;/li&gt;
&lt;li&gt;侧重于&lt;strong&gt;可预测性和可维护性&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="mobx"&gt;MobX&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;采用响应式编程思想，通过可观察（observable）数据和自动追踪依赖实现状态同步&lt;/li&gt;
&lt;li&gt;支持&lt;strong&gt;隐式状态更新&lt;/strong&gt;，使用更接近传统面向对象编程&lt;/li&gt;
&lt;li&gt;适合快速开发，较少样板代码&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="12-选择-redux-的主要理由"&gt;1.2 选择 Redux 的主要理由&lt;/h3&gt;
&lt;h4 id="1明确的状态流向和可预测性"&gt;1）明确的状态流向和可预测性&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Redux 的单向数据流和纯函数 reducer 让状态变化过程清晰、易追踪&lt;/li&gt;
&lt;li&gt;在多人协作中，可以方便定位状态更新的具体原因，减少调试成本&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2强大的开发者工具支持"&gt;2）强大的开发者工具支持&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Redux DevTools 提供时间旅行、快照对比、action 日志等，极大提升调试体验&lt;/li&gt;
&lt;li&gt;有丰富的中间件生态（如 redux-thunk、redux-saga），便于处理复杂异步逻辑&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3适合大型复杂项目"&gt;3）适合大型复杂项目&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;状态结构复杂时，Redux 更便于组织和维护，模块化拆分 reducer 明确职责&lt;/li&gt;
&lt;li&gt;明确的规范和社区共识，团队成员易于理解和统一编码风格&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4可测试性强"&gt;4）可测试性强&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Reducer 是纯函数，易于单元测试，保证业务逻辑可靠&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="13-不选-mobx-的考虑"&gt;1.3 不选 MobX 的考虑&lt;/h3&gt;
&lt;h4 id="1隐式依赖难以追踪"&gt;1）隐式依赖难以追踪&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;MobX 的自动依赖追踪机制带来状态变化的隐式性，可能导致调试困难&lt;/li&gt;
&lt;li&gt;团队成员对响应式原理不熟悉时，维护成本升高&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2状态变化不够可预测"&gt;2）状态变化不够可预测&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;MobX 允许任意地方修改状态，可能出现难以预料的副作用&lt;/li&gt;
&lt;li&gt;不利于实现严格的状态管理和权限控制&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3社区规范和中大型项目生态"&gt;3）社区规范和中大型项目生态&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Redux 生态成熟且社区规范丰富&lt;/li&gt;
&lt;li&gt;MobX 在某些复杂场景下不够透明，团队风险较大&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="14-常见误区或面试陷阱"&gt;1.4 常见误区或面试陷阱&lt;/h3&gt;
&lt;h4 id="-误区一认为-mobx-性能一定优于-redux"&gt;❌ 误区一：认为 MobX 性能一定优于 Redux&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;实际性能差异因项目而异，合理使用 Redux 也能实现优秀性能&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="-误区二redux-代码一定繁琐难写"&gt;❌ 误区二：Redux 代码一定繁琐难写&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;现代 Redux 工具（如 Redux Toolkit）极大简化开发体验，减少样板代码&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="-误区三认为-mobx-是魔法不需要学习状态管理原理"&gt;❌ 误区三：认为 MobX 是“魔法”，不需要学习状态管理原理&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;响应式原理本身也需要深入理解，否则容易导致维护难题&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-9bdd9b86d8fe"&gt;2. 项目中提到“首屏加载优化1.5秒”，具体如何实现&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;首屏加载优化核心在于减少首屏资源体积和请求数量&lt;/li&gt;
&lt;li&gt;结合 SSR/SSG 预渲染，缩短白屏时间&lt;/li&gt;
&lt;li&gt;动态拆分代码，懒加载非关键资源&lt;/li&gt;
&lt;li&gt;充分利用浏览器缓存和 CDN&lt;/li&gt;
&lt;li&gt;监控指标涵盖 FCP、TTI，持续迭代优化&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点-1"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;理解首屏加载的定义及关键性能指标（如 FCP、TTI）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;掌握多种前端性能优化手段，涵盖资源、网络、渲染等层面&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;能结合具体技术和业务场景，说明优化实施细节&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;理解优化过程中的权衡与监控方法&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二参考答案-1"&gt;二、参考答案&lt;/h2&gt;
&lt;h3 id="11-首屏加载的概念与性能指标"&gt;1.1 首屏加载的概念与性能指标&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;首屏加载&lt;/strong&gt;：用户打开页面到看到页面主要内容（首屏内容）完整渲染的时间&lt;/p&gt;</description></item><item><title>阿里巴巴-社招-1年 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-61/round-97/</link><pubDate>Mon, 28 Jul 2025 11:47:07 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-61/round-97/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-61/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-61/round-98/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; Webpack与Vite、事件循环、跨域通信&lt;/p&gt;
&lt;p&gt;本轮共 16 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-80619f2d22f7"&gt;1. 项目中遇到了哪些技术难题，是如何解决的&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;STAR法则&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-8eccdcf5f029"&gt;2. 在解决这些技术难题的过程中，有没有尝试过其他解决方案&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-97e442c116a5"&gt;3. 项目中是如何进行团队协作的&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-ff0b3dbd2346"&gt;4. 在团队协作中，有没有遇到过沟通不畅或者意见不合的情况？是如何解决的&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-78a32c9021bc"&gt;5. webpack 的 plugin 了解吗&lt;/h2&gt;
&lt;h3 id="题目要点-4"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Plugin 是 Webpack 扩展机制，贯穿构建全过程&lt;/li&gt;
&lt;li&gt;核心结构是类 + &lt;code&gt;apply(compiler)&lt;/code&gt; + Tapable 钩子&lt;/li&gt;
&lt;li&gt;常见生命周期钩子：&lt;code&gt;compile&lt;/code&gt;、&lt;code&gt;emit&lt;/code&gt;、&lt;code&gt;done&lt;/code&gt; 等&lt;/li&gt;
&lt;li&gt;可用于注入变量、分析构建、生成资源、操作产物等&lt;/li&gt;
&lt;li&gt;熟悉 compiler 与 compilation 的概念&lt;/li&gt;
&lt;li&gt;可结合实际项目经验举例说明插件使用场景&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;是否理解 Plugin 在 Webpack 中的作用和工作机制&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Plugin 是 Webpack 最核心的扩展机制之一&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;是否掌握编写 Plugin 的基本方法和生命周期&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;了解 &lt;code&gt;compiler&lt;/code&gt;、&lt;code&gt;compilation&lt;/code&gt;、钩子（hooks）等概念&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年 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-60/round-96/</link><pubDate>Mon, 28 Jul 2025 06:07:53 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-60/round-96/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-60/round-95/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-60/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 10 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-a53118303d0b"&gt;1. 介绍一下你觉的最有成就感的项目&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-ca872c95e3b9"&gt;2. 项目为什么选择Lerna+Yarn Workspaces构建Monorepo&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Monorepo 实现多包统一管理，提升代码复用和维护效率&lt;/li&gt;
&lt;li&gt;Lerna 管理版本发布、变更检测、脚本执行&lt;/li&gt;
&lt;li&gt;Yarn Workspaces 优化依赖安装，支持本地包软链接&lt;/li&gt;
&lt;li&gt;两者结合，实现高效、便捷的 Monorepo 构建和维护&lt;/li&gt;
&lt;li&gt;适合大型复杂项目及多包同步开发场景&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;理解 Monorepo 的概念及优势&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多个相关包/模块统一管理、版本控制、发布流程等&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;掌握 Lerna 与 Yarn Workspaces 的功能和配合方式&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&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;
&lt;ul&gt;
&lt;li&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;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二参考答案"&gt;二、参考答案&lt;/h2&gt;
&lt;h3 id="11-原理说明"&gt;1.1 原理说明&lt;/h3&gt;
&lt;h4 id="monorepo-概念"&gt;Monorepo 概念&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;将多个相关的项目包（packages）放在同一代码仓库中统一管理&lt;/li&gt;
&lt;li&gt;便于代码复用、版本统一、跨包协调&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="lerna-功能"&gt;Lerna 功能&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;管理 Monorepo 中多个包的版本发布和依赖关系&lt;/li&gt;
&lt;li&gt;支持基于 Git 的变更检测，自动决定哪些包需要发布&lt;/li&gt;
&lt;li&gt;脚本集中执行，提升跨包开发效率&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="yarn-workspaces-功能"&gt;Yarn Workspaces 功能&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;优化依赖安装，自动将多个包的依赖扁平化安装，避免重复依赖&lt;/li&gt;
&lt;li&gt;支持包之间的本地软链接，方便跨包开发调试&lt;/li&gt;
&lt;li&gt;减少 &lt;code&gt;node_modules&lt;/code&gt; 大小，提升安装速度&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="lerna--yarn-workspaces-配合优势"&gt;Lerna + Yarn Workspaces 配合优势&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Lerna 专注版本和发布管理&lt;/li&gt;
&lt;li&gt;Yarn Workspaces 专注依赖管理和安装优化&lt;/li&gt;
&lt;li&gt;组合使用，实现 Monorepo 的高效管理和性能提升&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="12-核心用法--选择理由"&gt;1.2 核心用法 + 选择理由&lt;/h3&gt;
&lt;h4 id="选择-lerna--yarn-workspaces-的具体理由"&gt;选择 Lerna + Yarn Workspaces 的具体理由&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;依赖管理高效&lt;/strong&gt;：Yarn Workspaces 扁平化依赖树，减少冗余，提高安装速度，节省磁盘空间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;版本发布便捷&lt;/strong&gt;：Lerna 支持自动检测改动包，实现增量发布，减少发布成本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨包开发友好&lt;/strong&gt;：Workspaces 实现包间软链接，调试时无需发布即可实时联动&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;统一管理多个包&lt;/strong&gt;：代码结构清晰，版本一致性好，避免包版本冲突&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;社区成熟稳定&lt;/strong&gt;：Lerna 和 Yarn 是成熟开源项目，生态完善，文档丰富&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="使用场景举例"&gt;使用场景举例&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;大型前端项目拆分为多个业务组件包&lt;/li&gt;
&lt;li&gt;同时管理多个相关 npm 包，需同步发布和升级&lt;/li&gt;
&lt;li&gt;需要提升 CI/CD 流程效率和开发体验&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="13-常见误区或面试陷阱"&gt;1.3 常见误区或面试陷阱&lt;/h3&gt;
&lt;h4 id="-误区一认为-lerna-可以独立完成所有-monorepo-管理工作"&gt;❌ 误区一：认为 Lerna 可以独立完成所有 Monorepo 管理工作&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;实际 Lerna 本身不管理依赖安装，需配合 Workspaces 或 npm/yarn 其他特性&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="-误区二忽视依赖扁平化带来的版本冲突风险"&gt;❌ 误区二：忽视依赖扁平化带来的版本冲突风险&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;需要合理规划依赖版本，避免冲突和不兼容&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="-误区三monorepo-不适合所有项目盲目迁移可能增加复杂度"&gt;❌ 误区三：Monorepo 不适合所有项目，盲目迁移可能增加复杂度&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;适用项目规模和团队协作需求需评估清楚&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-f330b14e4e91"&gt;3. 如何解决子包间的循环依赖问题&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;循环依赖会导致加载异常和维护困难&lt;/li&gt;
&lt;li&gt;抽取公共模块拆分依赖，消除环路&lt;/li&gt;
&lt;li&gt;使用接口抽象和依赖注入解耦&lt;/li&gt;
&lt;li&gt;动态导入延迟加载，规避同步循环&lt;/li&gt;
&lt;li&gt;设计单向依赖，保持依赖关系 DAG&lt;/li&gt;
&lt;li&gt;配合工具检测和团队规范防范&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一考察点-1"&gt;一、考察点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;理解循环依赖的概念及危害&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>滴滴-社招-5年 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-60/round-95/</link><pubDate>Mon, 28 Jul 2025 06:01:19 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-60/round-95/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-60/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-60/round-96/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 作用域链与闭包、全方位解读this、函数柯里化、原型链与继承、DOM操作、深拷贝/浅拷贝、call、apply和bind&lt;/p&gt;
&lt;p&gt;本轮共 24 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-a5330a58-5be0-4f4f-8394-43392311ddaa"&gt;1. 深拷贝浅拷贝有什么区别？怎么实现深拷贝？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/a5330a58-5be0-4f4f-8394-43392311ddaa"&gt;深拷贝浅拷贝有什么区别？怎么实现深拷贝？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;JS数据类型分别基本数据类型和引用数据类型，基本数据类型保存的是值，引用类型保存的是引用地址(this指针)。&lt;/p&gt;
&lt;p&gt;浅拷贝共用一个引用地址，深拷贝会创建新的内存地址。&lt;/p&gt;
&lt;h4 id="浅拷贝方法"&gt;浅拷贝方法&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;直接对象复制&lt;/li&gt;
&lt;li&gt;Object.assign&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="深拷贝"&gt;深拷贝&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;JSON.stringify转为字符串再JSON.parse&lt;/li&gt;
&lt;li&gt;深度递归遍历&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一数据类型存储"&gt;一、数据类型存储&lt;/h2&gt;
&lt;p&gt;前面文章我们讲到，&lt;code&gt;JavaScript&lt;/code&gt;中存在两大数据类型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基本类型&lt;/li&gt;
&lt;li&gt;引用类型&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;基本类型数据保存在在栈内存中&lt;/p&gt;
&lt;p&gt;引用类型数据保存在堆内存中，引用数据类型的变量是一个指向堆内存中实际对象的引用，存在栈中&lt;/p&gt;
&lt;h2 id="二浅拷贝"&gt;二、浅拷贝&lt;/h2&gt;
&lt;p&gt;浅拷贝，指的是创建新的数据，这个数据有着原始数据属性值的一份精确拷贝&lt;/p&gt;
&lt;p&gt;如果属性是基本类型，拷贝的就是基本类型的值。如果属性是引用类型，拷贝的就是内存地址&lt;/p&gt;
&lt;p&gt;即浅拷贝是拷贝一层，深层次的引用类型则共享内存地址&lt;/p&gt;
&lt;p&gt;下面简单实现一个浅拷贝&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;shallowClone&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;newObj&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;hasOwnProperty&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;)){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;newObj&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;newObj&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在&lt;code&gt;JavaScript&lt;/code&gt;中，存在浅拷贝的现象有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Object.assign&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Array.prototype.slice()&lt;/code&gt;, &lt;code&gt;Array.prototype.concat()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用拓展运算符实现的复制&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="objectassign"&gt;Object.assign&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;age&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;18&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;nature&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;smart&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;good&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;names&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name1&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;fx&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name2&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;xka&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;love&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;fx is a great girl&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;newObj&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Object.&lt;span style="color:#a6e22e"&gt;assign&lt;/span&gt;({}, &lt;span style="color:#a6e22e"&gt;obj&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="slice"&gt;slice()&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;One&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Two&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Three&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;slice&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;love&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;Two&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;love&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="concat"&gt;concat()&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;One&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Two&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Three&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;concat&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;love&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;Two&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;love&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="拓展运算符"&gt;拓展运算符&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;One&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Two&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Three&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [...&lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;love&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArr&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;Two&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;fxArrs&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// [&amp;#34;One&amp;#34;, &amp;#34;love&amp;#34;, &amp;#34;Three&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="三深拷贝"&gt;三、深拷贝&lt;/h2&gt;
&lt;p&gt;深拷贝开辟一个新的栈，两个对象的属性完全相同，但是对应两个不同的地址，修改一个对象的属性，不会改变另一个对象的属性&lt;/p&gt;</description></item><item><title>滴滴-社招-3年 · 第 1 轮 · 三面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-59/round-94/</link><pubDate>Mon, 28 Jul 2025 05:39:29 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-59/round-94/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-59/round-93/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-59/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 浏览器渲染过程、浏览器的缓存机制、浏览器的垃圾回收机制、浏览器的存储机制&lt;/p&gt;
&lt;p&gt;本轮共 10 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-98da1f5bbe94"&gt;1. 在你做过的项目中，最值得说的是哪一个&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;STAR法则&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;基于自己简历挖掘亮点项目&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-1a73c841fa54"&gt;2. 在该项目中，你主要负责哪些模块的开发？这些模块的技术难点是什么&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-5b176ffb091f"&gt;3. 请举例说明在项目中，你是如何通过技术手段解决业务问题的&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-0fdfb5bf5b6b"&gt;4. 在项目中，你采取了哪些性能优化措施？效果如何&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;可以参考 【性能优化】相关知识点，在面经最后&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-3fa86026797b"&gt;5. 在项目中遇到的最大技术挑战是什么？你是如何解决的&lt;/h2&gt;
&lt;h3 id="题目要点-4"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-e967bea0e873"&gt;6. 在项目中，你是如何与团队成员协作的？请分享一个具体的协作案例&lt;/h2&gt;
&lt;h3 id="题目要点-5"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-fcdcf89f3234"&gt;7. 在团队协作中，遇到过哪些冲突？你是如何解决的&lt;/h2&gt;
&lt;h3 id="题目要点-6"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-a4d9118359ba"&gt;8. 在项目中，你是如何进行项目管理和进度保障的&lt;/h2&gt;
&lt;h3 id="题目要点-7"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-723e5a28df32"&gt;9. 你的职业规划是什么样的？短期和长期目标分别是什么&lt;/h2&gt;
&lt;h3 id="题目要点-8"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-265243f3e08c"&gt;10. 给定两个以字符串形式表示的非负整数 num1 和 num2，返回 num1 和 num2 的乘积，它们的乘积也表示为字符串形式&lt;/h2&gt;
&lt;p&gt;注意：不能使用任何内置的 BigInteger 库或直接将输入转换为整数&lt;/p&gt;
&lt;p&gt;示例 1:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;输入&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;num1&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;2&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;num2&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;输出&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;6&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;示例 2:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输入: num1 = &amp;#34;123&amp;#34;, num2 = &amp;#34;456&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;输出: &amp;#34;56088&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="题目要点-9"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;模拟多位数乘法的过程，按位乘积+进位合并&lt;/li&gt;
&lt;li&gt;用数组保存每一位的计算结果，最终拼接成字符串&lt;/li&gt;
&lt;li&gt;注意字符串转数字、进位处理、前导 0 清除等细节&lt;/li&gt;
&lt;li&gt;不允许使用 BigInt、Number 等将字符串转换为数字&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;考察对字符串操作的熟练程度和大数模拟乘法逻辑实现能力&lt;/li&gt;
&lt;li&gt;掌握多位数相乘的数学原理，模拟竖式乘法&lt;/li&gt;
&lt;li&gt;考察对数组操作、进位处理、边界情况的处理能力&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h4 id="一原理说明"&gt;一、原理说明&lt;/h4&gt;
&lt;p&gt;由于不能直接将字符串转为整数，需模拟“&lt;strong&gt;逐位乘法 + 进位处理&lt;/strong&gt;”，如同手动计算多位乘法（竖式）一样：&lt;/p&gt;</description></item><item><title>滴滴-社招-3年 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-59/round-93/</link><pubDate>Mon, 28 Jul 2025 03:27:35 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-59/round-93/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-59/round-92/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-59/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-59/round-94/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; react hooks、列表和key、高阶组件、性能优化、react 渲染机制、React函数组件更新、react 组件设计模式、全方位解读this、类型判断&lt;/p&gt;
&lt;p&gt;本轮共 14 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-26e1dc3b0dcc"&gt;1. 项目中遇到的最大技术挑战是什么&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-69995578c3fa"&gt;2. 项目整体架构是什么样的&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-6df78bf9f0d6"&gt;3. 在项目中，你们是如何进行前端代码的模块化和组件化的&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;模块化：代码拆分成独立功能模块，使用 ES Module 标准&lt;br&gt;&lt;/li&gt;
&lt;li&gt;组件化：UI拆分成可复用组件，封装结构、样式和逻辑&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合构建工具支持模块管理和代码分割&lt;br&gt;&lt;/li&gt;
&lt;li&gt;组件通信通过 props、事件、状态管理实现&lt;br&gt;&lt;/li&gt;
&lt;li&gt;合理设计文件结构和规范，提升维护性和扩展性&lt;br&gt;&lt;/li&gt;
&lt;li&gt;注意职责单一、样式隔离和性能优化&lt;br&gt;&lt;/li&gt;
&lt;li&gt;防止模块和组件划分不合理导致管理混乱&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;理解模块化和组件化的概念及其在前端开发中的重要性&lt;br&gt;&lt;/li&gt;
&lt;li&gt;熟悉常见的模块化规范（如 CommonJS、ES Module）及其区别&lt;br&gt;&lt;/li&gt;
&lt;li&gt;掌握组件化设计思想和实现方式，尤其是在主流框架中的实践&lt;br&gt;&lt;/li&gt;
&lt;li&gt;能结合项目需求合理组织代码结构，提高复用性和维护性&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h4 id="一原理说明"&gt;一、原理说明&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;模块化&lt;/strong&gt; 指将代码拆分成独立的、功能明确的模块，每个模块有自己的作用域和接口，避免全局污染，提高代码可维护性。&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;常见规范包括：&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CommonJS&lt;/strong&gt;（Node.js环境，使用 &lt;code&gt;require&lt;/code&gt; 和 &lt;code&gt;module.exports&lt;/code&gt;）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AMD&lt;/strong&gt;（异步模块定义，适用于浏览器异步加载）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ES Module（ESM）&lt;/strong&gt;（现代标准，使用 &lt;code&gt;import&lt;/code&gt; 和 &lt;code&gt;export&lt;/code&gt;，支持静态分析）&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组件化&lt;/strong&gt; 是模块化的进一步细化，专注于 UI 层面，将界面拆分成独立且可复用的组件，封装逻辑、样式和结构。&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;组件通常包含状态管理、事件处理、生命周期管理等，方便组合和维护。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;主流框架如 Vue、React、Angular 都鼓励基于组件开发。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="二项目中模块化和组件化的实践"&gt;二、项目中模块化和组件化的实践&lt;/h4&gt;
&lt;h5 id="1-模块化管理"&gt;1. &lt;strong&gt;模块化管理&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;项目采用 &lt;strong&gt;ES Module&lt;/strong&gt; 作为标准模块规范，利用 &lt;code&gt;import&lt;/code&gt; 和 &lt;code&gt;export&lt;/code&gt; 进行模块间依赖管理。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;通过合理拆分功能模块（如工具库、接口服务、状态管理、业务逻辑）形成清晰的依赖关系，便于维护和测试。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;使用构建工具（Webpack、Vite）支持模块打包和代码分割，提高加载效率。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;配合 &lt;code&gt;alias&lt;/code&gt; 和路径管理，保持模块引用简洁，提升开发体验。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="2-组件化设计"&gt;2. &lt;strong&gt;组件化设计&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;界面层面，拆分成粒度合适的可复用组件，满足单一职责原则。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;采用状态提升、属性传递和事件回调机制实现组件间通信。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;使用组件库（如 Element UI、Ant Design）或自研组件库提升开发效率。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合样式模块化（CSS Modules、Scoped CSS、CSS-in-JS）实现样式隔离，防止样式冲突。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;组件支持配置化和插槽机制，提高灵活性和扩展性。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="3-代码组织结构"&gt;3. &lt;strong&gt;代码组织结构&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;按业务域或功能划分文件夹，模块和组件分层清晰，便于定位和扩展。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;统一入口导出，方便模块聚合和复用。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;编写完善的文档和规范，确保团队成员对模块和组件使用方式达成共识。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="4-优势与价值"&gt;4. &lt;strong&gt;优势与价值&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;提高代码复用率，减少重复开发和维护成本。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;降低耦合度，提升系统可扩展性。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;加快开发节奏，方便多人协作。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;利用现代构建工具实现性能优化。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="三常见误区与注意点"&gt;三、常见误区与注意点&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;模块划分过细或过粗&lt;/strong&gt; 导致管理困难或代码臃肿，需根据项目复杂度合理拆分。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组件职责不明确&lt;/strong&gt;，混合业务逻辑和表现层，影响复用和测试。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;忽视样式隔离，导致样式污染和冲突。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;组件间通信设计不合理，导致状态管理混乱。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;忽略模块和组件的性能优化，如避免无意义的重新渲染和重复加载。&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-43824f1001b4"&gt;4. 项目中做过哪些性能优化方面的工作&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;资源按需加载与代码拆分减少首屏加载时间&lt;br&gt;&lt;/li&gt;
&lt;li&gt;静态资源压缩、合并和 CDN 加速&lt;br&gt;&lt;/li&gt;
&lt;li&gt;图片优化与懒加载&lt;br&gt;&lt;/li&gt;
&lt;li&gt;减少 DOM 操作，合理使用虚拟 DOM&lt;br&gt;&lt;/li&gt;
&lt;li&gt;JS 任务拆分，使用防抖节流和 Web Worker&lt;br&gt;&lt;/li&gt;
&lt;li&gt;接口合并、缓存和 HTTP/2 多路复用&lt;br&gt;&lt;/li&gt;
&lt;li&gt;持续性能监控与数据驱动优化&lt;br&gt;&lt;/li&gt;
&lt;li&gt;避免过度拆分和缓存策略失误&lt;br&gt;&lt;/li&gt;
&lt;li&gt;注重整体性能和用户设备多样性&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点-1"&gt;考察点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;理解前端性能优化的核心目标与常见瓶颈&lt;br&gt;&lt;/li&gt;
&lt;li&gt;掌握多种性能优化手段及其适用场景&lt;br&gt;&lt;/li&gt;
&lt;li&gt;能结合具体项目场景，分析问题并提出有效优化策略&lt;br&gt;&lt;/li&gt;
&lt;li&gt;熟悉常用性能监控和评估工具，验证优化效果&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="参考答案-1"&gt;参考答案&lt;/h3&gt;
&lt;h4 id="一原理说明-1"&gt;一、原理说明&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;前端性能优化的核心目标是提升页面加载速度、响应速度和交互流畅度，从而改善用户体验，降低用户流失。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;性能瓶颈通常来源于资源加载慢、渲染阻塞、JavaScript 执行耗时、内存泄漏和网络请求频繁等。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;现代性能优化涉及多个层面，包括网络层、资源层、渲染层和代码执行层。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;性能优化不仅是技术问题，更涉及合理架构设计和业务合理拆分。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="二项目中的具体优化实践"&gt;二、项目中的具体优化实践&lt;/h4&gt;
&lt;h5 id="1-资源加载优化"&gt;1. &lt;strong&gt;资源加载优化&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;采用代码拆分（Code Splitting）和按需加载，避免一次性加载大量无关代码，缩短首屏加载时间。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;使用 CDN 分发静态资源，提升资源下载速度。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;资源压缩和合并（如压缩 JS/CSS，合并小文件减少请求数量）。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;图片优化（WebP 格式替代、图片懒加载、合理尺寸裁剪）。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;利用浏览器缓存策略（Cache-Control、Service Worker）减少重复请求。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="2-渲染性能优化"&gt;2. &lt;strong&gt;渲染性能优化&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;减少 DOM 操作次数，合并多次修改，避免触发频繁回流和重绘。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;使用虚拟 DOM 和虚拟列表技术优化大量数据渲染。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;CSS 动画尽量使用 GPU 加速属性（如 transform、opacity）。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;避免长任务阻塞主线程，合理拆分 JS 任务，防止界面卡顿。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="3-javascript-执行优化"&gt;3. &lt;strong&gt;JavaScript 执行优化&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;减少不必要的计算和事件绑定，防抖节流常用来优化频繁触发的事件。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;使用 Web Worker 将计算密集型任务移至后台线程，避免主线程阻塞。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;利用 Tree Shaking 去除未使用代码，减小包体积。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;预编译和缓存机制提升运行效率。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="4-网络请求优化"&gt;4. &lt;strong&gt;网络请求优化&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;接口合并，减少请求次数。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;接口缓存，避免重复请求同一数据。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;接口压缩与批量请求。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;使用 HTTP/2 多路复用，提升请求并发性能。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="5-性能监控与持续优化"&gt;5. &lt;strong&gt;性能监控与持续优化&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;集成性能监控工具（如 Lighthouse、Chrome DevTools Performance、RUM 埋点等）。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;通过埋点监控首屏时间、接口响应时间、动画帧率等关键指标。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;根据监控数据持续跟踪性能瓶颈，迭代优化。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="三常见误区与注意点-1"&gt;三、常见误区与注意点&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;只注重单一优化手段，忽视整体性能提升策略。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;盲目过度拆分导致请求过多，反而影响性能。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;缓存设置不合理，导致用户看到过期内容。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;不关注性能监控数据，缺乏闭环改进。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;忽视用户设备差异，优化方案不够适配低端设备。&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-bfa8d18a2415"&gt;5. 在移动端开发中，你们是如何处理不同设备的适配问题的&lt;/h2&gt;
&lt;h3 id="题目要点-4"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;了解并使用 viewport 设置布局基础&lt;/li&gt;
&lt;li&gt;灵活组合 rem/vw/flex/media query 等单位和布局方案&lt;/li&gt;
&lt;li&gt;使用 postcss 工具链统一适配流程&lt;/li&gt;
&lt;li&gt;考虑高DPR设备图像清晰度适配&lt;/li&gt;
&lt;li&gt;针对横屏、Pad 等极端设备考虑额外样式方案&lt;/li&gt;
&lt;li&gt;注重兼容性测试，处理浏览器差异&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点-2"&gt;考察点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;是否了解常见的移动端适配方案及原理&lt;br&gt;&lt;/li&gt;
&lt;li&gt;是否能结合业务场景选择合理的适配策略&lt;br&gt;&lt;/li&gt;
&lt;li&gt;是否关注兼容性、用户体验和性能平衡&lt;br&gt;&lt;/li&gt;
&lt;li&gt;是否能系统性总结适配技术手段的优缺点&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="参考答案-2"&gt;参考答案&lt;/h3&gt;
&lt;h4 id="一适配问题的来源"&gt;一、适配问题的来源&lt;/h4&gt;
&lt;p&gt;移动端设备种类繁多，存在如下适配挑战：&lt;/p&gt;</description></item><item><title>滴滴-社招-3年 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-59/round-92/</link><pubDate>Mon, 28 Jul 2025 03:15:10 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-59/round-92/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-59/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-59/round-93/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; z-index、布局技巧、Flexbox、优化性能、react hooks、浏览器渲染过程、浏览器的缓存机制、浏览器的垃圾回收机制&lt;/p&gt;
&lt;p&gt;本轮共 11 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-920e774f1156"&gt;1. 讲一下可视化搭建平台中魔方组件的设计与实现难点&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-6898841d5b91"&gt;2. 如何解决多模块叠加时的z-index管理问题&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;z-index&lt;/code&gt; 基于层叠上下文，简单数字不能保证全局一致性&lt;/li&gt;
&lt;li&gt;建立统一 z-index 管理系统（如 Z_INDEX_MAP）是可维护的关键&lt;/li&gt;
&lt;li&gt;模块内部创建局部 stacking context，避免全局冲突&lt;/li&gt;
&lt;li&gt;动态模块如拖拽、浮层应使用自动 z-index 分配策略&lt;/li&gt;
&lt;li&gt;避免滥用 z-index，建议结合 portal、绝对定位和容器设计实现可控叠加&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;面试官想了解你在复杂 UI 组件系统中的图层管理策略&lt;/li&gt;
&lt;li&gt;探查你对 &lt;code&gt;z-index&lt;/code&gt; 的工作机制、层级上下文（stacking context）的理解&lt;/li&gt;
&lt;li&gt;是否具备系统化组织多模块图层关系的经验，能避免冲突和错乱&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h4 id="一z-index-背后机制与问题本质"&gt;一、z-index 背后机制与问题本质&lt;/h4&gt;
&lt;h5 id="1-z-index-的作用机制"&gt;1. z-index 的作用机制&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;z-index&lt;/code&gt; 定义元素在“同一层叠上下文（stacking context）”中的前后顺序&lt;/li&gt;
&lt;li&gt;层叠上下文由具有特定属性的元素（如&lt;code&gt;position: relative/absolute/fixed&lt;/code&gt; + &lt;code&gt;z-index&lt;/code&gt;）创建&lt;/li&gt;
&lt;li&gt;每个层叠上下文是独立的，只影响自身子元素的层叠关系&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="2-可视化搭建系统的典型挑战"&gt;2. 可视化搭建系统的典型挑战&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;多模块（如弹窗、悬浮面板、组件拖拽层、选中态）频繁叠加，若统一用裸 &lt;code&gt;z-index&lt;/code&gt; 数字管理，非常容易：
&lt;ul&gt;
&lt;li&gt;维护混乱&lt;/li&gt;
&lt;li&gt;层级冲突（某组件盖住了弹窗）&lt;/li&gt;
&lt;li&gt;模块互相影响，难以解耦&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="二系统化的-z-index-管理方案"&gt;二、系统化的 z-index 管理方案&lt;/h4&gt;
&lt;h5 id="1-建立统一的层级管理规范z-index-map"&gt;1. 建立统一的层级管理规范（z-index Map）&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;在系统中定义一套统一的 z-index 枚举表，例如：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Z_INDEX_MAP&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;base&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;component&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;10&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;floatingPanel&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;100&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;modal&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;1000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;tooltip&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;2000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dragLayer&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;3000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;globalMask&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;9999&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;所有模块只能从该映射中引用 z-index，禁止硬编码数字，避免冲突&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="2-模块隔离建立明确的层叠上下文边界"&gt;2. 模块隔离，建立明确的层叠上下文边界&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;position: relative/absolute&lt;/code&gt; + &lt;code&gt;z-index&lt;/code&gt;，每个模块在其容器内控制层级&lt;/li&gt;
&lt;li&gt;避免所有元素在一个全局层叠上下文中争夺 z-index&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="3-动态-z-index-分配机制如拖拽时临时置顶"&gt;3. 动态 z-index 分配机制（如拖拽时临时置顶）&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;为拖拽、临时弹出等模块动态分配最高层级，例如：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dynamicZIndex&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Z_INDEX_MAP&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;dragLayer&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getNextZIndex() {&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dynamicZIndex&lt;/span&gt;&lt;span style="color:#f92672"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;使多个拖拽元素在交互中可动态置顶，不影响整体秩序&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="4-可视化调试工具辅助"&gt;4. 可视化调试工具辅助&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;引入 DevTool 插件或内嵌 z-index 层级可视化辅助组件，用不同颜色或 label 显示当前模块层级，便于调试&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="三z-index-冲突的实际案例与应对策略"&gt;三、z-index 冲突的实际案例与应对策略&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：浮层 A（z-index: 200）被浮层 B（z-index: 100）遮挡&lt;/p&gt;</description></item><item><title>美团-本地商业-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-58/round-91/</link><pubDate>Mon, 28 Jul 2025 02:44:46 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-58/round-91/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-58/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要聚焦于前端中高级技术深度和实际项目经验的考察。重点涵盖了&lt;strong&gt;前端工程化与性能优化&lt;/strong&gt;（如Webpack优化、首屏加载、HTTP缓存、CDN等）、&lt;strong&gt;JavaScript运行机制与高级特性&lt;/strong&gt;（事件循环、宏微任务、Vue 2/3响应式原理、数组操作等），以及&lt;strong&gt;Web安全与系统设计&lt;/strong&gt;（如XSS防御、HTTPS原理、持久化登录系统设计）。此外，还深入探讨了&lt;strong&gt;跨平台开发&lt;/strong&gt;（Uni-App/Taro原理及选型）和&lt;strong&gt;微前端架构&lt;/strong&gt;的关键考量点。面试官旨在通过这些题目，全面评估候选人在复杂业务场景下的技术选型、问题分析与解决能力，以及对前端底层原理和安全实践的掌握程度。&lt;/p&gt;
&lt;p&gt;本轮共 18 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-29dfa5962bad"&gt;1. 简单介绍你的技术背景和项目经验。&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;说明&lt;/strong&gt;：该题是典型的主观型问题，没有唯一的标准答案。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;考察目标&lt;/strong&gt;：面试官主要考察答题者的自我认知、表达能力、技术广度与深度、以及对自身项目经验的复盘和总结能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;答题结构建议&lt;/strong&gt;：建议围绕&amp;quot;我是谁&amp;quot;、&amp;ldquo;我会什么&amp;rdquo;、&amp;ldquo;我做过什么&amp;quot;三个核心点展开，并结合具体项目经验突出个人优势和亮点。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;很高兴能有机会介绍一下我的技术背景和项目经验。我叫[你的名字]，毕业于[你的学校和专业]，在校期间我对前端技术产生了浓厚兴趣，系统学习了HTML、CSS和JavaScript基础。毕业后，我加入了[你的公司名称]，至今有[X]年的前端开发经验。&lt;/p&gt;
&lt;p&gt;在职业生涯中，我主要专注于[你的主要技术方向，如Web应用开发、跨平台开发、前端性能优化等]。我熟练掌握Vue.js（或React）框架及其生态系统，包括状态管理（Vuex/Pinia或Redux/MobX）、路由管理（Vue Router或React Router）和构建工具（Webpack/Vite）。同时，我对Node.js也有一定了解，能够进行一些基础的后端协作或独立开发前端工具。&lt;/p&gt;
&lt;p&gt;在[公司名称]，我参与了[项目名称，可以是核心项目或最有代表性的项目]的开发工作。这个项目是一个[简单描述项目类型，如中后台管理系统、电商平台、数据可视化平台]。我在其中主要负责[具体职责，如负责XX模块的开发、实现YY功能、进行ZZ性能优化]等。&lt;/p&gt;
&lt;p&gt;举个例子，在[具体项目或模块]中，我们遇到了[一个具体的技术挑战，如首屏加载慢、组件复用性差、跨端适配问题]。为了解决这个问题，我当时[你采取的具体措施和方案，如引入了Webpack的SplitChunksPlugin进行代码分割、设计了通用组件库并结合Slots/Props实现高复用、使用了Uni-App的条件编译处理平台差异]。最终，[达到的效果和数据，如首屏加载时间从5s优化到1s、组件复用率提升了30%、成功支持了微信和支付宝小程序]。这次经历让我深刻理解了[你的收获和思考，如前端性能优化的重要性、组件化设计的价值、跨平台开发的权衡点]。&lt;/p&gt;
&lt;p&gt;我不仅关注代码实现，也注重项目的整体质量和用户体验，善于发现问题并积极寻求解决方案。我也乐于学习和探索新技术，保持对前端前沿的关注。谢谢。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-5415ff84e537"&gt;2. 项目中遇到的性能优化挑战是什么？具体如何解决的？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;说明&lt;/strong&gt;：该题是典型的主观型问题，没有唯一的标准答案。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;考察目标&lt;/strong&gt;：面试官主要考察答题者在实际项目中发现、分析和解决性能问题的能力，包括对性能指标的理解、优化策略的掌握以及实际操作经验和复盘能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;答题结构建议&lt;/strong&gt;：建议按照&amp;quot;背景/挑战 -&amp;gt; 如何分析 -&amp;gt; 具体优化措施 -&amp;gt; 优化效果与思考&amp;quot;的结构展开，突出解决问题的思路和细节。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在[你的项目名称，如电商H5页面/管理后台]项目中，我们曾面临一个比较明显的性能挑战，主要体现在**[具体场景，如首页首屏加载时间过长，达到了5秒以上；或者某个复杂列表页在滚动时出现卡顿]**。这严重影响了用户体验，尤其是在移动网络环境下，导致用户跳出率较高。&lt;/p&gt;
&lt;p&gt;为了定位问题，我们首先借助了&lt;strong&gt;Chrome DevTools (Lighthouse、Performance面板)&lt;/strong&gt; 进行分析。通过对加载瀑布流、CPU使用率和内存占用进行观察，我们发现主要瓶颈在于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;[具体瓶颈1，如：主JS包体积过大，导致解析和执行时间长]&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[具体瓶颈2，如：图片资源未优化，大量高清大图直接加载，占用带宽]&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[具体瓶颈3，如：复杂组件渲染耗时，导致回流重绘频繁，引起卡顿]&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;针对这些问题，我们采取了以下具体的优化措施：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;代码分割与按需加载&lt;/strong&gt;：针对主JS包体积过大的问题，我们引入了&lt;strong&gt;Webpack的&lt;code&gt;SplitChunksPlugin&lt;/code&gt;&lt;/strong&gt;，结合&lt;strong&gt;路由懒加载&lt;/strong&gt;（或组件懒加载）。将不同路由页面的代码和不常用的第三方库进行拆分，例如：&lt;code&gt;component: () =&amp;gt; import('./views/OrderDetail.vue')&lt;/code&gt;。这样，用户首次访问时只需要加载当前页面的核心代码，显著减少了首屏JS的下载和解析量。&lt;/p&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;：对项目中的所有图片资源进行了统一的无损压缩处理，并推荐设计师使用WebP格式的图片。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;懒加载&lt;/strong&gt;：对于首屏之外的图片，我们实现了&lt;strong&gt;图片懒加载&lt;/strong&gt;，只有当图片进入用户视口时才进行加载，避免了不必要的资源请求。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CDN加速&lt;/strong&gt;：将静态图片资源部署到CDN，利用CDN的边缘节点分发，减少了网络延迟。&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;strong&gt;虚拟列表&lt;/strong&gt;技术，只渲染可视区域内的DOM节点，减少了DOM数量，大幅提升了滚动流畅度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;避免不必要的渲染&lt;/strong&gt;：在Vue/React组件中，合理使用&lt;code&gt;v-if/v-show&lt;/code&gt;、&lt;code&gt;keep-alive&lt;/code&gt;、&lt;code&gt;React.memo&lt;/code&gt;/&lt;code&gt;PureComponent&lt;/code&gt;等，结合&lt;code&gt;shouldComponentUpdate&lt;/code&gt;（React）或计算属性/监听器（Vue）来避免组件的重复渲染。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;减少回流重绘&lt;/strong&gt;：优化了DOM操作，减少了频繁读写布局属性，例如将多个样式修改合并为一次操作，或者使用CSS的&lt;code&gt;transform&lt;/code&gt;代替&lt;code&gt;left/top&lt;/code&gt;进行动画。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;经过这些优化，我们的**[项目名称]首页首屏加载时间成功从5秒降低到了2秒以内**（或更具体的数据），用户反馈页面的流畅度也有了显著提升，这对业务转化率带来了积极影响。这次优化经历让我对前端性能优化有了更系统和深入的理解，也认识到性能优化是一个持续的过程，需要贯穿于项目的整个生命周期中。我们会定期进行性能监控和分析，确保用户体验。谢谢。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-40e693893a81"&gt;3. 如果让你主导一个跨平台电商项目，如何选择技术栈？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;技术栈选型能力&lt;/strong&gt;：面试官想考察候选人是否具备从宏观层面规划项目技术栈的能力，包括对主流前端框架、跨平台技术以及相关生态的了解。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对跨平台开发的深入理解&lt;/strong&gt;：考察候选人是否清楚跨平台开发的核心痛点（如性能、体验、API兼容性），并能提出针对性的解决方案。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;系统设计和权衡能力&lt;/strong&gt;：评估候选人能否在性能、开发效率、维护成本、团队能力、业务需求等多个维度之间进行权衡和取舍。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对电商领域特点的认知&lt;/strong&gt;：了解候选人是否对电商项目特有的需求（如商品展示、购物车、支付、大促活动）有前瞻性思考，并能在技术选型中体现。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="11-原理说明"&gt;1.1 原理说明&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;跨平台电商项目&lt;/strong&gt;通常是指一个产品需要同时在Web（H5）、微信小程序、支付宝小程序、App（iOS/Android）等多个终端运行，并且希望尽可能复用代码，降低开发和维护成本。技术栈选择是一个复杂的决策过程，需要综合考虑项目的&lt;strong&gt;业务需求、性能要求、开发效率、团队技术栈、维护成本以及社区生态&lt;/strong&gt;等多方面因素。&lt;/p&gt;</description></item><item><title>滴滴-社招-2年 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-57/round-90/</link><pubDate>Mon, 28 Jul 2025 02:28:18 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-57/round-90/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-57/round-89/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-57/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; WebWorker、Canvas 和 SVG&lt;/p&gt;
&lt;p&gt;本轮共 10 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-ee1b2317997f"&gt;1. 自我介绍，项目介绍&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-5057de803a73"&gt;2. 为什么选择Vue3+TS而非React&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-d894c5540f67"&gt;3. 你们用的是什么脚手架，脚手架的基本原理了解么&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;脚手架是提升工程效率、统一规范的工具&lt;/li&gt;
&lt;li&gt;底层通过 Node.js 实现文件复制、模板注入、命令执行&lt;/li&gt;
&lt;li&gt;常用工具：Vue CLI、CRA、Vite、自研 CLI（基于 Plop、Yeoman）&lt;/li&gt;
&lt;li&gt;企业通常自研脚手架实现快速初始化、统一配置和组件生成&lt;/li&gt;
&lt;li&gt;掌握核心原理（模板渲染、交互、文件操作）有助于二次开发&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;面试官希望了解你是否具备工程化思维&lt;br&gt;&lt;/li&gt;
&lt;li&gt;是否熟悉当前项目所用的脚手架工具及其底层实现原理&lt;br&gt;&lt;/li&gt;
&lt;li&gt;是否理解脚手架在项目初始化、规范约定、自动化等方面的作用&lt;br&gt;&lt;/li&gt;
&lt;li&gt;是否具备定制或维护脚手架的能力&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h4 id="一常用脚手架工具及我们团队的选择"&gt;一、常用脚手架工具及我们团队的选择&lt;/h4&gt;
&lt;p&gt;我们项目主要使用的是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vue 项目&lt;/strong&gt;：使用 &lt;code&gt;@vue/cli&lt;/code&gt;、&lt;code&gt;vite&lt;/code&gt; 或公司自研的内部模板系统&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;React 项目&lt;/strong&gt;：早期使用 &lt;code&gt;create-react-app&lt;/code&gt;，后续迁移为 &lt;code&gt;Vite + 自定义模板&lt;/code&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自研脚手架&lt;/strong&gt;：基于 &lt;code&gt;Plop.js&lt;/code&gt;、&lt;code&gt;Yeoman&lt;/code&gt;、&lt;code&gt;Commander&lt;/code&gt; 或 &lt;code&gt;create-*&lt;/code&gt; 实现，通过 Node.js 实现项目初始化、目录结构生成、依赖安装、git 初始化等功能&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="二脚手架的核心功能"&gt;二、脚手架的核心功能&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;初始化项目结构&lt;/strong&gt;（生成项目目录和基础文件）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注入标准化配置&lt;/strong&gt;（eslint、prettier、commitlint、husky、tsconfig等）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动安装依赖&lt;/strong&gt;（npm/yarn/pnpm install）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;选择模板和功能模块&lt;/strong&gt;（用户选择功能特性，动态生成对应模块）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义交互式命令行（CLI）&lt;/strong&gt;（使用 inquirer 等库实现配置选择）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生成代码片段/组件&lt;/strong&gt;（如 &lt;code&gt;plop generate component&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="三脚手架的实现原理"&gt;三、脚手架的实现原理&lt;/h4&gt;
&lt;p&gt;脚手架本质上是基于 Node.js 脚本，通过命令行交互完成初始化和代码生成，主要原理包括：&lt;/p&gt;</description></item><item><title>滴滴-社招-2年 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-57/round-89/</link><pubDate>Mon, 28 Jul 2025 02:20:14 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-57/round-89/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-57/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-57/round-90/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 生命周期、Vue3 API、响应式原理、v-for、事件循环&lt;/p&gt;
&lt;p&gt;本轮共 21 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-2245b14e802d"&gt;1. 为什么使用 &lt;header&gt; 而非 &lt;div class="header"&gt;&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;是HTML5语义化标签，明确头部区域含义&lt;br&gt;&lt;/li&gt;
&lt;li&gt;语义化标签有助于SEO和辅助技术识别&lt;br&gt;&lt;/li&gt;
&lt;li&gt;提高代码可读性和维护性，减少依赖类名赋予语义&lt;br&gt;&lt;/li&gt;
&lt;li&gt;推荐优先使用语义标签代替无语义的&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;+类名组合&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;理解HTML语义化标签的重要性及作用&lt;br&gt;&lt;/li&gt;
&lt;li&gt;掌握语义化标签对SEO和无障碍的影响&lt;br&gt;&lt;/li&gt;
&lt;li&gt;了解语义化标签在开发协作和维护中的优势&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h4 id="一语义化标签的核心概念"&gt;一、语义化标签的核心概念&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;HTML5引入了如 &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt; 等语义化标签，明确表达页面结构和内容含义&lt;br&gt;&lt;/li&gt;
&lt;li&gt;语义化标签比普通 &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; 搭配类名更具意义，利于浏览器、搜索引擎、辅助设备等理解页面&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="二使用-header-的优势"&gt;二、使用 &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt; 的优势&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;明确语义&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;表示页面或区块的头部区域，包含标题、导航等信息&lt;br&gt;&lt;/li&gt;
&lt;li&gt;比 &lt;code&gt;&amp;lt;div class=&amp;quot;header&amp;quot;&amp;gt;&lt;/code&gt; 直接通过类名赋予语义更标准、易识别&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;提升可访问性&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;语义化标签被屏幕阅读器等辅助技术识别，帮助视障用户理解页面结构&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;使辅助设备快速定位页眉内容，提升用户体验&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SEO友好&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;搜索引擎利用语义标签准确抓取页面结构和重点内容&lt;br&gt;&lt;/li&gt;
&lt;li&gt;语义标签利于内容分类和权重判断，可能提高搜索排名&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;代码规范与维护&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;语义化标签增强代码自解释性，方便团队协作和代码维护&lt;br&gt;&lt;/li&gt;
&lt;li&gt;减少对类名、ID等非结构性属性的依赖，代码更简洁清晰&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="三使用场景对比"&gt;三、使用场景对比&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;适合定义页面或区块的头部区域&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;header&amp;quot;&amp;gt;&lt;/code&gt;仅作为普通容器，没有内置语义&lt;br&gt;&lt;/li&gt;
&lt;li&gt;两者均可通过CSS样式控制外观，但语义化标签具备结构语义&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-247f9e07b586"&gt;2. SEO和可访问性有何影响&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;语义化标签提升SEO抓取效率和内容权重分配&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结构化页面内容，增强搜索引擎对重点信息的识别能力&lt;br&gt;&lt;/li&gt;
&lt;li&gt;语义标签是辅助技术识别页面结构的关键，提升可访问性&lt;br&gt;&lt;/li&gt;
&lt;li&gt;有助于残障用户快速导航和理解页面&lt;br&gt;&lt;/li&gt;
&lt;li&gt;符合无障碍标准，降低法律和合规风险&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点-1"&gt;考察点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;理解SEO（搜索引擎优化）对网页结构和内容的重要性&lt;br&gt;&lt;/li&gt;
&lt;li&gt;掌握语义化标签对搜索引擎抓取的正面影响&lt;br&gt;&lt;/li&gt;
&lt;li&gt;了解可访问性（Accessibility）概念及辅助技术如何利用语义标签&lt;br&gt;&lt;/li&gt;
&lt;li&gt;能说明如何通过结构优化提升用户体验及业务价值&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="参考答案-1"&gt;参考答案&lt;/h3&gt;
&lt;h4 id="一seo影响"&gt;一、SEO影响&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;语义化标签助力搜索引擎理解页面结构&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;</description></item><item><title>滴滴-社招-1年 · 第 1 轮 · 三面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-56/round-88/</link><pubDate>Mon, 28 Jul 2025 02:03:06 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-56/round-88/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-56/round-87/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-56/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 15 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-fcde3fad466c"&gt;1. 介绍一下实习项目的业务背景（这块说了蛮久）&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-e13e2c7222bb"&gt;2. 假如你是一个项目的负责人，面对一个新需求你会如何判断以及决策&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;业务价值与需求背景明确 / 技术可行性与风险评估 / 资源与时间合理估算&lt;br&gt;&lt;/li&gt;
&lt;li&gt;多方案设计与优劣比较 / 风险预判及缓解措施&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合团队和业务做权衡决策 / 明确执行计划与责任 / 持续跟进与复盘优化&lt;br&gt;&lt;/li&gt;
&lt;li&gt;沟通协调能力和风险管理能力是关键&lt;br&gt;&lt;/li&gt;
&lt;li&gt;决策既考虑短期交付，也兼顾长期维护和团队承受能力&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;评估候选人对需求分析和项目管理流程的理解&lt;br&gt;&lt;/li&gt;
&lt;li&gt;探查其在技术可行性、资源评估、风险管理等方面的判断能力&lt;br&gt;&lt;/li&gt;
&lt;li&gt;了解候选人如何在多方利益、时间与质量之间做权衡决策&lt;br&gt;&lt;/li&gt;
&lt;li&gt;关注其沟通协调和方案落地的思路&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h4 id="一需求理解与评估"&gt;一、需求理解与评估&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;明确需求背景和目标&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;充分沟通业务方，理解需求的业务价值、核心目标和痛点&lt;br&gt;&lt;/li&gt;
&lt;li&gt;判断该需求是新增功能、优化还是技术债清理&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;技术可行性分析&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;评估现有系统架构、技术栈对该需求的支持程度&lt;br&gt;&lt;/li&gt;
&lt;li&gt;识别技术难点和潜在风险，如性能、安全、兼容性等问题&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;资源与时间评估&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;估算开发、测试、上线所需的人力、时间和成本&lt;br&gt;&lt;/li&gt;
&lt;li&gt;考虑团队现有工作负载，排期合理性&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="二方案设计与风险控制"&gt;二、方案设计与风险控制&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;设计多套实现方案&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;比较不同方案的优劣，如技术复杂度、扩展性、维护成本&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合业务优先级和技术条件选择最优方案&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;风险预判与缓解&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;识别潜在风险点，设计应对措施（如技术预研、灰度发布）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;规划阶段性验收，快速反馈，减少偏差&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="三决策与执行"&gt;三、决策与执行&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;结合业务战略和团队实际作出决策&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;权衡需求价值与资源限制，明确是否优先推动或延期&lt;br&gt;&lt;/li&gt;
&lt;li&gt;与产品、设计、测试等多方协作，达成共识&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;推动方案落地&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;制定详细开发计划，分解任务，明确负责人和时间节点&lt;br&gt;&lt;/li&gt;
&lt;li&gt;跟踪进展，快速解决过程中出现的问题&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;复盘与优化&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;需求完成后组织复盘，总结经验，优化流程&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-c5e77b182a65"&gt;3. 功能上线后如何判断这个功能上线前后的影响和优化有多少呢&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;明确功能目标和关键评估指标 / 多渠道数据采集与监控&lt;br&gt;&lt;/li&gt;
&lt;li&gt;功能上线前后指标对比 / A/B测试验证功能效果&lt;br&gt;&lt;/li&gt;
&lt;li&gt;用户反馈与定性分析辅助判断&lt;br&gt;&lt;/li&gt;
&lt;li&gt;定位影响原因，制定优化方案&lt;br&gt;&lt;/li&gt;
&lt;li&gt;持续监控、复盘和迭代形成闭环&lt;br&gt;&lt;/li&gt;
&lt;li&gt;兼顾数据驱动与用户体验&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点-1"&gt;考察点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;理解功能上线后效果评估的重要性及方法&lt;br&gt;&lt;/li&gt;
&lt;li&gt;掌握多维度数据监控和指标分析手段&lt;br&gt;&lt;/li&gt;
&lt;li&gt;能结合业务目标设计合理的评估方案&lt;br&gt;&lt;/li&gt;
&lt;li&gt;理解A/B测试、用户行为分析、性能监控等工具的应用&lt;br&gt;&lt;/li&gt;
&lt;li&gt;关注持续优化与反馈闭环&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="参考答案-1"&gt;参考答案&lt;/h3&gt;
&lt;h4 id="一明确评估目标和关键指标kpi"&gt;一、明确评估目标和关键指标（KPI）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;结合业务目标确定功能上线的核心衡量指标，如用户活跃度、转化率、留存率、错误率等&lt;br&gt;&lt;/li&gt;
&lt;li&gt;设计具体可量化的指标体系，保证评估具备科学性和针对性&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="二数据采集与监控"&gt;二、数据采集与监控&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;利用埋点、日志采集用户行为数据，覆盖点击、浏览、交互等关键操作&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合前端性能监控（如首屏时间、接口响应时间）与错误监控（JS报错、接口失败）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;设置告警机制，实时监测异常情况&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="三功能上线前后的对比分析"&gt;三、功能上线前后的对比分析&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;历史对比&lt;/strong&gt;：将上线前后的关键指标进行趋势对比，分析变化幅度和方向&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;同类用户对比&lt;/strong&gt;：如果可行，采用A/B测试，控制组与实验组对比，确保因果关系明确&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用户反馈收集&lt;/strong&gt;：结合用户调查、客服反馈等定性信息辅助判断&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="四分析影响及优化空间"&gt;四、分析影响及优化空间&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;识别指标波动背后的具体原因，如性能瓶颈、交互体验问题等&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合用户反馈发现潜在需求或痛点&lt;br&gt;&lt;/li&gt;
&lt;li&gt;制定针对性优化方案，优先解决影响最大的瓶颈&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="五持续迭代与复盘"&gt;五、持续迭代与复盘&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;将监控和分析形成常态化流程，确保功能优化闭环&lt;br&gt;&lt;/li&gt;
&lt;li&gt;定期复盘评估结果，总结经验教训&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合业务目标调整优化策略，持续提升功能效果&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-bf34aa50fb92"&gt;4. 有去了解过用户反馈最多的问题或者诉求最强的问题是什么吗&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;</description></item><item><title>滴滴-社招-1年 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-56/round-87/</link><pubDate>Mon, 28 Jul 2025 01:53:33 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-56/round-87/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-56/round-86/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-56/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-56/round-88/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 浏览器渲染过程&lt;/p&gt;
&lt;p&gt;本轮共 11 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-038c546ee8da"&gt;1. 简单介绍一下你上一段实习中觉得做的比较好的项目&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-139b60ddec82"&gt;2. 想知道你们的项目大概是什么样的结构，你在开发的时候会从什么地方下手&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;理解项目结构和流程是高效开发的基础&lt;br&gt;&lt;/li&gt;
&lt;li&gt;先从入口和路由入手，理清全局数据和功能模块&lt;br&gt;&lt;/li&gt;
&lt;li&gt;注重调试和测试，减少开发盲点&lt;br&gt;&lt;/li&gt;
&lt;li&gt;合理利用团队协作工具提升开发效率&lt;br&gt;&lt;/li&gt;
&lt;li&gt;持续学习和总结，快速适应项目迭代&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;理解典型前端项目的整体结构及模块划分&lt;br&gt;&lt;/li&gt;
&lt;li&gt;掌握从项目启动到开发流程的系统思路&lt;br&gt;&lt;/li&gt;
&lt;li&gt;能清晰描述如何快速定位入口及关键代码区域&lt;br&gt;&lt;/li&gt;
&lt;li&gt;展示合理的开发习惯与代码管理思路&lt;br&gt;&lt;/li&gt;
&lt;li&gt;体现对团队协作和版本控制的认知&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h4 id="一典型前端项目结构说明"&gt;一、典型前端项目结构说明&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;目录结构&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;src/&lt;/code&gt;：项目源码，包含页面（Page）、组件（Component）、样式（Styles）、工具函数（Utils）、状态管理（Store）等&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;public/&lt;/code&gt; 或 &lt;code&gt;static/&lt;/code&gt;：静态资源，如图片、字体、favicon 等&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;build/&lt;/code&gt; 或 &lt;code&gt;scripts/&lt;/code&gt;：构建相关脚本和配置&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;config/&lt;/code&gt;：环境配置文件，如开发、测试、生产环境参数&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tests/&lt;/code&gt;：单元测试和集成测试代码&lt;br&gt;&lt;/li&gt;
&lt;li&gt;配置文件如 &lt;code&gt;package.json&lt;/code&gt;, &lt;code&gt;.babelrc&lt;/code&gt;, &lt;code&gt;webpack.config.js&lt;/code&gt; 或 &lt;code&gt;vite.config.js&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;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;入口文件（如 &lt;code&gt;src/main.js&lt;/code&gt;、&lt;code&gt;src/index.js&lt;/code&gt;）负责挂载应用&lt;br&gt;&lt;/li&gt;
&lt;li&gt;路由配置文件定义页面导航&lt;br&gt;&lt;/li&gt;
&lt;li&gt;状态管理文件（如 Vuex、Redux）管理全局状态&lt;br&gt;&lt;/li&gt;
&lt;li&gt;公共组件库及工具函数模块&lt;br&gt;&lt;/li&gt;
&lt;li&gt;API 接口封装层，统一管理后端请求&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h4 id="二开发时的切入点及流程"&gt;二、开发时的切入点及流程&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;理解业务和需求&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;先明确当前任务目标和业务逻辑&lt;br&gt;&lt;/li&gt;
&lt;li&gt;查阅需求文档、设计稿和接口文档&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;定位项目入口&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从入口文件入手，理清项目启动流程&lt;br&gt;&lt;/li&gt;
&lt;li&gt;理解路由配置，确定目标页面&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;代码结构梳理&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;理解页面层与组件层的关系&lt;br&gt;&lt;/li&gt;
&lt;li&gt;查找关键组件和功能模块的实现&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;查看状态管理和数据流&lt;/strong&gt;&lt;br&gt;&lt;/p&gt;</description></item><item><title>滴滴-社招-1年 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-56/round-86/</link><pubDate>Mon, 28 Jul 2025 01:45:16 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-56/round-86/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-56/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-56/round-87/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 响应式原理、Webpack与Vite、https、浏览器渲染过程、浏览器的缓存机制&lt;/p&gt;
&lt;p&gt;本轮共 19 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-1760562f8190"&gt;1. 介绍一下简历中的组件库项目&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-dc78e2f9-568a-445d-988c-594092179848"&gt;2. 聊聊 vite 和 webpack 的区别&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/dc78e2f9-568a-445d-988c-594092179848"&gt;聊聊 vite 和 webpack 的区别&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Webpack&lt;/strong&gt;：成熟的模块打包工具，功能强大但配置复杂，适合需要高度定制和复杂构建需求的项目。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vite&lt;/strong&gt;：现代化的开发工具，提供快速的开发体验和优化的生产构建，适合追求开发效率和现代化特性的项目。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;选择 Vite 还是 Webpack 取决于项目的需求和开发团队的偏好。如果重点是开发体验和快速反馈，Vite 是一个很好的选择。如果需要高度定制化和广泛的插件支持，Webpack 可能更适合。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;Vite 和 Webpack 都是前端打包工具，它们的作用类似，但实现方式和使用方法有所不同。以下是它们之间的一些区别：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;构建速度&lt;/strong&gt;：Vite 的构建速度比 Webpack 更快，因为 Vite 在开发环境下使用了浏览器原生的 ES 模块加载，而不是像 Webpack 一样使用打包后的文件进行模块加载。在 Vite 中，每个模块都可以独立地进行编译和缓存，这意味着它只需要重新编译修改过的模块，而不是整个应用程序。这使得 Vite 开发起来更加高效。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;配置复杂度&lt;/strong&gt;：Vite 的配置相对更简单，因为它无需进行大量的配置，只需指定一些基本的选项就可以开始开发。Webpack 的配置更加复杂，需要针对具体项目进行不同的配置，且需要理解各种插件、Loader 等概念。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;生态环境&lt;/strong&gt;：Webpack 的生态环境更加成熟，在社区中拥有广泛的支持和丰富的插件库。而 Vite 尚处于发展阶段，尽管其已经获得了很多关注，但其生态系统仍然不太完善。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;功能特性&lt;/strong&gt;：Webpack 是一个功能更加全面的打包工具，支持各种 Loader 和插件，可以处理多种类型的文件和资源。而 Vite 的设计初衷是专注于开发环境下的快速构建，因此其对一些高级特性的支持相对较少。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;综上所述，Vite 更适合用于开发环境下的快速构建，而 Webpack 则更适合用于生产环境下的复杂应用程序的打包处理。选择使用哪种工具需要根据具体项目需求进行评估。&lt;/p&gt;</description></item><item><title>京东-物流-秋招 · 第 1 轮 · 第一轮</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-55/round-84/</link><pubDate>Sun, 27 Jul 2025 15:38:59 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-55/round-84/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-55/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-55/round-85/"&gt;第 2 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 比较简单，主要考察一些前端基础知识。&lt;/p&gt;
&lt;p&gt;本轮共 21 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-f23da9a1e66b"&gt;1. 请你简单介绍一下自己，你研究生期间学了哪些课程？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;计算机专业研究生，系统学习了相关理论课程，对前端技术有浓厚兴趣并有实践经验。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;本科学习计算机科学与技术专业，研究生阶段继续深入学习相关领域知识。研究生期间的核心课程包括高级数据结构与算法分析、分布式系统、软件架构设计、人工智能原理、计算机图形学、高级数据库系统等。同时选修了前端开发相关的课程，如Web技术与应用、用户界面设计等。在学习过程中，对前端技术产生了浓厚兴趣，通过自学掌握了React、Vue等主流框架，并在多个课程项目中实践应用。研究方向偏向Web技术和用户体验，毕业论文也是围绕前端性能优化展开的研究。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-63d61ea69e66"&gt;2. 在之前参与的项目里，你主要担任什么职责，都负责了哪些模块的开发呀？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;主要通过课程项目、实验室项目和实习积累经验，担任前端开发角色，涉及多种常见功能模块。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;主要参与过学校的课程项目、实验室项目以及一段实习经历。在课程项目中，通常担任前端开发的主要负责人，负责整体页面架构设计和核心功能实现。具体开发过在线学习平台的用户界面、数据可视化展示模块、以及实时聊天功能。在实验室项目中，参与开发了一个科研数据管理系统，主要负责数据录入界面、图表展示组件和用户权限管理前端部分。实习期间，在导师指导下参与了公司内部管理系统的开发，负责表单处理、文件上传和基础的增删改查功能。虽然项目规模不算很大，但通过这些实践对前端开发的完整流程有了较好的理解。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-a7d3a7ebf4fb"&gt;3. HTML5 相较于之前的版本有哪些新特性？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;语义化标签、原生多媒体支持、Canvas绘图、增强表单、Web存储、丰富的API等新特性。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;HTML5相比之前版本引入了很多重要特性。语义化标签是最显著的改进，新增了header、nav、main、article、section、aside、footer等标签，让页面结构更清晰，也有利于SEO优化。多媒体支持方面，audio和video标签可以直接嵌入音视频内容，不再依赖Flash等插件。Canvas元素提供了强大的2D绘图能力，可以用JavaScript动态绘制图形和动画。表单功能得到增强，新增了email、url、date、range等输入类型，以及内置的表单验证功能。Web存储API包括localStorage和sessionStorage，提供了比cookie更好的本地存储方案。还有地理位置API、拖拽API、Web Workers等，为Web应用提供了更丰富的功能支持。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-401fcfdeaad6"&gt;4. 浏览器缓存这块，你是怎么理解的？&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;性能优化机制，通过HTTP头部控制，能减少网络请求但需要合理配置避免更新问题。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;浏览器缓存是Web性能优化的重要机制，通过在本地存储已请求的资源来减少网络请求，提升页面加载速度。在学习过程中了解到，缓存主要通过HTTP协议的相关头部来控制。当浏览器首次请求资源时，服务器会返回资源内容以及缓存相关的响应头，浏览器根据这些头部信息决定是否缓存资源以及缓存多长时间。再次请求相同资源时，浏览器会先检查本地缓存，如果缓存有效就直接使用，否则向服务器发起请求。这个机制在减少服务器负载、节省带宽、提升用户体验方面都有重要作用。在实际项目中也遇到过缓存导致的问题，比如更新代码后用户看不到最新内容。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-b745ed31e9e0"&gt;5. 浏览器缓存主要有哪些类型？&lt;/h2&gt;
&lt;h3 id="题目要点-4"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;HTTP缓存（强缓存、协商缓存）、内存缓存、磁盘缓存、Service Worker缓存等多层次缓存机制。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;浏览器缓存可以分为几个层次。HTTP缓存是最主要的类型，包括强缓存和协商缓存两种机制。强缓存通过Cache-Control和Expires头部设置过期时间，在有效期内直接使用本地缓存。协商缓存则通过ETag和Last-Modified与服务器确认资源是否有更新。除了HTTP缓存，还有内存缓存和磁盘缓存的区别，内存缓存速度快但容量小，磁盘缓存容量大但速度相对较慢。Service Worker缓存是比较新的技术，可以通过编程方式控制缓存策略，支持离线应用。另外还有DNS缓存、CDN缓存等，虽然不在浏览器内部，但也是整个缓存体系的组成部分。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-ebecd58cb4a6"&gt;6. 你有没有遇到过因为浏览器缓存带来的问题？比如，用户没有获取到最新的资源这种情况，你是怎么解决的？&lt;/h2&gt;
&lt;h3 id="题目要点-5"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;通过版本号、时间戳、文件hash等方式解决缓存更新问题，构建工具可以自动化处理。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在做课程项目和实习期间确实遇到过这类问题。最典型的情况是修改了CSS或JavaScript文件后，浏览器仍然加载旧版本的文件，导致页面显示异常或功能不正常。刚开始遇到这种问题时比较困惑，后来学习了解到是缓存机制导致的。解决方法主要有几种：最简单的是在开发阶段使用浏览器的强制刷新功能，或者在开发者工具中禁用缓存。对于生产环境，学会了在文件名后添加版本号或时间戳参数来强制更新，比如style.css?v=1.0.1。后来了解到webpack等构建工具可以自动为文件生成hash值，这样文件内容改变时文件名也会改变，从而绕过缓存。这个问题让我深刻理解了缓存机制的重要性和复杂性。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-853dc4839edf"&gt;7. 说说 sessionStorage 和 localStorage 的区别&lt;/h2&gt;
&lt;h3 id="题目要点-6"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;主要区别在生命周期和作用域，sessionStorage会话级，localStorage持久化且可跨页面共享。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;这两个都是HTML5提供的Web存储API，在项目中都有使用过。&lt;/p&gt;
&lt;p&gt;最主要的区别是生命周期不同：sessionStorage只在当前浏览器标签页的会话期间有效，关闭标签页后数据就会被清除；而localStorage的数据会持久保存在用户设备上，除非主动删除或者达到存储限制。&lt;/p&gt;
&lt;p&gt;作用域方面也不同，sessionStorage的数据只能在当前标签页内访问，不同标签页之间是隔离的；localStorage则可以在同一域名下的所有页面间共享数据。&lt;/p&gt;
&lt;p&gt;在实际使用中，sessionStorage适合存储临时的会话相关数据，比如表单的临时保存；localStorage更适合存储用户偏好设置、购物车内容等需要跨会话保持的信息。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-b0d84ff50371"&gt;8. 除了它们的存储大小区别外，还有哪些不同？&lt;/h2&gt;
&lt;h3 id="题目要点-7"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;事件机制、安全特性、使用场景和数据共享能力等方面存在差异。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;除了生命周期差异，还有一些其他区别。数据共享机制上，localStorage支持storage事件，当其他页面修改localStorage数据时，当前页面可以监听到这个变化，这在多标签页应用中很有用；而sessionStorage不支持这种跨页面的事件通知。安全性方面，sessionStorage由于其会话特性，数据泄露的风险相对较小。在浏览器兼容性上，两者的支持程度基本一致，都是HTML5的特性。使用场景也有明显区别：sessionStorage常用于单页面应用的状态管理、表单数据的临时保存等；localStorage则用于用户设置、主题偏好、离线数据缓存等需要持久化的场景。在移动端开发中，还需要考虑存储空间限制和清理策略。&lt;/p&gt;</description></item><item><title>字节-社招-6年（3-1） · 第 1 轮 · 交叉面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-54/round-83/</link><pubDate>Sun, 27 Jul 2025 12:21:05 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-54/round-83/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-54/round-82/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-54/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 3 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-bd90d23570ab"&gt;1. 如何理解业务与技术的关系，如何将业务需求转化为技术方案&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;解释业务与技术的相互依赖和促进关系&lt;br&gt;&lt;/li&gt;
&lt;li&gt;梳理需求理解到方案设计的完整流程&lt;br&gt;&lt;/li&gt;
&lt;li&gt;强调沟通、验证和持续优化的重要性&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合案例体现实际落地思路&lt;br&gt;&lt;/li&gt;
&lt;li&gt;警示脱节风险，体现系统思考&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-理解业务与技术的相辅相成关系"&gt;● 理解业务与技术的相辅相成关系&lt;br&gt;&lt;/h4&gt;
&lt;h4 id="-掌握业务需求分析和技术方案设计流程"&gt;● 掌握业务需求分析和技术方案设计流程&lt;br&gt;&lt;/h4&gt;
&lt;h4 id="-能将抽象业务目标拆解为具体技术实现路径"&gt;● 能将抽象业务目标拆解为具体技术实现路径&lt;br&gt;&lt;/h4&gt;
&lt;h4 id="-体现跨部门沟通和协作能力"&gt;● 体现跨部门沟通和协作能力&lt;br&gt;&lt;/h4&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h3 id="一业务与技术的关系理解"&gt;一、业务与技术的关系理解&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;相辅相成&lt;/strong&gt;：业务是技术的驱动力，技术是业务落地的支撑。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;业务需求为核心&lt;/strong&gt;：技术方案应围绕业务目标服务，解决实际问题，促进业务增长。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术赋能业务创新&lt;/strong&gt;：通过技术提升效率、优化体验、开拓新业务模式。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动态迭代&lt;/strong&gt;：业务变化带来技术调整，技术创新反哺业务拓展，形成良性循环。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="二将业务需求转化为技术方案的步骤"&gt;二、将业务需求转化为技术方案的步骤&lt;/h3&gt;
&lt;h4 id="1-需求理解与梳理"&gt;1. 需求理解与梳理&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;深入沟通，明确业务背景、目标及关键痛点。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;梳理业务流程，明确输入输出及核心功能点。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;识别非功能性需求，如性能、安全、可扩展性。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-方案调研与评估"&gt;2. 方案调研与评估&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;研究现有技术栈及解决方案的适用性。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;评估技术选型的可行性、成本、风险与团队能力。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合业务优先级确定技术方案核心方向。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-技术方案设计"&gt;3. 技术方案设计&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;架构设计：整体技术架构、模块划分、接口设计。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;技术细节：选用框架、数据库设计、接口协议、安全机制等。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;性能与安全：设计性能优化点和安全防护方案。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-方案验证与沟通"&gt;4. 方案验证与沟通&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;原型或PoC验证方案可行性。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;向业务团队和相关部门说明方案，获取反馈和支持。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;根据反馈调整方案，确保与业务需求匹配。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="5-实施与持续优化"&gt;5. 实施与持续优化&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;制定详细的开发计划和质量保障措施。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;迭代交付，及时根据业务变化调整技术方案。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;建立监控和反馈机制，确保方案持续满足业务目标。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="三实际案例示范"&gt;三、实际案例示范&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;针对用户增长业务需求，设计可扩展的用户行为分析系统。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;技术团队结合业务需求选用微服务架构，支持快速迭代和多渠道接入。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;通过技术方案提升数据处理效率，助力业务决策精准化。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="四常见误区与面试陷阱"&gt;四、常见误区与面试陷阱&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;❌ 技术方案脱离业务需求，造成资源浪费和低效。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;❌ 业务需求不明确，导致方案反复修改或失焦。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;❌ 缺少跨团队沟通，信息孤岛影响方案落地。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;❌ 忽视非功能性需求，如安全和性能，影响用户体验。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="五总结观点"&gt;五、总结观点&lt;/h3&gt;
&lt;p&gt;业务和技术密不可分，技术方案的设计必须紧扣业务目标，基于深入理解的业务需求进行科学规划和实施。通过有效沟通与验证，确保技术方案既满足当前业务，又具备扩展能力，实现技术对业务的最大赋能。&lt;/p&gt;</description></item><item><title>字节-社招-6年（3-1） · 第 1 轮 · 三面&amp;交叉面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-54/round-82/</link><pubDate>Sun, 27 Jul 2025 12:18:23 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-54/round-82/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-54/round-81/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-54/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-54/round-83/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 12 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-adc36654c68d"&gt;1. 介绍一下主导的业务系统以及相关工作&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-492e3ff524cc"&gt;2. 系统如何量化提升业务指标&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;说明指标分类和目标设定方法&lt;br&gt;&lt;/li&gt;
&lt;li&gt;描述数据采集和监控流程&lt;br&gt;&lt;/li&gt;
&lt;li&gt;强调数据分析和问题洞察能力&lt;br&gt;&lt;/li&gt;
&lt;li&gt;介绍方案设计、执行及量化评估手段&lt;br&gt;&lt;/li&gt;
&lt;li&gt;提出技术与业务结合的具体措施&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-理解业务指标的定义与分类"&gt;● 理解业务指标的定义与分类&lt;br&gt;&lt;/h4&gt;
&lt;h4 id="-掌握数据采集分析和量化的方法"&gt;● 掌握数据采集、分析和量化的方法&lt;br&gt;&lt;/h4&gt;
&lt;h4 id="-熟悉目标设定方案设计与效果评估流程"&gt;● 熟悉目标设定、方案设计与效果评估流程&lt;br&gt;&lt;/h4&gt;
&lt;h4 id="-结合技术手段和产品思维推动业务增长"&gt;● 结合技术手段和产品思维推动业务增长&lt;br&gt;&lt;/h4&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h3 id="一业务指标的定义与分类"&gt;一、业务指标的定义与分类&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;核心业务指标（KPI）&lt;/strong&gt;：反映业务目标的关键数据，如用户留存率、转化率、活跃度等。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;辅助指标&lt;/strong&gt;：支持分析业务表现的相关数据，如页面加载速度、点击率、错误率。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;指标分层&lt;/strong&gt;：宏观指标（整体业务）+ 微观指标（细分功能或用户行为）。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="二量化提升业务指标的流程"&gt;二、量化提升业务指标的流程&lt;/h3&gt;
&lt;h4 id="1-明确目标指标"&gt;1. 明确目标指标&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;根据公司战略和产品定位确定重点指标。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;指标需具体、可衡量且可执行（SMART原则）。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-数据采集与监控"&gt;2. 数据采集与监控&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;集成数据埋点和埋点管理工具（如 Google Analytics、自研埋点系统）。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;监控关键路径数据，实时获取指标动态。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-数据分析与洞察"&gt;3. 数据分析与洞察&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;使用数据分析工具（如 SQL、BI平台）深入挖掘用户行为和业务趋势。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;找出指标波动的原因，定位痛点和机会。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-方案设计与执行"&gt;4. 方案设计与执行&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;结合业务和技术设计改进方案，如性能优化、功能迭代、用户体验提升。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;制定具体执行计划，分阶段推动落地。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="5-量化评估与反馈"&gt;5. 量化评估与反馈&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;通过A/B测试等手段验证方案效果，避免主观判断。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;持续监控指标变化，调整优化策略。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="三技术手段支持"&gt;三、技术手段支持&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;前端性能优化&lt;/strong&gt;：减少首屏加载时间，提高用户体验，促进留存和转化。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;埋点与事件追踪&lt;/strong&gt;：精准采集用户操作数据，支持业务决策。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;监控与告警&lt;/strong&gt;：及时发现业务异常，保证系统稳定性。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动化测试和持续集成&lt;/strong&gt;：保证新功能质量，降低回归风险。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="四案例示例"&gt;四、案例示例&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;通过页面性能优化，将首屏时间从5秒降到1秒，用户跳出率下降20%。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;利用细粒度埋点监控用户点击路径，发现某环节转化低，优化流程后转化率提升15%。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;采用A/B测试验证新推荐算法效果，点击率提升10%。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="五常见误区与挑战"&gt;五、常见误区与挑战&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;❌ 盲目追求指标数字增长，忽视用户体验和长期价值。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;❌ 缺少科学的数据采集和分析，导致数据不准确。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;❌ 忽视持续监控和迭代，方案实施后无后续跟进。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;❌ 目标不明确或过于宽泛，难以量化和评估。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="六总结观点"&gt;六、总结观点&lt;/h3&gt;
&lt;p&gt;系统性量化提升业务指标需要结合明确目标、科学数据采集与分析、合理方案设计、严谨效果评估和持续优化。技术与产品紧密配合，才能驱动业务稳定增长和用户价值提升。&lt;/p&gt;</description></item><item><title>字节-社招-6年（3-1） · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-54/round-81/</link><pubDate>Sun, 27 Jul 2025 12:12:49 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-54/round-81/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-54/round-80/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-54/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-54/round-82/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 9 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-1a40d6f759b7"&gt;1. 讲一下D2C（Design to Code）这个项目&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;阐述 D2C 的概念和目标&lt;br&gt;&lt;/li&gt;
&lt;li&gt;说明设计稿到代码的转换流程和关键技术&lt;br&gt;&lt;/li&gt;
&lt;li&gt;分析项目架构及技术栈组成&lt;br&gt;&lt;/li&gt;
&lt;li&gt;指出面临的挑战与解决方案&lt;br&gt;&lt;/li&gt;
&lt;li&gt;强调项目对团队效率和产品质量的提升价值&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-理解-d2c-项目的定位及价值"&gt;● 理解 D2C 项目的定位及价值&lt;br&gt;&lt;/h4&gt;
&lt;h4 id="-掌握设计稿自动转化为代码的核心技术与流程"&gt;● 掌握设计稿自动转化为代码的核心技术与流程&lt;br&gt;&lt;/h4&gt;
&lt;h4 id="-了解项目中遇到的技术挑战及解决方案"&gt;● 了解项目中遇到的技术挑战及解决方案&lt;br&gt;&lt;/h4&gt;
&lt;h4 id="-能阐述项目架构自动化程度及实际应用场景"&gt;● 能阐述项目架构、自动化程度及实际应用场景&lt;br&gt;&lt;/h4&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h3 id="一项目背景与定义"&gt;一、项目背景与定义&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;D2C（Design to Code）&lt;/strong&gt; 是一个致力于将设计稿（如 Figma、Sketch、Adobe XD）自动或半自动转换为前端代码（如 React、Vue、Flutter 等） 的技术项目。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;目的是大幅提升设计与开发的协作效率，缩短从设计到上线的周期，减少手工编码错误和重复劳动。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="二核心原理与技术流程"&gt;二、核心原理与技术流程&lt;/h3&gt;
&lt;h4 id="1-设计稿解析"&gt;1. 设计稿解析&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;利用设计工具开放的 API 或导出格式（如 JSON、SVG、图层数据）提取设计元素信息。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;包括图层结构、样式属性（颜色、字体、布局）、交互定义等。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-结构映射与组件识别"&gt;2. 结构映射与组件识别&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;将设计图层结构映射为前端组件树，分析布局关系（如 Flexbox/Grid），抽象为对应的代码组件。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;识别常用设计元素（按钮、输入框、列表等），映射成对应 UI 组件库元素，便于复用。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-代码生成"&gt;3. 代码生成&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;根据映射关系自动生成对应框架的代码（JSX、Vue SFC、Flutter Widget 等）。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;自动写入样式代码（CSS-in-JS、Less、Sass），保证样式还原度。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;支持动态交互事件和路由跳转逻辑的基本嵌入。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-优化与可维护性保障"&gt;4. 优化与可维护性保障&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;生成代码结构清晰、易于阅读和二次开发。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;支持设计稿变更自动更新代码，保障设计-开发同步。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="三项目架构与技术栈"&gt;三、项目架构与技术栈&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;前端&lt;/strong&gt;：基于 React/Vue 实现可视化设计解析和代码展示。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;后端&lt;/strong&gt;：负责设计稿文件解析、复杂转换逻辑和代码模板管理。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;辅助工具&lt;/strong&gt;：利用 AST 解析和模板引擎生成高质量代码。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;集成&lt;/strong&gt;：支持与设计工具插件无缝对接，实现一键转码。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="四技术挑战及解决方案"&gt;四、技术挑战及解决方案&lt;/h3&gt;
&lt;h4 id="1-设计与代码结构差异"&gt;1. 设计与代码结构差异&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;设计稿与前端布局模型（盒模型、Flex/Grid）存在差异，需智能转换布局方案。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;通过规则引擎和机器学习辅助识别设计意图，提升转换准确率。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-样式还原与响应式支持"&gt;2. 样式还原与响应式支持&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;设计稿静态像素为主，需转换成动态响应式样式。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;采用抽象布局单元、断点处理等方法，实现多端适配。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-动态交互与状态管理自动化"&gt;3. 动态交互与状态管理自动化&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;静态设计向动态代码过渡，自动注入事件处理和状态逻辑，增强可用性。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-性能与可维护性平衡"&gt;4. 性能与可维护性平衡&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;生成代码需避免臃肿冗余，保证性能和后续维护成本。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;通过代码模板优化和分层设计解决。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="五项目应用场景与价值体现"&gt;五、项目应用场景与价值体现&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提高开发效率&lt;/strong&gt;：设计师和开发者快速交付，高效协作。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;降低人力成本&lt;/strong&gt;：减少重复手工编码，避免低级错误。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提升设计一致性&lt;/strong&gt;：保持设计与实现的高度一致，减少偏差。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;支持多平台快速迭代&lt;/strong&gt;：针对 Web、移动端统一输出，便于多端覆盖。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="六常见误区及面试陷阱"&gt;六、常见误区及面试陷阱&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;❌ 认为 D2C 能完全替代人工编码，实际还需开发者做细节调整。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;❌ 忽视设计工具多样性和格式兼容性带来的技术复杂度。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;❌ 忽略代码生成后的维护和二次开发难度。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;❌ 过度依赖自动化，导致生成代码性能或质量下降。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="七总结观点"&gt;七、总结观点&lt;/h3&gt;
&lt;p&gt;D2C 项目是设计与开发深度融合的技术创新，通过自动解析设计稿并生成高质量前端代码，极大提升开发效率和设计一致性。该项目涉及设计解析、智能映射、代码生成和性能优化多个技术环节，虽存在一定技术挑战，但未来有广阔应用前景。&lt;/p&gt;</description></item><item><title>字节-社招-6年（3-1） · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-54/round-80/</link><pubDate>Sun, 27 Jul 2025 12:05:14 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-54/round-80/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-54/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-54/round-81/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; react 渲染机制、react hooks、Webpack与Vite&lt;/p&gt;
&lt;p&gt;本轮共 15 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-c5bbf116f24b"&gt;1. 请选择一个最有技术挑战的项目，说明你解决的核心问题、技术选型依据及后续优化空间&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;STAR法则&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;根据自己项目经历，提前挖掘亮点、准备项目&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-a46093da7a90"&gt;2. 作为前端负责人，在前端基础设施层做了哪些体系化建设&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;从规范、工具链、组件库、监控和协作多维度展开&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合具体措施与实际效果进行阐述&lt;br&gt;&lt;/li&gt;
&lt;li&gt;展现管理、技术与团队文化的融合能力&lt;br&gt;&lt;/li&gt;
&lt;li&gt;体现对挑战的预判和解决方案&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-考察候选人对前端基础设施的整体认知和架构设计能力"&gt;● 考察候选人对前端基础设施的整体认知和架构设计能力&lt;br&gt;&lt;/h4&gt;
&lt;h4 id="-了解候选人在团队管理与技术规范制定上的实践经验"&gt;● 了解候选人在团队管理与技术规范制定上的实践经验&lt;br&gt;&lt;/h4&gt;
&lt;h4 id="-关注候选人如何通过基础设施提升团队开发效率和产品质量"&gt;● 关注候选人如何通过基础设施提升团队开发效率和产品质量&lt;br&gt;&lt;/h4&gt;
&lt;h4 id="-体现对可维护性可扩展性和技术创新的把控"&gt;● 体现对可维护性、可扩展性和技术创新的把控&lt;br&gt;&lt;/h4&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h3 id="一前端基础设施体系化建设的核心内容"&gt;一、前端基础设施体系化建设的核心内容&lt;/h3&gt;
&lt;h4 id="1-统一的技术规范与编码标准"&gt;1. 统一的技术规范与编码标准&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;制定并推广团队统一的代码规范（如 ESLint、Prettier 规则）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;统一命名、目录结构、组件设计规范，确保代码可读性和维护性&lt;br&gt;&lt;/li&gt;
&lt;li&gt;定期组织代码评审，强化规范执行和技术交流&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-构建和自动化工具链搭建"&gt;2. 构建和自动化工具链搭建&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;设计统一的构建流程，选用并维护基于 Webpack、Vite 等的构建工具&lt;br&gt;&lt;/li&gt;
&lt;li&gt;实现自动化构建、测试、打包、发布流程（CI/CD）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;集成自动化测试框架（单元测试、集成测试、端到端测试）&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-组件库与设计系统建设"&gt;3. 组件库与设计系统建设&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;搭建和维护通用组件库，提升复用率与一致性&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合设计系统规范，确保视觉与交互体验统一&lt;br&gt;&lt;/li&gt;
&lt;li&gt;推动组件库文档化、版本管理和持续迭代&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-性能监控与质量保障体系"&gt;4. 性能监控与质量保障体系&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;建立前端性能监控（如首屏时间、资源加载、交互响应）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;引入错误收集与上报系统，实现线上问题快速定位&lt;br&gt;&lt;/li&gt;
&lt;li&gt;建立质量门禁（代码覆盖率、性能阈值、代码扫描）&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="5-多端统一与跨团队协作支持"&gt;5. 多端统一与跨团队协作支持&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;设计跨平台技术方案（Web、移动端、小程序）&lt;br&gt;&lt;/li&gt;
&lt;li&gt;制定接口规范和Mock数据方案，保障前后端高效协作&lt;br&gt;&lt;/li&gt;
&lt;li&gt;推动微前端或模块化方案，支持多团队并行开发&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="二实施效果与价值体现"&gt;二、实施效果与价值体现&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;提升团队开发效率，减少重复工作和沟通成本&lt;br&gt;&lt;/li&gt;
&lt;li&gt;保证代码质量和产品稳定性，降低线上故障率&lt;br&gt;&lt;/li&gt;
&lt;li&gt;加速产品交付，缩短上线周期&lt;br&gt;&lt;/li&gt;
&lt;li&gt;促进团队技术能力成长，构建良好技术文化&lt;br&gt;&lt;/li&gt;
&lt;li&gt;支持业务快速扩展，适应多端多业务场景需求&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="三可能遇到的挑战与应对策略"&gt;三、可能遇到的挑战与应对策略&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;团队接受度和习惯调整&lt;/strong&gt;：通过培训、逐步推行和示范项目降低阻力&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具链维护复杂性&lt;/strong&gt;：设立专人负责基础设施维护和升级，保障稳定性&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组件库与设计系统演进的平衡&lt;/strong&gt;：定期收集反馈，兼顾灵活性与规范性&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能与稳定性监控数据的解读和应用&lt;/strong&gt;：建立专门分析流程，结合业务需求制定优化方案&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="四总结观点"&gt;四、总结观点&lt;/h3&gt;
&lt;p&gt;作为前端负责人，基础设施层的体系化建设是提升团队整体效率和产品质量的关键。通过规范标准、自动化工具、组件库、监控体系及跨团队协作支持，构建稳定且高效的前端研发环境，为业务快速发展提供坚实技术保障。同时，注重团队文化和技术传承，推动持续改进和创新。&lt;/p&gt;</description></item><item><title>字节-抖音短视频-社招-5年 · 第 1 轮 · HR面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-53/round-79/</link><pubDate>Sun, 27 Jul 2025 11:49:10 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-53/round-79/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-53/round-78/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-53/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 10 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-9d942d9ed4ea"&gt;1. 为什么选择前端，你是怎么学前端的，自学前端觉得比较困难的点&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;真实表达学习动机和行业认知&lt;br&gt;&lt;/li&gt;
&lt;li&gt;清晰描述学习路径与方法，体现自驱力&lt;br&gt;&lt;/li&gt;
&lt;li&gt;主动总结自学难点及解决方案，展示解决问题能力&lt;br&gt;&lt;/li&gt;
&lt;li&gt;表现对未来成长的规划和期待&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-面试官希望了解候选人的学习动机和成长路径"&gt;● 面试官希望了解候选人的学习动机和成长路径&lt;br&gt;&lt;/h4&gt;
&lt;h4 id="-关注候选人对前端行业的认知及自学能力"&gt;● 关注候选人对前端行业的认知及自学能力&lt;br&gt;&lt;/h4&gt;
&lt;h4 id="-探索自学过程中的困难及解决方案反映抗压和问题解决能力"&gt;● 探索自学过程中的困难及解决方案，反映抗压和问题解决能力&lt;br&gt;&lt;/h4&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h3 id="一选择前端的原因"&gt;一、选择前端的原因&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;技术的即时反馈与可视化强&lt;/strong&gt;：前端开发可以快速看到效果，工作成果直观，满足感强。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;行业发展迅速，应用广泛&lt;/strong&gt;：随着互联网和移动端普及，前端技术需求旺盛，职业前景广阔。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结合设计与开发的跨界魅力&lt;/strong&gt;：前端融合设计、用户体验和工程实现，工作内容丰富多样。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;学习曲线友好，入门门槛相对较低&lt;/strong&gt;：相比后端复杂环境，前端技术栈更容易起步。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="二学习前端的路径与方法"&gt;二、学习前端的路径与方法&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基础知识打牢&lt;/strong&gt;：从HTML、CSS、JavaScript开始，系统学习语言和浏览器原理。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;项目驱动实践&lt;/strong&gt;：通过小项目练习知识点，逐步积累实战经验。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;系统化学习框架和工具&lt;/strong&gt;：深入学习 Vue、React、Webpack 等主流框架和构建工具。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;参与开源和社区&lt;/strong&gt;：通过阅读源码、提问和答疑，加深理解和扩展视野。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;持续跟进新技术&lt;/strong&gt;：保持学习态度，关注生态变化和新兴技术趋势。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="三自学过程中的困难及应对"&gt;三、自学过程中的困难及应对&lt;/h3&gt;
&lt;h4 id="1-知识点多且零散"&gt;1. 知识点多且零散&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;前端涉及面广（浏览器机制、网络、安全、UI等），容易迷失方向。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;解决方法：制定阶段性学习计划，系统化梳理知识体系。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-理论与实践脱节"&gt;2. 理论与实践脱节&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;单纯看文档和教程，缺少动手操作，难以消化。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;解决方法：边学边做项目，遇到问题及时查阅和总结。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-框架与工具更新快"&gt;3. 框架与工具更新快&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;框架迭代频繁，工具链复杂，学习压力大。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;解决方法：关注核心原理，不盲目追新，重点掌握主流稳定技术。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-调试与性能优化难度高"&gt;4. 调试与性能优化难度高&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;浏览器兼容、异步机制、性能调优等问题复杂。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;解决方法：借助调试工具，多阅读源码和案例，积累经验。&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="四总结观点"&gt;四、总结观点&lt;/h3&gt;
&lt;p&gt;选择前端，是因为它能快速实现创意、应用广泛且持续发展。自学过程中遇到知识面广、实践难和技术更新快等挑战，但通过系统规划和项目实践克服。未来希望通过不断积累，深入理解前端底层原理和工程化实践，成为一名全栈且有深度的前端工程师。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-c225258c65f9"&gt;2. 对工作的期望&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-a66900793458"&gt;3. 成就感的点&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-f8499843f90f"&gt;4. 一二三面面试官给你的感觉&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-eb588741e359"&gt;5. 看到你面试比较曲折，转了三个部门，你有什么感受，事后有复盘吗&lt;/h2&gt;
&lt;h3 id="题目要点-4"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;</description></item><item><title>字节-抖音短视频-社招-5年 · 第 1 轮 · 三面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-53/round-78/</link><pubDate>Sun, 27 Jul 2025 11:46:08 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-53/round-78/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-53/round-77/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-53/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-53/round-79/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 10 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-5887245a179b"&gt;1. 自我介绍（注意与一、二面的差异化）&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-2a56fc9ed680"&gt;2. 请重点介绍一个你主导或深度参与的技术项目（非业务需求），如何从0到1推动落地&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;明确项目是“自主发起”，解决了实际“工程难题”&lt;/li&gt;
&lt;li&gt;描述了“目标-方案-过程-成果”四个完整阶段&lt;/li&gt;
&lt;li&gt;有实际的“技术亮点”可以展开讲解（如 monorepo、适配抽象、构建工具链）&lt;/li&gt;
&lt;li&gt;表达出清晰的“主人翁意识”与技术领导力&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-面试官希望了解候选人是否具备技术主导力或技术项目-owner思维"&gt;● 面试官希望了解候选人是否具备“技术主导力”或“技术项目 owner”思维&lt;br&gt;&lt;/h4&gt;
&lt;h4 id="-重点考察项目选题是否合理推进过程是否专业技术方案是否有深度"&gt;● 重点考察项目选题是否合理、推进过程是否专业、技术方案是否有深度&lt;br&gt;&lt;/h4&gt;
&lt;h4 id="-了解候选人在从问题识别调研方案攻克难点团队协作成果评估全过程中的角色与能力"&gt;● 了解候选人在“从问题识别、调研方案、攻克难点、团队协作、成果评估”全过程中的角色与能力&lt;br&gt;&lt;/h4&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h3 id="一项目背景与问题识别"&gt;一、项目背景与问题识别&lt;/h3&gt;
&lt;p&gt;在我负责的公司前端平台中，随着业务的扩展，多个产品线逐渐发展出自己的前端应用，形成了大量重复代码、组件风格不一致、工程维护困难等问题。尤其是在多端部署（H5、微信小程序、企业微信等）场景下，&lt;strong&gt;重复建设、逻辑差异、样式割裂&lt;/strong&gt;等问题尤为突出。&lt;/p&gt;
&lt;p&gt;于是我提出建设一套&lt;strong&gt;前端基础能力平台化方案&lt;/strong&gt;，目标是实现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通用组件与工具库的沉淀与统一&lt;/li&gt;
&lt;li&gt;多端适配与平台差异抽象&lt;/li&gt;
&lt;li&gt;支持微前端/模块加载的架构演进&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;该项目在初期并非“业务需求”推动，而是从开发痛点中&lt;strong&gt;主动识别问题、提出技术方向并推动落地&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="二方案设计与关键落点"&gt;二、方案设计与关键落点&lt;/h3&gt;
&lt;h4 id="-技术目标拆解"&gt;✅ 技术目标拆解&lt;/h4&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;设计统一的 UI 规范（基于现有设计稿抽象）&lt;/li&gt;
&lt;li&gt;使用 monorepo + lerna 管理组件库&lt;/li&gt;
&lt;li&gt;使用 Storybook + VitePress 建立文档与调试系统&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;code&gt;@common/utils&lt;/code&gt; 包，提供统一的日期处理、加密、验证、网络库封装等工具&lt;/li&gt;
&lt;li&gt;用 TypeScript + 单元测试保障稳定性&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;抽象常用项目模板：H5、小程序、纯组件库&lt;/li&gt;
&lt;li&gt;提供一键初始化、CI/CD 脚本、lint规范、GitHook 校验等预设&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年 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-53/round-77/</link><pubDate>Sun, 27 Jul 2025 10:01:22 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-53/round-77/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-53/round-76/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-53/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-53/round-78/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; CSRF攻击、https、浏览器的同源策略、浏览器的缓存机制、盒子模型、全方位解读this、call、apply和bind&lt;/p&gt;
&lt;p&gt;本轮共 23 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-ae0f4a4f8724"&gt;1. 自我介绍与项目介绍&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-ca6e8fa84ffb"&gt;2. 你在项目中如何优化首屏加载时间&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;清晰解释首屏加载构成和评估指标&lt;/li&gt;
&lt;li&gt;梳理优化方向：资源优化、加载顺序、渲染提前&lt;/li&gt;
&lt;li&gt;结合实际项目列举优化措施及效果&lt;/li&gt;
&lt;li&gt;提醒常见误区，展示对细节的把控能力&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-首屏加载性能优化的全链路能力"&gt;● 首屏加载性能优化的全链路能力&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;考察对加载过程、资源调度、渲染流程等多维度的理解与掌握。&lt;/p&gt;
&lt;h4 id="-实际优化手段的选型和落地能力"&gt;● 实际优化手段的选型和落地能力&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;考察对首屏加载优化策略在项目中的实际应用和效果反馈。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h3 id="一首屏加载时间的定义与构成"&gt;一、首屏加载时间的定义与构成&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;首屏加载时间&lt;/strong&gt;指的是从用户发起访问请求到页面关键内容（尤其是首屏可视区域）可交互的时间。&lt;br&gt;
它包括以下几个阶段：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DNS 解析、TCP/TLS 连接&lt;/li&gt;
&lt;li&gt;HTML 下载与解析&lt;/li&gt;
&lt;li&gt;CSS/JS 加载、阻塞与执行&lt;/li&gt;
&lt;li&gt;首屏组件渲染、资源加载与图片显示&lt;/li&gt;
&lt;li&gt;浏览器首次 Paint 与可交互（First Contentful Paint / TTI）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="二常见优化策略与实战举例"&gt;二、常见优化策略与实战举例&lt;/h3&gt;
&lt;h4 id="1-资源加载优化"&gt;1. &lt;strong&gt;资源加载优化&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gzip / Brotli 压缩&lt;/strong&gt;：减少资源体积&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用 HTTP/2 / QUIC&lt;/strong&gt;：提升多资源并发加载能力&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开启 CDN 加速&lt;/strong&gt;：靠近用户，提高请求速度&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;精简依赖包&lt;/strong&gt;：如 tree-shaking、移除未用依赖（如 moment → dayjs）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-首屏关键资源优先加载"&gt;2. &lt;strong&gt;首屏关键资源优先加载&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Critical CSS 提取与内联&lt;/strong&gt;：减少 CSS 阻塞渲染&lt;br&gt;
示例：使用 webpack 的 &lt;code&gt;critical-css&lt;/code&gt; 插件提取首屏样式并内联到 HTML&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;预加载首屏图片和组件&lt;/strong&gt;&lt;br&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;link&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rel&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;preload&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;href&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/assets/banner.jpg&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;image&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;合理使用&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;`&lt;/span&gt;async&lt;span style="color:#960050;background-color:#1e0010"&gt;`&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;`&lt;/span&gt;defer&lt;span style="color:#960050;background-color:#1e0010"&gt;`&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;加载&lt;/span&gt; JS&lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：避免阻塞&lt;/span&gt; HTML &lt;span style="color:#960050;background-color:#1e0010"&gt;解析&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#### 3. **首屏代码最小化（关键代码提取）**&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;路由懒加载&lt;/span&gt;&lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：非首屏模块按需加载&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;```&lt;/span&gt;js
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; About &lt;span style="color:#f92672"&gt;=&lt;/span&gt; React&lt;span style="color:#f92672"&gt;.&lt;/span&gt;lazy(() &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; import(&lt;span style="color:#e6db74"&gt;&amp;#39;./About&amp;#39;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;```&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;组件级拆分（如&lt;/span&gt; webpack &lt;span style="color:#960050;background-color:#1e0010"&gt;的&lt;/span&gt; SplitChunks&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;&lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：减少主包体积&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#f92672"&gt;**&lt;/span&gt;SSR &lt;span style="color:#f92672"&gt;/&lt;/span&gt; SSG &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;静态渲染&lt;/span&gt;&lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：预渲染首屏内容，降低白屏时间&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#### 4. **骨架屏 + 占位图**&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;使用骨架屏组件在主内容加载前展示占位&lt;/span&gt; UI
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;```&lt;/span&gt;html
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;div &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;skeleton-loader&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;...&amp;lt;/&lt;/span&gt;div&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;```&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;提高用户感知速度，避免白屏&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#### 5. **缓存策略**&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;使用强缓存（&lt;/span&gt;Cache&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Control&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;）与协商缓存（&lt;/span&gt;ETag&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;使用&lt;/span&gt; Service Worker &lt;span style="color:#960050;background-color:#1e0010"&gt;做离线缓存，提升重复访问性能&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#### 6. **图片优化**&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;使用&lt;/span&gt; WebP&lt;span style="color:#960050;background-color:#1e0010"&gt;、&lt;/span&gt;AVIF &lt;span style="color:#960050;background-color:#1e0010"&gt;等新格式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;小图&lt;/span&gt; base64 &lt;span style="color:#960050;background-color:#1e0010"&gt;内嵌、大图懒加载&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;多倍图压缩（如用&lt;/span&gt; tinypng &lt;span style="color:#960050;background-color:#1e0010"&gt;等工具）控制首屏图体积&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;KB
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;### 三、项目实战效果举例（性能指标前后对比）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;优化项&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;优化前&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;优化后&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#f92672"&gt;------------&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#f92672"&gt;-----&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#f92672"&gt;-----&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;首屏加载时间（&lt;/span&gt;TTFB&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.8&lt;/span&gt;s &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.9&lt;/span&gt;s &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt; JS包大小 &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.2&lt;/span&gt;MB &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;450&lt;/span&gt;KB &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;首屏渲染（&lt;/span&gt;FCP&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3.5&lt;/span&gt;s &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.2&lt;/span&gt;s &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;可交互时间（&lt;/span&gt;TTI&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.2&lt;/span&gt;s &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.9&lt;/span&gt;s &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;### 四、常见误区与陷阱&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;盲目使用懒加载&lt;/span&gt;&lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：过度懒加载会导致首屏核心内容延迟&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;未合理拆分&lt;/span&gt; vendor &lt;span style="color:#960050;background-color:#1e0010"&gt;包&lt;/span&gt;&lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：导致主包过大&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;骨架屏布局不一致或闪烁&lt;/span&gt;&lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：影响用户体验&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;### 五、总结&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;首屏优化是系统性工程，涵盖网络传输、资源管理、组件拆分、渲染路径等多环节。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;应结合业务场景按阶段优化，配合&lt;/span&gt; Lighthouse&lt;span style="color:#f92672"&gt;/&lt;/span&gt;Chrome DevTools &lt;span style="color:#960050;background-color:#1e0010"&gt;实时评估效果。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;目标是压缩关键资源、减少阻塞、加快首屏渲染并保障体验一致性。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/&lt;/span&gt;details&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## 3. 如何识别首屏关键资源 {#question-subjective-9bbab0275c1b}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;### 题目要点&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;明确首屏关键资源的定义与分类&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;能列出识别方法：&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Performance&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;、&lt;/span&gt;Lighthouse&lt;span style="color:#960050;background-color:#1e0010"&gt;、&lt;/span&gt;Network&lt;span style="color:#960050;background-color:#1e0010"&gt;、&lt;/span&gt;Coverage
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;能结合项目给出识别&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;优化的实际策略&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;有资源优先级调度、渲染阻塞等知识支撑&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;details&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;summary&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;参考答案&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/&lt;/span&gt;summary&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;### 考察点&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#### ● 识别影响首屏渲染的关键资源&amp;lt;br&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;考察候选人对渲染链路和性能瓶颈的理解。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#### ● 熟悉浏览器加载机制与资源优先级调度&amp;lt;br&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;考察对&lt;/span&gt; Chrome DevTools&lt;span style="color:#960050;background-color:#1e0010"&gt;、&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Performance&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;面板等性能工具的使用能力。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;### 参考答案&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;### 一、首屏关键资源的定义&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;首屏关键资源&lt;/span&gt;&lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;是指那些&lt;/span&gt;&lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;必须在首屏渲染前加载完成&lt;/span&gt;&lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;，否则会&lt;/span&gt;&lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;阻塞页面首屏展示&lt;/span&gt;&lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;的资源。常见类型包括：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#f92672"&gt;**&lt;/span&gt;HTML &lt;span style="color:#960050;background-color:#1e0010"&gt;入口文件&lt;/span&gt;&lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：解析整个页面结构的根文档&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#f92672"&gt;**&lt;/span&gt;CSS &lt;span style="color:#960050;background-color:#1e0010"&gt;样式表&lt;/span&gt;&lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：&lt;/span&gt;CSS &lt;span style="color:#960050;background-color:#1e0010"&gt;是阻塞渲染的，必须加载后才能绘制页面&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;首屏&lt;/span&gt; JS &lt;span style="color:#960050;background-color:#1e0010"&gt;脚本&lt;/span&gt;&lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：用于首屏交互或组件逻辑初始化的&lt;/span&gt; JS&lt;span style="color:#960050;background-color:#1e0010"&gt;（例如&lt;/span&gt; React&lt;span style="color:#f92672"&gt;/&lt;/span&gt;Vue &lt;span style="color:#960050;background-color:#1e0010"&gt;渲染逻辑）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;首屏图片&lt;/span&gt;&lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：&lt;/span&gt;Banner&lt;span style="color:#960050;background-color:#1e0010"&gt;、大图等占据首屏核心位置的可见资源&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;字体文件（可选）&lt;/span&gt;&lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：若首屏需展示特殊字体（注意&lt;/span&gt; FOUT &lt;span style="color:#960050;background-color:#1e0010"&gt;问题）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;### 二、识别关键资源的方法&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#### 1. 使用 Chrome DevTools → Performance 面板&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;1.&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;打开页面，&lt;/span&gt;F12 &lt;span style="color:#960050;background-color:#1e0010"&gt;→&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Performance&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;→&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;开始录制&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2.&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;观察：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#f92672"&gt;**&lt;/span&gt;Loading &lt;span style="color:#960050;background-color:#1e0010"&gt;阶段的资源瀑布图&lt;/span&gt;&lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;（&lt;/span&gt;Network Timing&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#f92672"&gt;**&lt;/span&gt;Longest Frame Before First Paint&lt;span style="color:#f92672"&gt;**&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;标出首屏时间点前加载完成的资源，即为关键资源&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#### 2. 使用 Chrome DevTools → Coverage 面板&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;识别“实际使用的&lt;/span&gt; CSS&lt;span style="color:#f92672"&gt;/&lt;/span&gt;JS&lt;span style="color:#960050;background-color:#1e0010"&gt;”&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;可以看出哪些资源在首屏期间被真正用到，哪些是冗余代码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#### 3. 使用 Lighthouse 报告&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; Lighthouse &lt;span style="color:#960050;background-color:#1e0010"&gt;中的“&lt;/span&gt;Diagnostics&lt;span style="color:#960050;background-color:#1e0010"&gt;”项会指出：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;阻塞渲染的资源（&lt;/span&gt;Render Blocking Resources&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; Critical Request Chains
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; Unused JS&lt;span style="color:#f92672"&gt;/&lt;/span&gt;CSS &lt;span style="color:#960050;background-color:#1e0010"&gt;提示，帮助精简非关键资源&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#### 4. 查看 Chrome DevTools → Network 面板排序&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;按时间排序，查看首屏渲染前加载的资源&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;关注&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;`&lt;/span&gt;Initiator&lt;span style="color:#960050;background-color:#1e0010"&gt;`&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;列，了解加载来源（&lt;/span&gt;HTML&lt;span style="color:#960050;background-color:#1e0010"&gt;、&lt;/span&gt;JS &lt;span style="color:#960050;background-color:#1e0010"&gt;引入、&lt;/span&gt;CSS &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;import&lt;span style="color:#960050;background-color:#1e0010"&gt;）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;### 三、首屏关键资源识别的原则&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;资源类型&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;是否为关键资源&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;原因说明&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;|--------------|----------------|-----------|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;`&lt;/span&gt;index&lt;span style="color:#f92672"&gt;.&lt;/span&gt;html&lt;span style="color:#960050;background-color:#1e0010"&gt;`&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;✅&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; HTML &lt;span style="color:#960050;background-color:#1e0010"&gt;是渲染入口&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;`&lt;/span&gt;main&lt;span style="color:#f92672"&gt;.&lt;/span&gt;css&lt;span style="color:#960050;background-color:#1e0010"&gt;`&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;✅&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;阻塞渲染，必须先加载&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;`&lt;/span&gt;main&lt;span style="color:#f92672"&gt;.&lt;/span&gt;js&lt;span style="color:#960050;background-color:#1e0010"&gt;`&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;✅&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;驱动页面逻辑，渲染主视图&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;首页大图&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;✅&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;首屏可见，未加载即白屏&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt; lazy&lt;span style="color:#f92672"&gt;.&lt;/span&gt;js &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;❌&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;延迟加载，非首屏资源&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;用户点击后加载的组件&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;❌&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;用户交互后才需要，不影响首屏&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;### 四、如何标记与优化首屏资源加载&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#### ✅ 使用 `&amp;amp;lt;link rel=&amp;#34;preload&amp;#34;&amp;amp;gt;` 预加载关键资源&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;```&lt;/span&gt;html
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;link rel&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;preload&amp;#34;&lt;/span&gt; href&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/styles/main.css&amp;#34;&lt;/span&gt; as&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;style&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;link rel&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;preload&amp;#34;&lt;/span&gt; href&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/scripts/main.js&amp;#34;&lt;/span&gt; as&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;script&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="-合理设置优先级优先样式关键-js"&gt;✅ 合理设置优先级（优先样式、关键 JS）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;样式应优先加载，JS 使用 &lt;code&gt;defer&lt;/code&gt; 避免阻塞渲染&lt;/li&gt;
&lt;li&gt;图片使用 &lt;code&gt;priority&lt;/code&gt; 或手动 preload，避免首屏懒加载&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="-拆分资源按需加载非关键资源延后"&gt;✅ 拆分资源、按需加载，非关键资源延后&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;webpack&lt;/code&gt; 拆包、code splitting&lt;/li&gt;
&lt;li&gt;配合路由懒加载、图片懒加载，剥离非首屏资源&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="五总结"&gt;五、总结&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;首屏关键资源识别关键在于&lt;strong&gt;时机和影响&lt;/strong&gt;：只看首屏时间前对渲染有影响的资源&lt;/li&gt;
&lt;li&gt;工具使用（DevTools Performance / Coverage / Lighthouse）是识别的重要手段&lt;/li&gt;
&lt;li&gt;识别后需通过&lt;strong&gt;优先加载、资源压缩、预加载、懒加载&lt;/strong&gt;等手段进行优化&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-c8174172431f"&gt;4. 具体通过哪些手段减少关键资源体积&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;清晰分类 JS / CSS / 图片 / 字体 / HTML 各自的体积优化方式&lt;/li&gt;
&lt;li&gt;能结合具体工具（Webpack、插件、工具链）给出实操方案&lt;/li&gt;
&lt;li&gt;表达对“精简资源体积 = 提升性能体验”逻辑的理解&lt;/li&gt;
&lt;li&gt;给出优化前后定量结果更有说服力&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点-1"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-资源优化能力代码压缩依赖精简图片优化等"&gt;● 资源优化能力（代码压缩、依赖精简、图片优化等）&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;考察候选人对性能优化的掌握是否落到实处。&lt;/p&gt;</description></item><item><title>字节-抖音短视频-社招-5年 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-53/round-76/</link><pubDate>Sun, 27 Jul 2025 09:47:52 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-53/round-76/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-53/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-53/round-77/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 事件循环、前端存储、React 生命周期、列表和key、react 事件机制、react 渲染机制、浏览器的同源策略、CSRF攻击、 XSS防御、跨域资源共享（CORS）&lt;/p&gt;
&lt;p&gt;本轮共 23 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-cdb6497278f2"&gt;1. 介绍一下你觉的比较有成就感的项目&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;STAR法则&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;老传统了，基于简历挖掘一个最有亮点的项目&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-24e14e9a845e"&gt;2. 遇到的最有挑战的技术是什么&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-9e1a5a47930c"&gt;3. 项目技术选型是如何衡量的&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;列举技术选型的核心衡量标准&lt;br&gt;&lt;/li&gt;
&lt;li&gt;说明评估流程和实操方法&lt;br&gt;&lt;/li&gt;
&lt;li&gt;强调综合权衡，避免片面判断&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合项目需求和团队实际展开&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-理解技术选型的核心因素及其权衡原则"&gt;● 理解技术选型的核心因素及其权衡原则&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;考察对项目需求、团队能力与技术趋势的综合分析能力。&lt;/p&gt;
&lt;h4 id="-掌握技术选型中性能开发效率维护性等多维度考虑"&gt;● 掌握技术选型中性能、开发效率、维护性等多维度考虑&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;考察系统架构设计和项目管理思维。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h3 id="一技术选型的衡量维度"&gt;一、技术选型的衡量维度&lt;/h3&gt;
&lt;h4 id="1-业务需求匹配度"&gt;1. 业务需求匹配度&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;技术是否满足项目的功能需求、性能要求和扩展性。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;是否支持项目特有的场景或复杂逻辑。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-团队技术栈和能力"&gt;2. 团队技术栈和能力&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;团队是否熟悉该技术，学习成本及培训投入。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;技术社区活跃度，文档完善程度，易用性。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-性能表现"&gt;3. 性能表现&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;技术的响应速度、负载能力、资源消耗。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;是否支持性能优化方案（如 SSR、缓存策略等）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-生态和兼容性"&gt;4. 生态和兼容性&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;技术生态是否丰富，有无成熟的第三方库和工具支持。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;与现有系统和平台的兼容性。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="5-维护成本与长期可持续性"&gt;5. 维护成本与长期可持续性&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;技术的稳定性和升级频率。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;社区支持和企业采用情况，避免技术孤岛。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="6-开发效率"&gt;6. 开发效率&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;开发周期和上线速度。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;工具链和开发体验是否高效。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="7-安全性和合规性"&gt;7. 安全性和合规性&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;技术在安全防护、隐私保护方面的能力。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;是否满足行业合规标准。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="二技术选型的评估流程"&gt;二、技术选型的评估流程&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;需求调研&lt;/strong&gt;：明确项目功能和非功能需求。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方案调研&lt;/strong&gt;：收集备选技术方案及案例。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术预研和验证&lt;/strong&gt;：通过小型原型测试技术可行性。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;成本评估&lt;/strong&gt;：综合考量开发、维护、培训等成本。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;风险分析&lt;/strong&gt;：识别潜在风险，如社区活跃度、技术稳定性。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;决策和方案确定&lt;/strong&gt;：结合以上评估，选择最优技术方案。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="三总结"&gt;三、总结&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;技术选型是一个多维度权衡过程，既要满足业务需求，也需考虑团队与生态。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;注重长期维护和性能表现，避免盲目追新或仅凭个人偏好。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;通过科学的评估流程和数据支撑，做出理性选择。&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-b5f3a19aa953"&gt;4. 项目中的性能监控和错误上报讲一下&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;列举关键性能指标及监控方法&lt;br&gt;&lt;/li&gt;
&lt;li&gt;说明错误类型、捕获机制和上报流程&lt;br&gt;&lt;/li&gt;
&lt;li&gt;强调数据分析与持续优化的重要性&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合实际项目实践进行阐述&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点-1"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-理解前端性能监控的关键指标和监控手段"&gt;● 理解前端性能监控的关键指标和监控手段&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;考察对用户体验优化和实时监控的认知。&lt;/p&gt;</description></item><item><title>字节-商业化-社招-4年 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-52/round-75/</link><pubDate>Sun, 27 Jul 2025 09:29:18 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-52/round-75/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-52/round-74/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-52/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; Web Storage、离线存储、浏览器解析 HTML 文件、浏览器渲染过程、浏览器的缓存机制、浏览器的存储机制&lt;/p&gt;
&lt;p&gt;本轮共 22 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-ce6113579300"&gt;1. 讲一下你的3D渲染的项目&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-ebd16eff00d0"&gt;2. 3D渲染顶点着色、剪裁你是怎么实现的&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-8eb47b712b62"&gt;3. 顶点着色阶段中的坐标变换通常包括哪些步骤？为什么剪裁能提升性能&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-8945e274e9c1"&gt;4. 在透视投影中，为什么需要视口变换（Viewport Transformation）&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-efecf9c06939"&gt;5. 像素着色阶段的任务是什么？它如何与光照模型（如Phong或Blinn-Phong）结合&lt;/h2&gt;
&lt;h3 id="题目要点-4"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-229eab953c10"&gt;6. 延迟渲染（Deferred Rendering）与前向渲染（Forward Rendering）在像素着色阶段的区别&lt;/h2&gt;
&lt;h3 id="题目要点-5"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-5144c067ddb5"&gt;7. 深度缓冲（Z-Buffer）的工作原理是什么&lt;/h2&gt;
&lt;h3 id="题目要点-6"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-f54eec84ec45"&gt;8. 浏览器绘制一帧的完整流程（从输入事件到像素合成）&lt;/h2&gt;
&lt;h3 id="题目要点-7"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;理清浏览器渲染从事件到显示的每个关键步骤。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;解释每个阶段的作用和产生的结果。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;强调布局、绘制和合成的性能开销及优化手段。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合实际开发中的性能调优措施说明。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-理解浏览器渲染的全流程"&gt;● 理解浏览器渲染的全流程&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;考察从用户输入到最终视觉呈现的各个环节。&lt;/p&gt;
&lt;h4 id="-掌握事件处理样式计算布局绘制和合成机制"&gt;● 掌握事件处理、样式计算、布局、绘制和合成机制&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;考察对浏览器渲染流水线各阶段的深入理解。&lt;/p&gt;
&lt;h4 id="-理解性能瓶颈和优化点"&gt;● 理解性能瓶颈和优化点&lt;/h4&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h3 id="一浏览器绘制一帧的整体流程概览"&gt;一、浏览器绘制一帧的整体流程概览&lt;/h3&gt;
&lt;p&gt;从用户输入事件触发，到最终屏幕显示，浏览器大致执行以下步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;事件处理（Input Handling）&lt;/strong&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JavaScript 执行（JS Execution）&lt;/strong&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;样式计算（Style Recalculation）&lt;/strong&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;布局计算（Layout / Reflow）&lt;/strong&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;绘制（Painting）&lt;/strong&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;合成（Compositing）&lt;/strong&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;像素呈现（Rasterization &amp;amp; Display）&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="二详细流程解析"&gt;二、详细流程解析&lt;/h3&gt;
&lt;h4 id="1-用户输入事件处理"&gt;1. 用户输入事件处理&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;浏览器捕获用户的输入事件（如点击、滚动、键盘等），将事件放入事件队列。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;主线程从事件队列中取出事件，执行对应的事件处理程序（如回调函数）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-javascript-执行"&gt;2. JavaScript 执行&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;事件处理回调可能修改 DOM 或样式。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;JavaScript 运行在浏览器主线程，操作 DOM 会影响后续渲染。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-样式计算style-recalculation"&gt;3. 样式计算（Style Recalculation）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;浏览器根据最新的 DOM 结构和 CSS 规则，计算每个元素的最终样式。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;可能触发样式树（style tree）的重建或更新。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-布局计算layout--reflow"&gt;4. 布局计算（Layout / Reflow）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;计算元素的几何信息（大小、位置等），生成布局树（layout tree）。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;重新计算会影响元素相对或绝对位置。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;这是性能较昂贵的过程，尤其是节点多或频繁触发。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="5-绘制painting"&gt;5. 绘制（Painting）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;将布局树转换为绘制指令（绘制图层的内容），如颜色、文字、边框等。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;生成绘制层（paint layers），具体绘制到图层画布（layer canvas）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="6-合成compositing"&gt;6. 合成（Compositing）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;多个绘制层按照层级关系组合（合成）成最终页面。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;使用 GPU 加速合成，将图层合并为一张完整的图像。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;合成阶段可以通过硬件加速提升性能，避免全部重绘。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="7-像素呈现rasterization--display"&gt;7. 像素呈现（Rasterization &amp;amp; Display）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;将合成后的图像转换成屏幕像素。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;GPU 或显示设备将最终像素渲染到屏幕，完成一帧的视觉呈现。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="三流程图示意"&gt;三、流程图示意&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;用户输入 → 事件处理 → JS 执行 → 样式计算 → 布局 → 绘制 → 合成 → 屏幕显示
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="四优化与注意点"&gt;四、优化与注意点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;避免频繁触发布局和绘制&lt;/strong&gt;，减少重排和重绘次数。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;使用 CSS3 硬件加速属性（transform、opacity）优化合成性能。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;将复杂动画放入合成层，减少主线程压力。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;合理分层减少合成开销，避免过度分层。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;减少 JavaScript 执行时间，避免阻塞主线程。&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-e6f4b305ea7b"&gt;9. 追问：requestAnimationFrame（RAF）在哪个阶段执行？为什么它比setTimeout更适合动画&lt;/h2&gt;
&lt;h3 id="题目要点-8"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;明确 RAF 在浏览器渲染流程中“绘制前”执行。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;解释 RAF 与浏览器刷新同步，自动节流的机制。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;对比 setTimeout，突出 RAF 动画性能和体验优势。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;强调实际开发中推荐使用 RAF 实现动画更新。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="一requestanimationframe-执行阶段"&gt;一、requestAnimationFrame 执行阶段&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;requestAnimationFrame 回调函数执行时机&lt;/strong&gt;：&lt;br&gt;
RAF 的回调函数会在浏览器开始&lt;strong&gt;下一次渲染帧之前&lt;/strong&gt;执行，即在 &lt;strong&gt;浏览器渲染管线中的“绘制（Painting）”之前&lt;/strong&gt;或合成前的空隙期。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;具体来说，RAF 的回调是在浏览器完成一帧的布局（Layout）和样式计算（Style Recalculation）之后，&lt;strong&gt;紧接着准备绘制和合成之前&lt;/strong&gt;触发，保证动画逻辑与渲染同步。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="二为什么-raf-比-settimeout-更适合动画"&gt;二、为什么 RAF 比 setTimeout 更适合动画&lt;/h3&gt;
&lt;h4 id="1-与浏览器刷新频率同步"&gt;1. 与浏览器刷新频率同步&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;RAF 会按照屏幕刷新频率（通常是 60fps，即约 16.7ms 一帧）自动调用回调，保证动画平滑且不卡顿。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;setTimeout 不与渲染同步，回调可能在任意时刻执行，导致动画帧率不稳定甚至丢帧。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-自动节流和性能优化"&gt;2. 自动节流和性能优化&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;浏览器在后台标签页会自动暂停 RAF 调用，节省资源；而 setTimeout 仍然会尝试执行，浪费性能。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;RAF 允许浏览器合并多次绘制请求，提升性能。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-减少视觉撕裂"&gt;3. 减少视觉撕裂&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;由于 RAF 在绘制之前触发，能保证动画状态在绘制前更新，减少视觉撕裂和跳帧现象。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;setTimeout 可能导致更新与渲染不同步，画面不连贯。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="三总结"&gt;三、总结&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特点&lt;/th&gt;
&lt;th&gt;requestAnimationFrame&lt;/th&gt;
&lt;th&gt;setTimeout&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;执行时机&lt;/td&gt;
&lt;td&gt;渲染帧开始前（绘制前）&lt;/td&gt;
&lt;td&gt;指定时间后，非渲染同步&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;帧率同步&lt;/td&gt;
&lt;td&gt;与显示器刷新率同步，平滑动画&lt;/td&gt;
&lt;td&gt;不保证同步，可能导致跳帧&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;性能优化&lt;/td&gt;
&lt;td&gt;后台标签页自动暂停，节约资源&lt;/td&gt;
&lt;td&gt;即使后台也运行，浪费性能&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;视觉效果&lt;/td&gt;
&lt;td&gt;减少撕裂，动画更流畅&lt;/td&gt;
&lt;td&gt;易出现撕裂和卡顿&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-13fa8706221f"&gt;10. 在布局（Layout）和绘制（Paint）阶段，浏览器如何避免不必要的重排（Reflow）和重绘（Repaint）&lt;/h2&gt;
&lt;h3 id="题目要点-9"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;明确重排与重绘的区别和性能影响&lt;br&gt;&lt;/li&gt;
&lt;li&gt;介绍浏览器批量更新、延迟计算和图层合成机制&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合实例说明如何避免强制同步布局&lt;br&gt;&lt;/li&gt;
&lt;li&gt;总结开发中避免不必要重排重绘的具体技巧和建议&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点-1"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-理解重排和重绘的区别及性能影响"&gt;● 理解重排和重绘的区别及性能影响&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;考察对浏览器渲染优化关键环节的掌握。&lt;/p&gt;</description></item><item><title>字节-商业化-社招-4年 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-52/round-74/</link><pubDate>Sun, 27 Jul 2025 09:13:11 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-52/round-74/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-52/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-52/round-75/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 全方位解读this、作用域链与闭包、事件循环、call、apply和bind、前端存储、react hooks、react 渲染机制、React函数组件更新&lt;/p&gt;
&lt;p&gt;本轮共 25 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-6827d12cb118"&gt;1. 讲一下你平常使用的React Hooks&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;熟练掌握常用 Hook（useState/useEffect/useRef/useMemo/useCallback/useContext）&lt;/li&gt;
&lt;li&gt;能结合实际项目说明每个 Hook 的使用动机和实现效果&lt;/li&gt;
&lt;li&gt;理解 Hook 的核心机制（闭包陷阱、依赖数组规则、执行时机等）&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-理解-react-hooks-的基本使用场景及原理"&gt;● 理解 React Hooks 的基本使用场景及原理&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;面试官关注候选人是否掌握了常用 Hook 的使用规范与时机。&lt;/p&gt;
&lt;h4 id="-能否结合项目实际表达-hooks-的应用能力"&gt;● 能否结合项目实际表达 Hooks 的应用能力&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;考察是否具备将 React 函数组件与 Hooks 结合的实际经验与思维能力。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h3 id="一常用-react-hooks-介绍"&gt;一、常用 React Hooks 介绍&lt;/h3&gt;
&lt;h4 id="1-usestate--管理组件内部状态"&gt;1. &lt;code&gt;useState&lt;/code&gt; —— 管理组件内部状态&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;功能&lt;/strong&gt;：定义响应式的本地状态。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;典型使用场景&lt;/strong&gt;：表单输入值、按钮开关、局部 UI 状态等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; [&lt;span style="color:#a6e22e"&gt;count&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;setCount&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;useState&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h4 id="2-useeffect--副作用逻辑处理"&gt;2. &lt;code&gt;useEffect&lt;/code&gt; —— 副作用逻辑处理&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;功能&lt;/strong&gt;：用于处理副作用逻辑，如数据请求、DOM 操作、订阅事件等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;依赖数组决定副作用执行时机&lt;/strong&gt;。&lt;/p&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;/li&gt;
&lt;li&gt;监听某个状态变化触发逻辑（依赖项更新）&lt;/li&gt;
&lt;li&gt;组件卸载时清理订阅（返回 cleanup 函数）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;useEffect&lt;/span&gt;(() =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;setInterval&lt;/span&gt;(() =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;tick&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }, &lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; () =&amp;gt; &lt;span style="color:#a6e22e"&gt;clearInterval&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}, []);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h4 id="3-useref--获取-dom-或存储跨渲染变量"&gt;3. &lt;code&gt;useRef&lt;/code&gt; —— 获取 DOM 或存储跨渲染变量&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;功能&lt;/strong&gt;：可以持久保存可变值而不触发组件重新渲染；或获取 DOM 元素引用。&lt;/p&gt;</description></item><item><title>字节-社招-1年 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-51/round-73/</link><pubDate>Fri, 25 Jul 2025 08:13:19 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-51/round-73/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-51/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 事件冒泡、事件捕获、事件委托、浏览器的缓存机制、组件通信、异步组件&lt;/p&gt;
&lt;p&gt;本轮共 21 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-0fc964866a11"&gt;1. 实现数组里的拍平 数组本身的拍平&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;递归遍历数组并合并结果。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;判断元素类型是否为数组。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;结合ES6 flat方法提升效率。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-理解递归与数组操作"&gt;● 理解递归与数组操作&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;考察候选人对递归处理嵌套数据结构的能力。&lt;/p&gt;
&lt;h4 id="-掌握es6及新特性如flat"&gt;● 掌握ES6及新特性（如flat）&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;能结合不同方案解决扁平化问题。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * 递归实现数组拍平
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @param {Array} arr - 待拍平数组，可能嵌套多层
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * @returns {Array} - 扁平后的数组
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;flatten&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;item&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;of&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (Array.&lt;span style="color:#a6e22e"&gt;isArray&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;item&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;concat&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;flatten&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;item&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;item&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或者使用ES6内置方法（只拍平一层）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;flatOnce&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;flat&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ES2019+ 支持深度拍平：&lt;/p&gt;</description></item><item><title>腾讯-CDG-暑期实习 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-50/round-72/</link><pubDate>Fri, 25 Jul 2025 07:46:26 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-50/round-72/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-50/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 22 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-cd4f699b78ff"&gt;1. 编写一个函数解析URL，提取其中的协议、域名、路径和查询参数&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;URL 结构 / URL API 使用 / 查询参数处理 / 错误处理&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-理解-url-结构及其组成部分"&gt;● 理解 URL 结构及其组成部分&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;面试官关注候选人是否熟悉 URL 的协议（scheme）、域名（host）、路径（path）、查询参数（query）等基本组成。&lt;/p&gt;
&lt;h4 id="-掌握字符串处理和正则表达式技巧"&gt;● 掌握字符串处理和正则表达式技巧&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;是否能用合适的方法提取各部分信息。&lt;/p&gt;
&lt;h4 id="-能写出健壮且兼容性好的解析函数"&gt;● 能写出健壮且兼容性好的解析函数&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;考虑边界条件和异常输入。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h4 id="原理说明"&gt;原理说明&lt;/h4&gt;
&lt;p&gt;URL 由以下几部分构成（简化版）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;协议://域名\[:端口]/路径\[?查询参数]\[#锚点]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;协议（scheme）&lt;/strong&gt;：如 &lt;code&gt;http&lt;/code&gt;、&lt;code&gt;https&lt;/code&gt;、&lt;code&gt;ftp&lt;/code&gt; 等；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;域名（host）&lt;/strong&gt;：主机名或 IP 地址；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;路径（path）&lt;/strong&gt;：服务器资源路径；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;查询参数（query）&lt;/strong&gt;：&lt;code&gt;key=value&lt;/code&gt; 形式，多个参数用 &lt;code&gt;&amp;amp;&lt;/code&gt; 分隔。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;解析时重点提取协议、域名、路径和查询参数。&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="核心代码示例javascript"&gt;核心代码示例（JavaScript）&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;parseURL&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;url&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;urlObj&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;URL&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;url&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 提取协议，去掉末尾冒号
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;protocol&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;urlObj&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;protocol&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;replace&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 域名（包含端口，如果有）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;host&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;urlObj&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;host&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 路径
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;path&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;urlObj&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;pathname&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 查询参数转成对象
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;queryParams&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;urlObj&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;searchParams&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;((&lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;queryParams&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;protocol&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;host&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;path&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;queryParams&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;error&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Error(&lt;span style="color:#e6db74"&gt;&amp;#39;Invalid URL&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id="使用示例"&gt;使用示例&lt;/h5&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;url&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;https://www.example.com:8080/path/to/page?name=alice&amp;amp;age=25&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;parseURL&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;url&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; protocol: &amp;#34;https&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; host: &amp;#34;www.example.com:8080&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; path: &amp;#34;/path/to/page&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; queryParams: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; name: &amp;#34;alice&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; age: &amp;#34;25&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h4 id="常见误区或面试陷阱"&gt;常见误区或面试陷阱&lt;/h4&gt;
&lt;h5 id="误区一使用正则解析复杂-url"&gt;误区一：使用正则解析复杂 URL&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;正则难以覆盖各种边界情况，不建议复杂场景使用；&lt;/li&gt;
&lt;li&gt;推荐使用浏览器内置的 &lt;code&gt;URL&lt;/code&gt; 类。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="误区二忽略端口号"&gt;误区二：忽略端口号&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;域名部分可能包含端口，直接取 &lt;code&gt;hostname&lt;/code&gt; 会缺失端口。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="误区三查询参数未统一处理"&gt;误区三：查询参数未统一处理&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;查询参数可能重复，需根据需求选择保存方式（这里简单取最后一个值）。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="总结回顾"&gt;总结回顾&lt;/h3&gt;
&lt;p&gt;解析 URL 推荐使用原生 &lt;code&gt;URL&lt;/code&gt; API，简洁且兼容性好。重点提取协议、域名（含端口）、路径和查询参数，并把查询参数转换为对象方便后续使用。&lt;/p&gt;</description></item><item><title>腾讯-音乐 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-49/round-71/</link><pubDate>Fri, 25 Jul 2025 07:26:12 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-49/round-71/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-49/round-70/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-49/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 9 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-c0f7694a5106"&gt;1. 讲一下“智慧医疗系统”项目背景、目标以及你主要负责的模块&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;结合自己简历上的一个亮点项目准备&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;结合自己简历上的一个亮点项目准备&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-dc8c6233-f645-444c-8e31-f18bc3f5244f"&gt;2. 什么是响应式设计？响应式设计的基本原理是什么？如何进行实现？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/dc8c6233-f645-444c-8e31-f18bc3f5244f"&gt;什么是响应式设计？响应式设计的基本原理是什么？如何进行实现？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;响应式设计（Responsive Design）是一种网页设计方法，旨在使网页在各种设备和屏幕尺寸上都能提供良好的用户体验。响应式设计通过使用流式布局、弹性网格和媒体查询，使得网页能够根据不同的设备特性（如屏幕大小、分辨率、方向等）自动调整其布局和内容。&lt;/p&gt;
&lt;h3 id="响应式设计的基本原理"&gt;响应式设计的基本原理&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;流式布局（Fluid Layouts）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用相对单位（如百分比、&lt;code&gt;vw&lt;/code&gt;、&lt;code&gt;vh&lt;/code&gt;）而不是绝对单位（如像素），使得网页布局能够根据容器的宽度自动调整。例如，使用百分比设置宽度，可以让列宽度随着屏幕尺寸的变化而变化。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;弹性网格（Flexible Grid Systems）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;利用网格系统设计布局，将页面划分为多个灵活的区域。这些区域能够根据屏幕尺寸调整大小，从而实现不同设备上的适配。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;媒体查询（Media Queries）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 CSS 媒体查询，根据设备的特性（如宽度、高度、分辨率等）应用不同的样式规则。媒体查询可以针对不同的屏幕尺寸、方向（横向或纵向）等条件设置样式。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="如何实现响应式设计"&gt;如何实现响应式设计&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;在 CSS 中使用相对单位（如 &lt;code&gt;%&lt;/code&gt;, &lt;code&gt;em&lt;/code&gt;, &lt;code&gt;rem&lt;/code&gt;, &lt;code&gt;vh&lt;/code&gt;, &lt;code&gt;vw&lt;/code&gt;）设置宽度和高度。例如：
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;container&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 宽度为容器的 80% */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;
&lt;ul&gt;
&lt;li&gt;创建一个弹性网格布局，可以使用 CSS Grid 或 Flexbox。例如，使用 Flexbox：
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;container&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;display&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;flex&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;flex-wrap&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;wrap&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 自动换行 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;item&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;flex&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;300&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 自动调整宽度，最小宽度为 300px */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;margin&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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>腾讯-音乐 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-49/round-70/</link><pubDate>Fri, 25 Jul 2025 07:17:59 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-49/round-70/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-49/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-49/round-71/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 动画、响应式设计、事件循环、跨域、浏览器的缓存机制、列表和key、生命周期&lt;/p&gt;
&lt;p&gt;本轮共 16 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-e6ed37c33d4d"&gt;1. 请介绍一下你的科研项目经历。&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;STAR法则&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;结合自身经历展开&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-d857524704a9"&gt;2. 为什么选择前端开发作为你的职业方向？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;无&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;无&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-4c8c7e9b248f"&gt;3. 你学习前端开发有多久了？谈谈你的学习经历。&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;无&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;无&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-5be066a0fa02"&gt;4. 如何使用CSS实现动画效果？举个项目中的例子。&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;transition/animation 区别 / transform+opacity / 项目落地举例 / 动画性能&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-css-动画相关属性与原理掌握"&gt;● CSS 动画相关属性与原理掌握&lt;/h4&gt;
&lt;p&gt;面试官希望了解候选人是否掌握 CSS 动画的基本实现方式，包括 &lt;code&gt;transition&lt;/code&gt;、&lt;code&gt;animation&lt;/code&gt;、关键帧、补间函数等。&lt;/p&gt;
&lt;h4 id="-能结合项目场景举例说明"&gt;● 能结合项目场景举例说明&lt;/h4&gt;
&lt;p&gt;不仅要懂 API，更重要的是知道什么时候使用、为什么使用，是否有性能考量和交互体验意识。&lt;/p&gt;
&lt;h4 id="-对动画效果的性能与体验理解"&gt;● 对动画效果的性能与体验理解&lt;/h4&gt;
&lt;p&gt;是否清楚哪些动画对性能影响大，哪些动画适合用 CSS 实现，如何避免卡顿或丢帧。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h4 id="原理说明"&gt;原理说明&lt;/h4&gt;
&lt;h5 id="一css-动画的实现方式"&gt;一、CSS 动画的实现方式&lt;/h5&gt;
&lt;p&gt;CSS 提供了两类动画机制：&lt;/p&gt;
&lt;h6 id="1-过渡动画transition"&gt;1. 过渡动画（transition）&lt;/h6&gt;
&lt;p&gt;通过 &lt;code&gt;transition&lt;/code&gt; 属性定义在样式变更时自动补间的动画：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;button&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;transition&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;all&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.3&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;s&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ease-in-out&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;特点：&lt;/p&gt;</description></item><item><title>腾讯云-实习 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-48/round-69/</link><pubDate>Fri, 25 Jul 2025 05:48:41 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-48/round-69/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-48/round-68/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-48/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 二面，以实际场景、设计架构出发，考察候选人的综合知识和深度&lt;/p&gt;
&lt;p&gt;本轮共 11 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-abdee4b51af2"&gt;1. 描述一个你解决的复杂性能优化案例（指标提升与具体手段）&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;按照START法则来讲解&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;结合自身项目经历来说&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-a58fbf88961e"&gt;2. React/Vue框架设计思想对比（如数据绑定、虚拟DOM）&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;React/Vue/设计思想/双向绑定/单向数据流/虚拟DOM/Fiber/Proxy/模板编译&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h4 id="一考察点"&gt;一、考察点&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;是否理解 React 和 Vue 的设计理念与核心架构区别&lt;/li&gt;
&lt;li&gt;是否能准确比较两者在数据绑定、组件化、更新机制上的异同&lt;/li&gt;
&lt;li&gt;是否理解虚拟 DOM 的实现方式及两者的优化策略&lt;/li&gt;
&lt;li&gt;是否能结合实际项目场景，选择合适的框架思路&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="二参考答案"&gt;二、参考答案&lt;/h4&gt;
&lt;h5 id="11-核心设计思想对比"&gt;1.1 核心设计思想对比&lt;/h5&gt;
&lt;hr&gt;
&lt;h3 id="-一框架理念对比"&gt;✅ 一、框架理念对比&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;Vue&lt;/th&gt;
&lt;th&gt;React&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;核心理念&lt;/td&gt;
&lt;td&gt;渐进式框架，关注视图层&lt;/td&gt;
&lt;td&gt;函数式 + 声明式 UI，构建 UI 的库&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习曲线&lt;/td&gt;
&lt;td&gt;简洁、直观、HTML+JS 分离&lt;/td&gt;
&lt;td&gt;更偏工程化，需要理解 JSX、Hooks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;模板机制&lt;/td&gt;
&lt;td&gt;模板语法（HTML-like） + 指令（v-xxx）&lt;/td&gt;
&lt;td&gt;使用 JSX 全部由 JS 描述 UI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="-二数据绑定机制"&gt;✅ 二、数据绑定机制&lt;/h3&gt;
&lt;h4 id="-vue"&gt;🔹 Vue&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;使用响应式系统（Vue2 的 &lt;code&gt;Object.defineProperty&lt;/code&gt;，Vue3 的 &lt;code&gt;Proxy&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;支持 &lt;strong&gt;双向绑定&lt;/strong&gt;（如 &lt;code&gt;v-model&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;模板中变量变化会自动更新视图，开发体验友好。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="-react"&gt;🔹 React&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;数据是不可变状态（immutable state）；&lt;/li&gt;
&lt;li&gt;单向数据流（父 → 子）；&lt;/li&gt;
&lt;li&gt;利用 &lt;code&gt;setState()&lt;/code&gt; 或 &lt;code&gt;useState()&lt;/code&gt; 触发重新渲染；&lt;/li&gt;
&lt;li&gt;更强调“以状态驱动视图”，需要手动绑定与更新。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="-三虚拟-dom-实现与-diff-策略"&gt;✅ 三、虚拟 DOM 实现与 Diff 策略&lt;/h3&gt;
&lt;h4 id="vue"&gt;Vue&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;自主构建 Virtual DOM（与模板语法结合）；&lt;/li&gt;
&lt;li&gt;Vue2 使用双端比较 diff 算法；&lt;/li&gt;
&lt;li&gt;Vue3 引入 &lt;strong&gt;静态提升 + Block Tree + 最长递增子序列（LIS）&lt;/strong&gt;，减少不必要 patch；&lt;/li&gt;
&lt;li&gt;编译优化层更强，template 更容易静态分析。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="react"&gt;React&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;以函数式组件为主，使用 JSX 构建虚拟 DOM；&lt;/li&gt;
&lt;li&gt;使用 Fiber 架构重构更新机制，实现异步可中断渲染；&lt;/li&gt;
&lt;li&gt;更新优先级调度（如 &lt;code&gt;startTransition&lt;/code&gt;）是核心优势之一；&lt;/li&gt;
&lt;li&gt;Diff 算法基于同层比较 + key 优化，机制稳定。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="-四组件设计与状态管理"&gt;✅ 四、组件设计与状态管理&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;对比项&lt;/th&gt;
&lt;th&gt;Vue&lt;/th&gt;
&lt;th&gt;React&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;状态管理&lt;/td&gt;
&lt;td&gt;Vuex（Vue2） / Pinia（Vue3）&lt;/td&gt;
&lt;td&gt;Redux / Context API / Zustand 等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;生命周期&lt;/td&gt;
&lt;td&gt;Options API（Vue2）/ Composition API（Vue3）&lt;/td&gt;
&lt;td&gt;类组件生命周期 / 函数组件 Hooks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;组件通信&lt;/td&gt;
&lt;td&gt;props / emit / provide/inject&lt;/td&gt;
&lt;td&gt;props / context / props drilling&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-af38f8a1c96b"&gt;3. React Hooks闭包陷阱的产生原因？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;React Hooks/闭包陷阱/useEffect/useRef/setInterval/函数式更新/stale closure&lt;/p&gt;</description></item><item><title>腾讯云-实习 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-48/round-68/</link><pubDate>Fri, 25 Jul 2025 02:54:17 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-48/round-68/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-48/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-48/round-69/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 一面，更多考察的是八股文的基础知识&lt;/p&gt;
&lt;p&gt;本轮共 20 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-a75b1e9d-9359-47b0-8614-1088eee4b085"&gt;1. 什么是 HTML 语义化？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/a75b1e9d-9359-47b0-8614-1088eee4b085"&gt;什么是 HTML 语义化？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;先看下什么是HTML：&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;先看下什么是HTML：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;超文本标记语言（英语：HyperText Markup Language，简称：HTML）是一种用于创建网页的标准标记语言。
HTML元素是构建网站的基石。HTML允许嵌入图像与对象，并且可以用于创建交互式表单，它被用来结构化信息——例如标题、段落和列表等等，也可用来在一定程度上描述文档的外观和语义。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;那么如何理解 Web 语义化？&lt;/p&gt;
&lt;p&gt;通俗的来讲就是从代码上来展示页面的结构，而不是从最终视觉上来展示结构。&lt;/p&gt;
&lt;p&gt;单纯的HTML代码是不带任何样式的只是用来标记这一段是标题、这一块是代码、那一个是要强调的内容等等。&lt;/p&gt;
&lt;p&gt;但是为什么我们只写HTML在浏览器中不同的标签也是有不同的样式呢？&lt;/p&gt;
&lt;p&gt;那是因为各个浏览器都自带的有相应标签的默认样式，为了方便在没有设定样式的情况下友好的展示页面。&lt;/p&gt;
&lt;p&gt;良好的语义化代码可以直接从代码上就能看出来那一块到底是要表达什么内容。&lt;/p&gt;
&lt;h2 id="为什么要使用语义化标签"&gt;为什么要使用语义化标签？&lt;/h2&gt;
&lt;p&gt;有伙伴会认为，我用DIV+CSS也能做出来一样的效果，虽然单纯看实现效果，两者并没有什么区别。&lt;/p&gt;
&lt;p&gt;但是页面不止是给人看的，机器也要看爬虫也要看，网页结构更清晰方便开发维护。&lt;/p&gt;
&lt;p&gt;特别是在网络或其他原因页面样式文件丢失的时候，良好语义结构组成的页面，肯定比全是div的页面对用户更友好。&lt;/p&gt;
&lt;p&gt;总结下语义化的优点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;标签语义化有助于构架良好的HTML结构，有利于搜索引擎的建立索引、抓取。简单来说。&lt;/li&gt;
&lt;li&gt;有利于不同设备的解析（屏幕阅读器，盲人阅读器等）&lt;/li&gt;
&lt;li&gt;有利于构建清晰的机构，有利于团队的开发、维护&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-c66a747cbe22"&gt;2. CSS盒模型、Flex布局与Grid布局的区别及适用场景&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;CSS盒模型/box-sizing/Flex布局/Grid布局/一维 vs 二维/布局适用场景/页面结构设计&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h4 id="一考察点"&gt;一、考察点&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;是否掌握 CSS 中盒模型的基本概念及布局行为&lt;/li&gt;
&lt;li&gt;Flex 与 Grid 的本质区别及使用场景是否清晰&lt;/li&gt;
&lt;li&gt;能否结合实际 UI 场景选择最合适的布局方式&lt;/li&gt;
&lt;li&gt;是否理解布局系统与页面结构解耦的设计思想&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="二参考答案"&gt;二、参考答案&lt;/h4&gt;
&lt;h5 id="11-原理说明"&gt;1.1 原理说明&lt;/h5&gt;
&lt;hr&gt;
&lt;h3 id="-一css-盒模型box-model"&gt;✅ 一、CSS 盒模型（Box Model）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;：所有 HTML 元素都可以看作一个矩形盒子，由以下四层组成：&lt;/p&gt;</description></item><item><title>百度-百度云-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-47/round-65/</link><pubDate>Thu, 24 Jul 2025 15:06:51 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-47/round-65/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-47/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-47/round-66/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本轮面试注重基础知识的掌握与表达，涵盖了前端语言、框架原理、计算机基础、网络协议、数据库设计、加密安全等内容，兼顾技术深度与广度。&lt;/p&gt;
&lt;p&gt;本轮共 16 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-d5f454c4c77e"&gt;1. 面向对象和面向程序设计的主要区别&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;面向过程以过程为中心，强调顺序执行逻辑，适合小型程序；&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;ul&gt;
&lt;li&gt;面向过程以过程为中心，强调顺序执行逻辑，适合小型程序；&lt;/li&gt;
&lt;li&gt;面向对象以对象和行为抽象为中心，强调封装、继承、多态，适合复杂系统的可维护性与复用性设计。&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-1e59a267c882"&gt;2. 面向对象的三大特性&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;封装隐藏内部实现、继承提高复用性、多态通过统一接口实现行为差异，三者是构建大型系统的基础。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;封装隐藏内部实现、继承提高复用性、多态通过统一接口实现行为差异，三者是构建大型系统的基础。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-252664a5-1524-46f0-b6ae-ae7e2874f6e2"&gt;3. 开发的过程中你用到过哪些设计模式？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/252664a5-1524-46f0-b6ae-ae7e2874f6e2"&gt;开发的过程中你用到过哪些设计模式？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;设计模式是一种被广泛接受并经过验证的面向对象软件开发中的最佳实践。它们提供了一套解决常见问题的可重用设计方案。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;设计模式是一种被广泛接受并经过验证的面向对象软件开发中的最佳实践。它们提供了一套解决常见问题的可重用设计方案。&lt;/p&gt;
&lt;p&gt;以下是一些常用的设计模式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;单例模式（Singleton）&lt;/strong&gt;：确保一个类只有一个实例，并提供全局访问点来获取该实例。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;工厂模式（Factory）&lt;/strong&gt;：通过工厂方法创建对象，而不是直接使用&lt;code&gt;new&lt;/code&gt;操作符。这样可以隐藏具体实现，并根据需要创建所需类型的对象。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;观察者模式（Observer）&lt;/strong&gt;：定义了一种一对多的依赖关系，当一个对象状态发生改变时，它的所有依赖者（观察者）都会收到通知并自动更新。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;装饰器模式（Decorator）&lt;/strong&gt;：动态地将责任附加到对象上。通过将对象包装在装饰器对象中，可以在运行时为对象添加新的行为。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;策略模式（Strategy）&lt;/strong&gt;：定义了一系列算法，将每个算法封装起来并使它们可以相互替换。策略模式可以让算法独立于客户端而变化。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;适配器模式（Adapter）&lt;/strong&gt;：将一个类的接口转换成客户端所期望的另一个接口。适配器模式使得原本由于接口不匹配而无法一起工作的类可以协同工作。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;每个设计模式都有其特定的应用场景和优缺点，可以根据具体情况来选择使用。设计模式可以提高代码结构的灵活性、可维护性和可扩展性，并促进重用和解耦。然而，需要根据实际需求慎重选择和应用设计模式，避免过度设计或不必要的复杂性。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-6e24fdf44b3a"&gt;4. JavaScript 中引用数据类型和基本数据类型&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;基本类型包括 Number、String 等，按值传递；引用类型如 Object、Array 按地址传递，赋值为浅拷贝。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;基本类型包括 Number、String 等，按值传递；引用类型如 Object、Array 按地址传递，赋值为浅拷贝。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-da1881cc-64b9-40f8-8a25-a6256c1349ed"&gt;5. 谈谈对Vue中双向绑定的理解&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/da1881cc-64b9-40f8-8a25-a6256c1349ed"&gt;谈谈对Vue中双向绑定的理解&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-4"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;Vue中的双向绑定是其核心特性之一，它极大地简化了数据在视图（View）和模型（Model）之间的同步过程。双向绑定意味着当数据发生变化时，视图会自动更新以反映这些变化，反之亦然，用户在视图上的操作（如输入）也会自动更新到数据中。&lt;/p&gt;
&lt;h4 id="实现原理"&gt;实现原理&lt;/h4&gt;
&lt;p&gt;Vue的双向绑定主要依赖于其响应式系统（Reactivity System）和模板引擎（Template Engine）。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;响应式系统&lt;/strong&gt;：Vue使用Object.defineProperty（在Vue 3中使用了Proxy）来劫持（或说“代理”）对象的getter和setter。当组件的data中的属性被访问或修改时，Vue会拦截这些操作，并执行相应的依赖更新逻辑。这样，Vue就能追踪到数据的变化，并在需要时更新视图。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;模板引擎&lt;/strong&gt;：Vue的模板引擎使用基于HTML的模板语法，允许开发者声明式地将DOM绑定到底层Vue实例的数据上。当数据变化时，Vue的模板引擎会重新渲染模板，生成新的虚拟DOM树，并通过高效的DOM diff算法更新真实的DOM，以反映数据的最新状态。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一什么是双向绑定"&gt;一、什么是双向绑定&lt;/h2&gt;
&lt;p&gt;我们先从单向绑定切入单向绑定非常简单，就是把&lt;code&gt;Model&lt;/code&gt;绑定到&lt;code&gt;View&lt;/code&gt;，当我们用&lt;code&gt;JavaScript&lt;/code&gt;代码更新&lt;code&gt;Model&lt;/code&gt;时，&lt;code&gt;View&lt;/code&gt;就会自动更新双向绑定就很容易联想到了，在单向绑定的基础上，用户更新了&lt;code&gt;View&lt;/code&gt;，&lt;code&gt;Model&lt;/code&gt;的数据也自动被更新了，这种情况就是双向绑定举个栗子&lt;/p&gt;</description></item><item><title>百度-百度云-校招 · 第 1 轮 · 三面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-47/round-67/</link><pubDate>Thu, 24 Jul 2025 15:06:51 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-47/round-67/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-47/round-66/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-47/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 三面偏重项目经历、思维深度与工程解决方案，兼顾产品理解与算法能力。&lt;/p&gt;
&lt;p&gt;本轮共 6 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-65ee4eaa38e8"&gt;1. 讲一下之前的实习经历，主要负责什么工作，你们团队是做什么的？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;在回答实习经历时，可以遵循：
&lt;strong&gt;“团队是做什么的 → 自己负责了什么 → 过程中遇到的挑战 → 最终的结果和成长”&lt;/strong&gt;。
这样既能让面试官清楚地看到候选人的贡献，也能体现出对团队目标的理解和自身成长路径的清晰度。&lt;/p&gt;
&lt;p&gt;要不要我帮你准备几个&lt;strong&gt;可直接套用的实习经历表述范例&lt;/strong&gt;，比如业务团队和前端基础设施团队两个版本？&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;这个问题本质上考察的是&lt;strong&gt;候选人能否清晰表达实习经历的价值&lt;/strong&gt;，以及是否能将个人的工作与团队目标联系起来。回答时既要避免流水账式的叙述，也要避免过度拔高，而是重点体现&lt;strong&gt;做过什么、为什么做、产生了什么影响&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="回答思路"&gt;回答思路&lt;/h3&gt;
&lt;h4 id="1-团队定位与职责"&gt;1. 团队定位与职责&lt;/h4&gt;
&lt;p&gt;先交代团队是做什么的，比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;是否负责某条具体业务线（例如地图、金融、电商、内容平台）；&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;h4 id="2-个人负责的工作"&gt;2. 个人负责的工作&lt;/h4&gt;
&lt;p&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;协作方式&lt;/strong&gt;：是否需要和后端、测试、设计配合，是否参与需求评审或接口联调；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;挑战与亮点&lt;/strong&gt;：是否遇到过性能瓶颈、复杂交互、数据量大等问题，是否提出了改进方案。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;避免简单说“写页面、改 bug”，而是强调“通过实现某个功能/优化某处性能，解决了某类问题”。&lt;/p&gt;
&lt;h4 id="3-收获与成长"&gt;3. 收获与成长&lt;/h4&gt;
&lt;p&gt;最后点出在实习期间的成长：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;是否熟悉了前端项目的完整研发流程（需求 → 开发 → 测试 → 上线 → 复盘）；&lt;/li&gt;
&lt;li&gt;是否积累了在团队协作、代码规范、工程化工具上的经验；&lt;/li&gt;
&lt;li&gt;是否提升了技术能力，比如掌握了某些框架或优化手段。&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-a51e70b485ed"&gt;2. 在工作中遇到过什么问题，是怎么解决的？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;这个问题的最佳回答路径是：
&lt;strong&gt;“提出一个具体问题 → 说明如何分析定位 → 阐述解决过程和思考 → 总结结果和反思”&lt;/strong&gt;。
重点不是问题有多难，而是展现出遇事冷静分析、推动落地并能沉淀经验的能力。&lt;/p&gt;
&lt;p&gt;要不要我帮你列几个&lt;strong&gt;可以直接在面试里使用的典型案例场景&lt;/strong&gt;，比如“性能优化”、“构建优化”、“协作问题”三类？&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;这个问题考察的是候选人的&lt;strong&gt;问题意识、分析能力、解决路径和复盘能力&lt;/strong&gt;。面试官关注的不是问题本身多么“高大上”，而是能否体现出&lt;strong&gt;逻辑清晰、方案合理、结果正向&lt;/strong&gt;。&lt;/p&gt;</description></item><item><title>百度-百度云-校招 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-47/round-66/</link><pubDate>Thu, 24 Jul 2025 15:06:51 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-47/round-66/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-47/round-65/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-47/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-47/round-67/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 二面重点考察前端框架理解与性能优化能力，同时关注工程化处理思维和大规模数据处理能力。&lt;/p&gt;
&lt;p&gt;本轮共 10 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-e266174d498c"&gt;1. 元素隐藏的三种方法（display:none、visibility:hidden、opacity:0）及其区别&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;display: none&lt;/code&gt;：元素不在文档流中，不占位，无法响应事件。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;display: none&lt;/code&gt;：元素不在文档流中，不占位，无法响应事件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;visibility: hidden&lt;/code&gt;：占位但不可见，无法响应事件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;opacity: 0&lt;/code&gt;：占位且可响应事件（需用 &lt;code&gt;pointer-events: none&lt;/code&gt; 避免）。&lt;/li&gt;
&lt;/ol&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-8f3da0a071c6"&gt;2. display:none是否影响DOM渲染性能？如何用CSS实现淡出动画？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;display:none&lt;/code&gt; 会从渲染树中移除，提升性能，但不能用于动画过渡。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;display:none&lt;/code&gt; 会从渲染树中移除，提升性能，但不能用于动画过渡。&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;opacity + transition&lt;/code&gt; 实现淡出，再用 JS 延迟设置 &lt;code&gt;display:none&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-ac93c5c2773f"&gt;3. &lt;code&gt;Array.from({ length: 5 }, (v, i) =&amp;gt; i * 2)&lt;/code&gt; 的输出是什么？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;输出 &lt;code&gt;[0, 2, 4, 6, 8]&lt;/code&gt;。构造一个长度为 5 的数组，并通过索引乘以 2 填充。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;输出 &lt;code&gt;[0, 2, 4, 6, 8]&lt;/code&gt;。构造一个长度为 5 的数组，并通过索引乘以 2 填充。&lt;/p&gt;</description></item><item><title>美团-优选-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-46/round-63/</link><pubDate>Tue, 22 Jul 2025 09:24:00 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-46/round-63/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-46/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-46/round-64/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察前端基础知识、项目经验以及问题解决能力。&lt;/p&gt;
&lt;p&gt;本轮共 15 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-8e1cd6867be4"&gt;1. 介绍一下你参与过的一个重要项目，包括项目背景、目标、技术栈以及你的角色和主要职责。&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;该题是主观型问题，没有唯一标准答案。&lt;/li&gt;
&lt;li&gt;面试官主要考察答题者的表达能力、思路系统性、技术理解和复盘能力。&lt;/li&gt;
&lt;li&gt;建议答题结构：首先概括项目，然后详细阐述项目背景、目标、技术栈，最后具体说明个人角色、职责与贡献。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我的一个重要项目是&amp;quot;企业级智能客服系统前端优化与重构&amp;quot;。这个项目主要目标是提升现有客服系统的用户体验和性能，解决老旧技术栈带来的开发维护效率低下问题，并支持后续功能迭代。&lt;/p&gt;
&lt;p&gt;项目背景是，公司原有的客服系统基于jQuery和少量原生JS开发，代码耦合度高，组件复用性差，加载速度慢，且难以适应移动端多渠道接入的需求。用户反馈系统卡顿、响应慢，客服人员操作效率受影响。因此，我们团队决定对前端进行一次彻底的优化与重构，旨在将其升级为一套现代化、高性能、易于扩展的Web应用。&lt;/p&gt;
&lt;p&gt;我在这个项目中担任核心前端开发，主要职责包括：参与技术选型与架构设计讨论；负责核心模块（如聊天窗口、工单管理、智能问答）的组件化开发和性能优化；协调前后端接口联调；编写单元测试和端到端测试；以及进行线上问题的快速响应和修复。在技术栈上，我们选择了React作为主框架，配合TypeScript进行类型管理，使用Redux进行状态管理，Webpack进行模块打包，并引入Ant Design作为UI组件库，以加速开发效率并保证UI一致性。&lt;/p&gt;
&lt;p&gt;具体来说，我主导了聊天模块的重构，将其从原来复杂的DOM操作和回调函数地狱，改造为基于React组件和Hooks的声明式UI。通过引入虚拟列表技术，解决了海量消息导致页面卡顿的问题，使得聊天记录即使达到上万条也能保持流畅滚动。此外，我还优化了消息发送机制，利用WebSocket实现了实时消息推送，减少了轮询开销。在性能方面，通过代码分割、图片懒加载等手段，将首屏加载时间从原来的8秒优化到2秒以内。整个重构过程不仅提升了系统的稳定性和用户满意度，也大大降低了后续功能开发的门槛和时间成本，为团队技术栈升级和业务发展奠定了坚实基础。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-36be8f8e9a6f"&gt;2. 在项目中，有没有遇到过什么技术难题？你是如何解决的？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;该题是主观型问题，没有唯一标准答案。&lt;/li&gt;
&lt;li&gt;面试官主要考察答题者的技术深度、问题解决能力、逻辑思维和学习能力。&lt;/li&gt;
&lt;li&gt;建议答题结构：首先描述一个具体的技术难题，然后阐述你分析问题、寻找解决方案的过程，最后说明解决方案的细节、效果和你的思考。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在之前负责的&amp;quot;企业级智能客服系统前端优化与重构&amp;quot;项目中，我们遇到了一个比较棘手的技术难题，就是&lt;strong&gt;前端内存占用过高导致页面卡顿和崩溃&lt;/strong&gt;的问题。&lt;/p&gt;
&lt;p&gt;这个系统有一个核心功能是聊天记录展示，用户可能会长时间使用，导致累积大量消息。最初的版本，每条消息都是一个独立的DOM节点，当消息数量达到几千甚至上万条时，DOM节点数量急剧增加，导致浏览器内存占用飙升，页面滚动变得非常卡顿，甚至在一些配置较低的设备上直接崩溃。用户反馈非常强烈，严重影响了客服人员的工作效率。&lt;/p&gt;
&lt;p&gt;为了解决这个问题，我首先进行了性能分析，通过Chrome开发者工具的Performance和Memory面板，确认了是DOM节点过多和重复渲染导致的内存泄漏和性能瓶颈。随后，我开始研究前端长列表的优化方案，主要考察了**虚拟列表（Virtual List）**技术。虚拟列表的核心思想是只渲染可视区域内的DOM元素，非可视区域的元素进行回收复用，从而大大减少DOM数量。&lt;/p&gt;
&lt;p&gt;具体实施时，我引入了一个成熟的虚拟列表库，并根据项目需求对其进行了定制化开发。首先，需要计算每个列表项的动态高度，因为消息内容可能长短不一，包含图片、表情等不同元素。我采用了一种策略：在首次渲染时估算高度，并在图片加载完成后或内容变化时动态调整。其次，我设计了&amp;quot;缓冲区域&amp;quot;，即在可视区域上下各多渲染一定数量的元素，以保证用户快速滚动时的流畅体验，避免出现白屏。最后，我优化了数据加载逻辑，当用户滚动到列表底部时，只加载下一页数据并追加到虚拟列表的数据源中，而不是重新渲染整个列表。&lt;/p&gt;
&lt;p&gt;通过实施虚拟列表，我们将聊天窗口的DOM节点数量从数万个降低到稳定在几十个到一百个之间，极大地减少了内存占用。实际测试显示，即使加载十万条消息，页面也能保持流畅滚动，响应速度显著提升。这个方案不仅解决了当前的性能痛点，也为系统后续的消息富文本支持、历史记录加载等复杂功能提供了坚实的基础，避免了未来可能出现的类似问题。整个过程中，我学到了如何深入分析前端性能瓶颈，以及如何选择和应用合适的优化技术来解决实际问题。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-2e4de664c4bc"&gt;3. 如果项目中的 token 被窃取了，你会采取哪些措施来应对？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;该题是主观型问题，没有唯一标准答案。&lt;/li&gt;
&lt;li&gt;面试官主要考察答题者对安全问题的认知、应急响应能力和系统性思考。&lt;/li&gt;
&lt;li&gt;建议答题结构：首先说明 token 被窃取的危害，然后从&amp;quot;发现-应对-预防&amp;quot;三个层面阐述具体措施，最后强调持续安全防护的重要性。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;当项目中的 token 被窃取，这无疑是一个严重的安全事件，因为它可能导致用户身份被冒用，数据泄露，甚至对系统造成进一步的破坏。我的应对措施会从紧急响应、事后恢复和长期预防三个层面展开。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;首先是紧急响应和止损。&lt;/strong&gt; 一旦发现 token 存在被窃取的风险或已确认被窃取，最核心的措施是&lt;strong&gt;立即强制所有用户的 token 失效或重置&lt;/strong&gt;。这可以通过后端来实现，比如在数据库中将相关 token 标记为无效，或者更新用户会话状态，迫使其重新登录。同时，我会立即通知受影响的用户（如果可以定位到），告知他们 token 失效并要求重新登录，并建议他们检查个人信息是否有异常。在此期间，还需要暂停或限制可疑IP地址或异常行为的访问，以阻止攻击的进一步扩散。例如，如果发现某个账号在短时间内有大量异常登录尝试或数据请求，应立即锁定该账号并通知用户。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;其次是事后恢复与溯源。&lt;/strong&gt; 在完成紧急止损后，需要立即展开详细的调查和分析，以确定 token 是如何被窃取的，攻击的范围有多大，以及是否有数据泄露或系统被篡改的证据。这包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;日志分析&lt;/strong&gt;：仔细检查服务器访问日志、应用日志和安全日志，查找异常的登录行为、API调用、IP地址或用户代理信息。重点关注 token 签发、刷新和验证的日志。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码审计&lt;/strong&gt;：对可能存在安全漏洞的代码进行审查，例如是否存在XSS漏洞导致前端窃取，或者后端存储、传输 token 的方式是否安全。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用户影响评估&lt;/strong&gt;：评估有多少用户受到影响，以及可能泄露了哪些数据。根据评估结果，制定更详细的恢复计划，例如是否需要回滚某些操作，或者向受影响用户提供进一步的帮助。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;最后是长期预防措施。&lt;/strong&gt; 针对这次事件暴露出的问题，我们需要采取一系列措施来增强系统的整体安全性，防止类似事件再次发生：&lt;/p&gt;</description></item><item><title>美团-优选-校招 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-46/round-64/</link><pubDate>Tue, 22 Jul 2025 09:24:00 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-46/round-64/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-46/round-63/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-46/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 16 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-3635fccde573"&gt;1. 为什么大二就开始实习呢？当时是怎么考虑的？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;说明该题是主观型问题，不考&amp;quot;唯一标准答案&amp;quot;。&lt;/li&gt;
&lt;li&gt;面试官主要考察答题者的表达能力、思路系统性、技术理解和复盘能力。&lt;/li&gt;
&lt;li&gt;答题结构建议：首先说明实习的初衷和驱动力，然后结合个人成长和职业规划阐述实习带来的收获和影响，最后可以适当提及对未来发展的思考。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;其实，我选择在大二就开始实习，主要是出于对前端开发浓厚的热情和对实践经验的渴望。当时在学校学习理论知识时，我逐渐意识到，真正的项目开发与课堂学习存在很大差异。我非常希望能够尽早接触到真实的项目环境，了解企业级开发的流程、规范以及团队协作的方式。&lt;/p&gt;
&lt;p&gt;我的考虑是多方面的。首先，我想通过实习来验证自己所学知识的实用性，并在实际工作中发现自身的不足，从而有针对性地提升技能。其次，我相信尽早融入职场能够帮助我更好地理解行业需求，明确未来的职业发展方向。例如，在第一个实习项目中，我参与了一个电商后台管理系统的开发，亲身体验了从需求分析到功能上线的全过程，这让我对前端开发的整体链路有了更深刻的理解，也意识到代码质量、模块化和组件化在大型项目中的重要性。这段经历不仅提升了我的编码能力，也让我学会了如何与产品、设计、后端团队高效沟通协作。可以说，大二的实习对我而言是一个非常重要的转折点，它让我更早地将理论与实践结合，为后续的学习和职业发展打下了坚实的基础。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-8dea06f03e46"&gt;2. 在实习过程中，有没有发现自己对前端的理解和之前在学校学习时有什么不同？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;说明该题是主观型问题，不考&amp;quot;唯一标准答案&amp;quot;。&lt;/li&gt;
&lt;li&gt;面试官主要考察答题者的表达能力、思路系统性、技术理解和复盘能力。&lt;/li&gt;
&lt;li&gt;答题结构建议：从理论与实践、个人能力成长、团队协作与项目流程、以及对行业理解等几个方面进行对比和阐述。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在实习过程中，我对前端的理解确实发生了很大的转变，与之前在学校学习时有了显著的不同。在学校，我们更多地关注理论知识、算法和数据结构，以及一些基础框架的用法，代码往往是为了实现某个功能点而存在，相对独立且注重单一技术点的掌握。比如，我们可能会花很多时间去学习React的生命周期、Redux的状态管理原理，但很少有机会将其应用到真实的、复杂的业务场景中。&lt;/p&gt;
&lt;p&gt;然而，实习让我意识到，前端开发远不止写代码那么简单。首先，&lt;strong&gt;理论与实践的差异&lt;/strong&gt;：在实际项目中，需要考虑的不仅仅是技术实现，更要关注业务需求、用户体验、性能优化、代码可维护性等多个维度。我学到，一个&amp;quot;好&amp;quot;的解决方案，不仅要能跑，还要易于维护、易于扩展。例如，在学校里写组件可能只关注功能实现，但在实习中我学会了如何设计可复用、可配置的通用组件，并考虑其在不同业务场景下的兼容性。其次，&lt;strong&gt;团队协作与项目流程&lt;/strong&gt;的重要性远超我的预期。在学校，我们更多是独立完成作业，而在公司，一个项目是多人协作的成果，需要频繁地与产品经理沟通需求，与设计师确认交互，与后端工程师对接接口。我学会了如何通过Code Review、Git工作流来保证团队代码质量和开发效率。&lt;/p&gt;
&lt;p&gt;最后，我对&lt;strong&gt;前端的广度和深度&lt;/strong&gt;有了更全面的认知。之前可能觉得前端就是&amp;quot;写页面&amp;quot;，现在才发现它涉及性能优化、跨端开发、工程化、自动化测试、前端安全等诸多领域。实习让我从一个&amp;quot;代码实现者&amp;quot;逐渐向一个&amp;quot;问题解决者&amp;quot;转变，开始更系统地思考如何构建一个高质量、高效率、可持续迭代的前端应用。这让我更加明确了未来学习和发展的方向，也激发了我对前端技术更深层次探索的兴趣。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-fc72bad1435d"&gt;3. 为什么选择前端开发这个方向？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;说明该题是主观型问题，不考&amp;quot;唯一标准答案&amp;quot;。&lt;/li&gt;
&lt;li&gt;面试官主要考察答题者的表达能力、思路系统性、技术理解和复盘能力。&lt;/li&gt;
&lt;li&gt;答题结构建议：可以从个人兴趣、行业前景、技术特性、以及早期学习或项目经历等方面切入，阐述选择前端的理由。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我选择前端开发这个方向，主要是基于多方面的考虑和个人兴趣的驱动。最初接触编程时，我被前端所能实现的直观、可见的用户界面深深吸引。相对于后端更偏向逻辑和数据处理，前端能够将代码立即转化为用户可以直接交互和感知的视觉呈现，这种即时反馈的成就感对我来说非常重要。我喜欢通过自己的代码，让用户能够流畅、舒适地使用产品，并从中获得良好的体验。&lt;/p&gt;
&lt;p&gt;其次，前端技术栈的快速发展和广阔的行业前景也是吸引我的重要因素。Web技术日新月异，不断有新的框架、工具和解决方案涌现，这让我觉得前端是一个充满活力和挑战的领域，能够持续学习和成长。从最早的jQuery到现在的React、Vue，再到小程序、跨端框架，前端的应用场景越来越丰富，这让我看到了前端工程师在未来技术发展中的巨大潜力。&lt;/p&gt;
&lt;p&gt;此外，在校期间的一些项目经历也进一步坚定了我选择前端的决心。我曾参与开发过一个校园二手交易平台，从零开始搭建前端界面，设计用户交互流程，并解决了一系列兼容性、性能优化等问题。在这个过程中，我不仅提升了技术能力，更重要的是，我从中找到了解决问题的乐趣和创造的成就感。我喜欢与设计师、产品经理沟通，将抽象的需求转化为具体、友好的用户界面，这种跨领域的协作也让我觉得前端工作充满了挑战性和趣味性。综合这些因素，我坚信前端开发是一个既能发挥我兴趣特长，又能持续学习和成长的理想方向。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-98cefbbf7702"&gt;4. 学前端大概有多久了？之前是否有接触过其他编程语言？&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;说明该题是主观型问题，不考&amp;quot;唯一标准答案&amp;quot;。&lt;/li&gt;
&lt;li&gt;面试官主要考察答题者的表达能力、思路系统性、技术理解和复盘能力。&lt;/li&gt;
&lt;li&gt;答题结构建议：首先说明学习前端的时长，然后提及之前接触过的其他编程语言及其对前端学习的帮助，最后可以突出自己持续学习的能力。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我接触前端开发大约有三年时间了。从大二开始，我就对前端产生了浓厚的兴趣，并系统地投入到学习中。这三年里，我从基础的HTML、CSS、JavaScript开始，逐步深入学习了React、Vue等主流前端框架，以及Webpack、Vite等构建工具，并参与了一些实际项目开发。&lt;/p&gt;
&lt;p&gt;在学习前端之前，我在大学一年级接触过C++和Java等编程语言。C++的学习让我对底层逻辑、数据结构和算法有了初步的认识，培养了我的编程思维和解决问题的能力。而Java的学习则让我对面向对象编程、软件工程的思想有了更深的理解，尤其是在后端开发实践中，我了解了前后端分离、API接口设计等概念，这对于我理解前端与后端的数据交互和系统架构非常有帮助。这些早期的编程语言学习经历，为我后续学习JavaScript和前端框架打下了坚实的基础，让我能够更快地理解前端技术的原理和实现机制，例如，对数据结构和算法的理解，让我能够更好地优化前端应用的性能，提升用户体验。&lt;/p&gt;
&lt;p&gt;总的来说，虽然前端是我主要深耕的方向，但其他编程语言的学习经历拓宽了我的技术视野，也让我能够从更全面的角度去思考和解决前端开发中的问题。我始终保持着对新技术的学习热情，并乐于将不同领域的知识融会贯通，应用到实际项目中。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-4a042e09fb90"&gt;5. 你提到的两个项目，分别是什么？简单介绍一下它们的背景和功能。&lt;/h2&gt;
&lt;h3 id="题目要点-4"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;说明该题是主观型问题，不考&amp;quot;唯一标准答案&amp;quot;。&lt;/li&gt;
&lt;li&gt;面试官主要考察答题者的表达能力、思路系统性、技术理解和复盘能力。&lt;/li&gt;
&lt;li&gt;答题结构建议：分别介绍项目的背景、你的角色、主要负责的功能、以及项目中使用到的关键技术栈。强调项目亮点和你的贡献。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;好的，我很乐意介绍我参与的两个主要项目。&lt;/p&gt;
&lt;p&gt;第一个项目是一个&lt;strong&gt;在线教育平台的前端重构项目&lt;/strong&gt;。背景是公司原有的教育平台技术栈老旧，用户体验不佳，且维护成本高昂。我作为前端开发实习生，主要负责其中&amp;quot;课程详情页&amp;quot;和&amp;quot;直播互动模块&amp;quot;的重构工作。课程详情页的核心功能是展示课程内容、教师信息、课程大纲和用户评论，并支持课程购买和加入学习。直播互动模块则需要实现实时弹幕、点赞、提问和答疑等功能，确保高并发下的数据同步和流畅交互。&lt;/p&gt;
&lt;p&gt;在这个项目中，我主要负责：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;课程详情页：&lt;/strong&gt; 使用 React + Redux 技术栈，重构了页面组件，优化了数据请求和渲染逻辑，显著提升了页面加载速度和用户交互体验。特别是在图片懒加载和评论区无限滚动方面进行了性能优化，将首屏加载时间缩短了约30%。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;直播互动模块：&lt;/strong&gt; 参与了WebSocket通信的实现，确保弹幕消息的实时推送和展示。同时，为了保证在高并发场景下的性能，我们采用了虚拟列表技术来渲染大量弹幕，避免了DOM节点的过度渲染导致的页面卡顿。我还负责了前端的输入校验和敏感词过滤，确保互动内容的合规性。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;第二个项目是一个&lt;strong&gt;企业内部的&amp;quot;项目管理系统&amp;quot;&lt;/strong&gt;。这个系统的背景是公司内部各部门的项目信息分散，缺乏统一的管理和协作平台，导致沟通效率低下。我主要负责其&amp;quot;任务看板&amp;quot;和&amp;quot;数据可视化报表&amp;quot;模块的开发。任务看板旨在提供一个直观的Kanban视图，展示项目的任务状态（待办、进行中、已完成），并支持拖拽排序、任务分配、截止日期设置等功能。数据可视化报表则需要将项目进度、成员工作量、缺陷趋势等数据通过图表形式清晰地呈现。&lt;/p&gt;
&lt;p&gt;在这个项目中，我主要负责：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;任务看板：&lt;/strong&gt; 采用了Vue 3 + Vuex + Element UIPlus 技术栈，实现了任务的增删改查和拖拽功能。为了提升用户体验，我利用Vue的响应式特性和虚拟DOM，确保了大量任务卡片操作时的流畅性。同时，设计并实现了自定义拖拽指令，提升了组件的通用性和可维护性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据可视化报表：&lt;/strong&gt; 集成了ECharts图表库，根据后端提供的API数据，实现了项目概览、成员工作负荷、Bug趋势等多种报表的动态渲染。我负责了数据的前端处理和格式化，确保图表能够准确、清晰地展示数据，并通过组件化封装，使得报表可以灵活配置和复用。在实现过程中，也针对数据量较大时的图表渲染性能做了优化，例如按需加载图表组件和数据预处理。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过这两个项目，我不仅巩固了前端基础和框架应用能力，更重要的是，学习了如何在实际复杂项目中进行需求分析、技术选型、性能优化以及团队协作。这些经验让我对前端工程化和项目管理有了更深入的理解。&lt;/p&gt;</description></item><item><title>百度-文库-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-45/round-61/</link><pubDate>Sat, 19 Jul 2025 07:40:07 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-45/round-61/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-45/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-45/round-62/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本轮面试侧重于考察候选人的JavaScript基础知识、CSS布局能力、对浏览器工作原理的理解以及实际编码能力。重点在于事件循环、异步编程、闭包、原型链等核心概念，同时也涵盖了跨域、缓存等常见Web问题。&lt;/p&gt;
&lt;p&gt;本轮共 11 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-a49bd92d13fb"&gt;1. 实现一个三栏布局，左右侧固定200px，中间自适应，写出至少两种方案。追问：Grid布局中fr单位的作用？如何解决Flex布局的浏览器兼容问题？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;CSS布局能力&lt;/strong&gt;：面试官想确认你是否熟练掌握现代CSS布局技术，如Flexbox和Grid，以及是否了解传统的布局方法。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;布局方案的优劣对比&lt;/strong&gt;：能否分析不同方案的适用场景和优缺点，体现出技术选型的思考能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSS单位的理解&lt;/strong&gt;：对&lt;code&gt;fr&lt;/code&gt;这类现代布局单位的深入理解，表明你不是只会“复制粘贴”代码。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;兼容性处理经验&lt;/strong&gt;：在实际项目中如何处理浏览器兼容性问题，这是衡量工程师经验的重要指标。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="11-原理说明"&gt;1.1 原理说明&lt;/h5&gt;
&lt;p&gt;三栏布局是前端开发中的经典布局问题，旨在实现一个两侧宽度固定、中间区域宽度自适应的页面结构。核心是处理中间区域如何填满剩余空间。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Flexbox（弹性盒子布局）&lt;/strong&gt;：是一种一维布局模型，它让容器内的项目（item）能够灵活地分配空间。通过设置父容器&lt;code&gt;display: flex&lt;/code&gt;，并为子项设置&lt;code&gt;flex-grow&lt;/code&gt;（放大比例）、&lt;code&gt;flex-shrink&lt;/code&gt;（缩小比例）和&lt;code&gt;flex-basis&lt;/code&gt;（基准大小），可以轻松实现空间的自适应分配。对于三栏布局，可以将中间栏的&lt;code&gt;flex-grow&lt;/code&gt;设为&lt;code&gt;1&lt;/code&gt;，使其占据所有剩余空间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grid（网格布局）&lt;/strong&gt;：是一种二维布局模型，可以将页面划分为行和列，并在这些行列构成的单元格中放置内容。通过&lt;code&gt;grid-template-columns&lt;/code&gt;属性，可以精确定义每一列的宽度，使用&lt;code&gt;fr&lt;/code&gt;单位可以非常方便地实现自适应。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fr 单位&lt;/strong&gt;：&lt;code&gt;fr&lt;/code&gt;是 &amp;ldquo;fractional unit&amp;rdquo;（分数单位）的缩写，用于Grid布局中。它代表了可用空间的一等份。例如，&lt;code&gt;grid-template-columns: 200px 1fr 200px;&lt;/code&gt;意味着第一个和第三个元素宽度为&lt;code&gt;200px&lt;/code&gt;，中间的元素占据所有剩余的可用空间。如果是&lt;code&gt;1fr 2fr&lt;/code&gt;，则表示两者按1:2的比例分配可用空间。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="12-核心用法--示例代码"&gt;1.2 核心用法 + 示例代码&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;方案一：Flexbox 布局&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;注意点&lt;/strong&gt;：需要注意旧版本浏览器的兼容性问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;div class=&amp;#34;container-flex&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;div class=&amp;#34;left&amp;#34;&amp;gt;左侧固定&amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;div class=&amp;#34;main&amp;#34;&amp;gt;中间自适应&amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;div class=&amp;#34;right&amp;#34;&amp;gt;右侧固定&amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;style&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .container-flex {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; display: flex;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; height: 100vh;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .left, .right {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; width: 200px;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; background-color: #f0f0f0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .main {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; flex: 1; /* 等同于 flex-grow: 1; flex-shrink: 1; flex-basis: 0%; */
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; background-color: #e0e0e0;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/style&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;方案二：Grid 布局&lt;/strong&gt;Grid布局在处理二维对齐时更具优势，实现三栏布局同样非常简单。&lt;/p&gt;</description></item><item><title>百度-文库-校招 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-45/round-62/</link><pubDate>Sat, 19 Jul 2025 07:40:07 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-45/round-62/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-45/round-61/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-45/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 二面深入考察了前端核心知识的应用和原理理解。重点包括CSS优先级、闭包与内存管理、JavaScript继承的多种实现方式、原型链的深层理解、虚拟DOM的性能优化原理以及Vue框架的高级特性。题目更侧重于“为什么”和“如何实现”，要求候选人不仅知其然，更要知其所以然。&lt;/p&gt;
&lt;p&gt;本轮共 12 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-c29ace3f619f"&gt;1. 自我介绍，没有实习过。&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;沟通表达能力&lt;/strong&gt;：能否清晰、自信地介绍自己。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;潜力与热情&lt;/strong&gt;：在没有实习经历的情况下，如何通过个人项目、技术博客、开源贡献等来证明自己的技术热情和学习能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;求职动机&lt;/strong&gt;：为什么选择这个岗位和公司。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;此题为个人经验总结，请根据自身情况作答。核心是突出自己的优势、学习能力和对前端的热情，用项目经验或学习成果来弥补实习经历的不足。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-0245f98e0d8a"&gt;2. 最终颜色是什么？为什么？&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;box&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;content&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;style&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;color:red&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;box&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;color&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;blue&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;#content { &lt;span style="color:#66d9ef"&gt;color&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;green&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;CSS优先级（Specificity）&lt;/strong&gt;：这是CSS核心概念之一，考察对不同选择器权重的理解和计算能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSS规则来源&lt;/strong&gt;：是否了解行内样式、内部样式表、外部样式表的优先级关系。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="11-原理说明"&gt;1.1 原理说明&lt;/h5&gt;
&lt;p&gt;CSS的&lt;strong&gt;优先级（Specificity）&lt;/strong&gt;，也常被称为&lt;strong&gt;特殊性&lt;/strong&gt;或&lt;strong&gt;权重&lt;/strong&gt;，是浏览器用来决定当多个规则应用到同一个元素上时，哪一条规则生效的计算方法。&lt;/p&gt;
&lt;p&gt;优先级的计算规则可以总结为一个四元组 &lt;code&gt;(a, b, c, d)&lt;/code&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;a: 行内样式（Inline styles）&lt;/strong&gt;：如 &lt;code&gt;style=&amp;quot;color: red;&amp;quot;&lt;/code&gt;。如果存在，&lt;code&gt;a&lt;/code&gt;为1，否则为0。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;b: ID选择器&lt;/strong&gt;：如 &lt;code&gt;#content&lt;/code&gt;。&lt;code&gt;b&lt;/code&gt;为ID选择器的数量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;c: 类选择器、属性选择器、伪类选择器&lt;/strong&gt;：如 &lt;code&gt;.box&lt;/code&gt;, &lt;code&gt;[type=&amp;quot;text&amp;quot;]&lt;/code&gt;, &lt;code&gt;:hover&lt;/code&gt;。&lt;code&gt;c&lt;/code&gt;为这些选择器的总数量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;d: 标签选择器、伪元素选择器&lt;/strong&gt;：如 &lt;code&gt;div&lt;/code&gt;, &lt;code&gt;::before&lt;/code&gt;。&lt;code&gt;d&lt;/code&gt;为这些选择器的总数量。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;比较规则&lt;/strong&gt;：从&lt;code&gt;a&lt;/code&gt;开始，逐位比较。&lt;code&gt;a&lt;/code&gt;大的胜出；如果&lt;code&gt;a&lt;/code&gt;相同，则比较&lt;code&gt;b&lt;/code&gt;，&lt;code&gt;b&lt;/code&gt;大的胜出；以此类推。只有在优先级完全相同时，才会根据样式在代码中出现的&lt;strong&gt;顺序&lt;/strong&gt;来决定，“后来者居上”。&lt;/p&gt;
&lt;p&gt;另外，&lt;code&gt;!important&lt;/code&gt;声明拥有最高优先级，它会覆盖任何其他声明，但应避免滥用。&lt;/p&gt;
&lt;h5 id="12-核心用法--示例代码"&gt;1.2 核心用法 + 示例代码&lt;/h5&gt;
&lt;p&gt;我们来分析题目中的三个样式规则：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;行内样式&lt;/strong&gt;：&lt;code&gt;style=&amp;quot;color:red&amp;quot;&lt;/code&gt;&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;优先级计算：&lt;code&gt;a=1, b=0, c=0, d=0&lt;/code&gt; -&amp;gt; &lt;strong&gt;(1, 0, 0, 0)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ID选择器&lt;/strong&gt;：&lt;code&gt;#content { color: green }&lt;/code&gt;&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;优先级计算：&lt;code&gt;a=0, b=1, c=0, d=0&lt;/code&gt; -&amp;gt; &lt;strong&gt;(0, 1, 0, 0)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;类选择器&lt;/strong&gt;：&lt;code&gt;.box { color: blue }&lt;/code&gt;&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;优先级计算：&lt;code&gt;a=0, b=0, c=1, d=0&lt;/code&gt; -&amp;gt; &lt;strong&gt;(0, 0, 1, 0)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;比较结果&lt;/strong&gt;：&lt;/p&gt;</description></item><item><title>百度-地图-秋招 · 第 1 轮 · 三面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-41/round-60/</link><pubDate>Sat, 19 Jul 2025 06:27:27 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-41/round-60/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-41/round-59/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-41/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 7 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-645f514bf437"&gt;1. 讲一个你觉得最有成就感的项目？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;这个问题的回答重点不在于项目多复杂，而在于是否能通过一个真实的项目，清晰地表达出在关键阶段的判断力、推动力和技术价值。能讲出一个对业务和团队产生正向影响的案例，并体现出“为什么重要”、“怎么做的”、“结果如何”以及“有哪些沉淀”，才是打动面试官的关键。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;这个问题考察的是候选人在复杂项目中的角色、思维方式以及实际落地能力。回答时不必拘泥于“成功上线”或“技术高大上”的标准，更重要的是能体现出技术价值、业务洞察和综合影响力。&lt;/p&gt;
&lt;p&gt;可以从以下几个方向展开：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;1. 项目背景与挑战&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;项目是否处于关键节点（如业务转型、架构重构、性能瓶颈期），是否需要协调多个团队或跨端协作。重点在于说明“项目为什么重要”以及“初始面临的困难”，而不仅仅是“做了一个新功能”。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 所承担的角色与关键决策&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;可以适当展示一些深度思考，比如为什么选用了某项技术、重构的策略、组件化拆分方式、数据模型设计等。还可以强调在混乱或模糊中推动落地、制定标准、推动流程优化等能力。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 结果与影响&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不仅仅是“功能上线”，更重要的是对业务、团队或系统带来了什么实质性的改进，比如性能提升、迭代效率变高、可维护性提升、用户体验改善、业务增长支持等。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 成长与反思&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;有价值的项目往往伴随着“认知升级”，比如原来低估了技术债的影响，或者通过实际落地理解了“领域驱动设计”的意义。这个部分体现出个人复盘能力。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-68fff5a7d80c"&gt;2. 平时用哪个地图软件，你觉得百度地图和高德地图有什么区别？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;这个问题背后考察的是候选人&lt;strong&gt;是否能够从日常使用中提炼出产品与技术的理解&lt;/strong&gt;。如果能结合体验差异、技术架构、场景适配和生态思考给出分析，而不是停留在“哪个好用”这类主观评价层面，将更容易体现出产品敏感度和技术视野。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;这个问题虽然看似轻松，其实背后是面试官在考察&lt;strong&gt;候选人是否具备产品意识、用户视角以及对技术背后的生态和体验差异的敏感度&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="回答可以从以下几个方向展开"&gt;回答可以从以下几个方向展开：&lt;/h3&gt;
&lt;h4 id="1-使用习惯和使用场景"&gt;1. 使用习惯和使用场景&lt;/h4&gt;
&lt;p&gt;地图类产品往往不止于“导航”，不同场景下用户会对产品有不同诉求，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;日常通勤更关注路线精准、避堵能力；&lt;/li&gt;
&lt;li&gt;出行规划更看重 POI（兴趣点）搜索能力；&lt;/li&gt;
&lt;li&gt;步行、骑行、公交路线推荐的体验也会有所差异。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可以结合真实使用感受，说明更倾向哪一个地图工具，并说明选择背后的产品逻辑。&lt;/p&gt;
&lt;h4 id="2-产品体验差异"&gt;2. 产品体验差异&lt;/h4&gt;
&lt;p&gt;从前端视角，可以提到一些常见的 UI/UX 差异，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;高德地图整体交互更轻量，响应更快，视觉上偏简洁；&lt;/li&gt;
&lt;li&gt;百度地图在信息展示上更丰富，比如搜索结果信息量较大，适合城市探索或综合决策；&lt;/li&gt;
&lt;li&gt;两者在加载速度、动效、地图渲染逻辑、图层处理等方面也有细节差异。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-数据能力与技术架构差异"&gt;3. 数据能力与技术架构差异&lt;/h4&gt;
&lt;p&gt;可适当提及：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;百度地图在自然语言搜索、智能推荐、AI 语义处理方面表现更突出；&lt;/li&gt;
&lt;li&gt;高德地图更注重实时交通、路线规划和精准避堵，背后依赖阿里生态中调度算法与实时数据的融合；&lt;/li&gt;
&lt;li&gt;技术开发角度，百度地图在 web 开发中更注重全家桶式工具链，而高德的 SDK 则更强调灵活性和接入效率。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-生态与平台联动"&gt;4. 生态与平台联动&lt;/h4&gt;
&lt;p&gt;从更高层次看，还可以提及两者在生态整合上的不同：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;高德地图与支付宝、饿了么、飞猪等联动，强调生活服务整合；&lt;/li&gt;
&lt;li&gt;百度地图则依托百度搜索、百度 AI、大模型、自动驾驶等形成了更 AI 驱动的生态闭环。&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-081be73e1a37"&gt;3. 在多人协作开发中，若遇到接口定义不一致或代码冲突，你会如何推动问题解决？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;这个问题的核心在于&lt;strong&gt;是否具备跨人、跨团队推动协作问题闭环的能力&lt;/strong&gt;。能够主动定位问题源头、推动规范和工具落地、在冲突中引导沟通达成共识，是一个成熟前端在协作场景中的重要价值体现。回答不应仅限于“怎么解决”，更要体现出“如何避免”和“如何沉淀机制”。&lt;/p&gt;</description></item><item><title>百度-地图-秋招 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-41/round-59/</link><pubDate>Sat, 19 Jul 2025 06:27:27 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-41/round-59/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-41/round-55/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-41/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-41/round-60/"&gt;第 1 轮&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;本轮共 11 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-2b3736d3f494"&gt;1. 讲一下你的前端模块化的理解&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;模块化发展历程、ES Module 和 CommonJS 区别、模块加载机制、Tree-shaking原理。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;&lt;strong&gt;原理说明&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;模块化的目的&lt;/strong&gt;：为了提高代码的可维护性、复用性和依赖管理能力，将代码组织为独立模块。&lt;/p&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;/li&gt;
&lt;li&gt;IIFE 模式（立即执行函数）&lt;/li&gt;
&lt;li&gt;CommonJS（Node.js 标准，同步加载）&lt;/li&gt;
&lt;li&gt;AMD / CMD（异步模块定义）&lt;/li&gt;
&lt;li&gt;ES Module（ES6 标准模块系统，浏览器原生支持）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CommonJS vs ES Module&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CommonJS 是同步加载，适用于服务端；ES Module 是静态分析+异步加载，适用于浏览器。&lt;/li&gt;
&lt;li&gt;ES Module 支持 Tree-shaking，CommonJS 不支持。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;核心用法 + 示例代码&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// ES Module
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;add&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;) =&amp;gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;add&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;./utils.js&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;常见误区&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将 ES Module 和 CommonJS 混用，导致打包失败。&lt;/li&gt;
&lt;li&gt;忽视 ES Module 是静态结构，不能在运行时动态导入变量名模块（需使用 &lt;code&gt;import()&lt;/code&gt;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-363169dded10"&gt;2. HTTP/2 解决 HTTP/1.1什么问题？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;HTTP/2 优化点、HTTP/1.1 的瓶颈、性能原理&lt;/p&gt;</description></item><item><title>腾讯-视频-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-44/round-58/</link><pubDate>Thu, 17 Jul 2025 14:02:21 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-44/round-58/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-44/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; - 考点覆盖：网络协议（HTTP/HTTPS、OSI、WebSocket、QUIC、CORS）、安全（XSS、缓存投毒）、性能优化（缓存、懒加载/预加载）、工程化（版本更新、路由）、Vue框架细节。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;难易度：中等偏上。前6题基础网络必会，7-10题需理解协议差异与实战场景，11-16题偏重安全与缓存的落地策略，17-20题考察框架原理与工程思维，梯度合理但深度要求高。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本轮共 21 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-78e6f23a2378"&gt;1. 统计出现次数最多的字符以及出现的次数&lt;/h2&gt;
&lt;p&gt;题目描述：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;编写一个函数，接收一个字符串作为输入，统计并返回出现次数最多的字符及其出现的次数。如果有多个字符出现次数相同且最多，则返回所有这些字符及其出现次数。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;输入输出要求：&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;输入：一个字符串（只包含字母和数字）。&lt;/li&gt;
&lt;li&gt;输出：一个对象，包含出现次数最多的字符及其出现次数。
示例：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;input&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;aabbccddde&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;mostFrequentChar&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;input&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 输出：{ a: 2, b: 2, c: 2, d: 3, e: 1 }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;时间复杂度：O(n)，需要遍历字符串两次&lt;/li&gt;
&lt;li&gt;空间复杂度：O(k)，k为不同字符的数量&lt;/li&gt;
&lt;li&gt;关键点：正确理解题意，返回所有出现次数最多的字符&lt;/li&gt;
&lt;li&gt;优化：可以在统计过程中同时记录最大值，减少遍历次数&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;这道题需要统计字符串中每个字符的出现次数，然后找出出现次数最多的字符。需要注意的是，题目要求如果有多个字符出现次数相同且最多，要返回所有这些字符。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解题思路：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;遍历字符串，使用Map或对象统计每个字符的出现次数&lt;/li&gt;
&lt;li&gt;找出最大出现次数&lt;/li&gt;
&lt;li&gt;筛选出所有达到最大出现次数的字符&lt;/li&gt;
&lt;li&gt;返回结果对象&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;代码实现：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;mostFrequentChar&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;str&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 边界情况处理
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;str&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 统计每个字符的出现次数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;charCount&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;of&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;charCount&lt;/span&gt;[&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;charCount&lt;/span&gt;[&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;] &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 找出最大出现次数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;maxCount&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Math.&lt;span style="color:#a6e22e"&gt;max&lt;/span&gt;(...Object.&lt;span style="color:#a6e22e"&gt;values&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;charCount&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 筛选出所有达到最大出现次数的字符
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; [&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;count&lt;/span&gt;] &lt;span style="color:#66d9ef"&gt;of&lt;/span&gt; Object.&lt;span style="color:#a6e22e"&gt;entries&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;charCount&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;count&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;maxCount&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;[&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;count&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 优化版本：使用Map，一次遍历完成
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;mostFrequentCharOptimized&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;str&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;str&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;charCount&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Map&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;maxCount&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 统计字符出现次数，同时记录最大值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;of&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;count&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;charCount&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;) &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;charCount&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;set&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;count&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;maxCount&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Math.&lt;span style="color:#a6e22e"&gt;max&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;maxCount&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;count&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 构建结果对象
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; [&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;count&lt;/span&gt;] &lt;span style="color:#66d9ef"&gt;of&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;charCount&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;count&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;maxCount&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;[&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;count&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;测试用例：&lt;/p&gt;</description></item><item><title>美团-酒旅-前端面经 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-43/round-57/</link><pubDate>Thu, 17 Jul 2025 08:18:40 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-43/round-57/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-43/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本轮共 13 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-6722e7a3eb1d"&gt;1. 简历提到你熟悉Git，请问如何处理代码合并时的冲突？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;面试官出这道题主要想确认哪些知识维度？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Git基础操作&lt;/strong&gt;：考察候选人对Git版本控制工具的熟悉程度，尤其是合并（merge）和解决冲突（conflict resolution）等核心操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;问题解决能力&lt;/strong&gt;：在实际开发中遇到代码冲突时，候选人如何分析问题、定位冲突并有效解决。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;协作开发经验&lt;/strong&gt;：在团队协作中，如何避免冲突，以及在发生冲突后如何与其他团队成员协作解决。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&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;版本回溯与管理&lt;/strong&gt;：理解冲突解决机制有助于更好地进行版本管理和历史回溯。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;团队协作效率&lt;/strong&gt;：高效解决冲突能够提高团队的开发效率和代码质量。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h4 id="11-原理说明"&gt;1.1 原理说明&lt;/h4&gt;
&lt;p&gt;Git冲突是指在合并（merge）或变基（rebase）分支时，不同分支对同一个文件的相同部分进行了修改，或者一个分支修改了文件而另一个分支删除了该文件，导致Git无法自动判断保留哪个修改时发生的情况。Git会暂停合并操作，并将冲突部分标记出来，等待用户手动解决。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;冲突的产生：&lt;/strong&gt;
当两个或多个开发者对同一个文件的同一行或同一区域进行修改，并将各自的修改推送到远程仓库，在合并这些修改时，Git会提示冲突。&lt;/p&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;文件冲突&lt;/strong&gt;：一个分支修改了文件，另一个分支删除了该文件；或者两个分支都创建了同名文件但内容不同。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="12-核心用法--示例代码"&gt;1.2 核心用法 + 示例代码&lt;/h4&gt;
&lt;p&gt;处理Git合并冲突的主要步骤如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;更新本地仓库&lt;/strong&gt;：在进行合并操作前，通常需要先拉取远程最新代码，确保本地分支是最新的，减少潜在冲突。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git pull origin &amp;lt;your-branch&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;执行合并操作&lt;/strong&gt;：当你尝试将一个分支合并到另一个分支时，如果存在冲突，Git会提示并停止合并。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git merge &amp;lt;other-branch&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或者使用rebase：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git rebase &amp;lt;other-branch&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;识别冲突标记&lt;/strong&gt;：Git会在冲突文件中插入特殊标记，通常是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;amp;lt; HEAD
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;// 当前分支的修改
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;=======
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;// 待合并分支的修改
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; &amp;lt;commit-id-or-branch-name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;amp;lt; HEAD&lt;/code&gt;：表示当前分支（HEAD指向）的代码。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;=======&lt;/code&gt;：分隔符，表示冲突的开始和结束。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; &amp;lt;commit-id-or-branch-name&amp;gt;&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;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;编辑冲突文件&lt;/strong&gt;：根据业务需求，手动修改冲突文件，决定保留哪些代码，删除哪些代码。你可以选择保留其中一个分支的修改，或者结合两者的修改，甚至编写全新的代码。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;删除冲突标记&lt;/strong&gt;：在解决冲突后，务必删除&lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/code&gt;、&lt;code&gt;=======&lt;/code&gt;和&lt;code&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt;这些Git自动添加的标记。&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;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add &amp;lt;conflicted-file-name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;提交合并结果&lt;/strong&gt;：在所有冲突文件都标记为已解决后，提交合并。&lt;/p&gt;</description></item><item><title>百度-地图-秋招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-41/round-55/</link><pubDate>Thu, 10 Jul 2025 14:52:42 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-41/round-55/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-41/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-41/round-59/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 基础知识面不少，进一步考察实际工程和性能优化能力&lt;/p&gt;
&lt;p&gt;本轮共 12 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-e78ee3f21e11"&gt;1. BFC的作用及触发条件，使用场景讲一下&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CSS 样式中 BFC 的概念、特性和触发条件&lt;/li&gt;
&lt;li&gt;BFC 应用场景：避免多列排版间隔折行问题、清除浮动、各区域形成隔离&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="11-原理说明"&gt;1.1 原理说明&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;BFC (Block Formatting Context)&lt;/strong&gt;，即块级格式化上下文。它是 W3C CSS2.1 中的一类属性，是一个独立的布局环境，在该环境里，按照特定规则进行元素排列和布局。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;主要特性：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BFC 内部的元素不会和外部的元素受 margin 折行的影响&lt;/li&gt;
&lt;li&gt;BFC 可以包裹内部浮动元素，解决父容器高度不拉伸问题&lt;/li&gt;
&lt;li&gt;BFC 不会被浮动元素拉动&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;触发 BFC 的条件：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;样式中定义此元素为 float (non-none)&lt;/li&gt;
&lt;li&gt;正文模型 overflow 为 hidden, scroll, auto&lt;/li&gt;
&lt;li&gt;display 为 inline-block, table-cell, flex, grid, flow-root&lt;/li&gt;
&lt;li&gt;position 为 absolute 或 fixed&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="12-核心用法--示例代码"&gt;1.2 核心用法 + 示例代码&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;场景1：清除浮动&lt;/strong&gt; 常用 BFC 包裹元素，使父元素的高度得以支撑&lt;/p&gt;</description></item><item><title>360集团-24年-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-40/round-53/</link><pubDate>Wed, 09 Jul 2025 08:05:48 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-40/round-53/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-40/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察校招生的前端基础内容和项目经验。&lt;/p&gt;
&lt;p&gt;本轮共 20 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-8af01cadfebb"&gt;1. 前端学习路径&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;本题为主观题，没有标准答案，主要考察候选人的学习能力、知识体系构建能力以及持续学习的动力。&lt;/li&gt;
&lt;li&gt;面试官希望了解候选人获取新知识、解决问题的途径和习惯，以及对前端知识的理解是否系统、全面。&lt;/li&gt;
&lt;li&gt;建议回答结构：我的前端启蒙与基础学习阶段 → 深入学习特定框架/技术 → 通过项目实践巩固与提升 → 持续学习与关注前沿技术。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我的前端学习路径可以分为几个阶段。最初，我对互联网技术充满好奇，通过[提及学习方式，例如：慕课网上的入门课程和MDN文档]开始了前端的启蒙。在这个阶段，我扎实掌握了HTML、CSS和JavaScript这&amp;quot;三驾马车&amp;quot;的基础知识，理解了DOM操作、盒模型、BFC等核心概念。为了更好地实践，我还搭建了一些简单的静态页面和交互功能，这让我对前端有了初步的认识。&lt;/p&gt;
&lt;p&gt;随着学习的深入，我意识到框架在大型项目开发中的重要性。我选择了[提及选择的框架，例如：React作为第一个深入学习的框架]，因为它在业界应用广泛且社区活跃。我通过[提及学习方式，例如：阅读官方文档、跟随开源项目教程，以及阅读《React设计模式与最佳实践》等书籍]，系统学习了React的组件化思想、生命周期、Hooks、状态管理（如Redux或Context API）等。为了融会贯通，我模仿并实现了一些[提及实践项目，例如：电商网站的商品详情页、用户管理后台界面]，并在其中积极实践了组件复用和性能优化。&lt;/p&gt;
&lt;p&gt;在掌握React后，我又学习了Vue，主要是为了拓宽技术栈，了解不同框架的设计哲学。通过对比学习，我能更好地理解它们在数据响应式、模板语法、生态系统等方面的差异，这让我在技术选型时能有更全面的考量。项目实践是检验学习成果的最佳方式，我总是尝试将所学知识应用到实际项目中，例如[提及具体项目中的实践，例如：在一个数据可视化项目中，我负责了图表组件的封装和数据渲染优化，并解决了跨域请求等问题]，通过解决实际问题来加深理解和提升能力。&lt;/p&gt;
&lt;p&gt;此外，我始终保持持续学习的习惯。我关注前端技术社区，如GitHub Trending、掘金、知乎专栏等，定期阅读技术博客和行业报告，了解最新的前端趋势和技术发展，比如[提及关注的新技术，例如：WebAssembly、微前端、Serverless等]。我认为前端技术发展迅速，只有不断学习和实践，才能保持竞争力。当遇到新的技术挑战时，我通常会先查阅官方文档，然后搜索相关的技术文章和社区讨论，如果依然无法解决，会向有经验的同事或社区前辈请教。这个过程不仅帮助我解决了问题，也锻炼了我独立思考和解决问题的能力。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-db69e6e99255"&gt;2. 你提到对React和Vue都了解，对比两者的差异？在项目中如何选择？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;框架基础掌握：确认候选人对React和Vue两大主流前端框架的核心概念、工作原理有深入理解。&lt;/li&gt;
&lt;li&gt;异同点辨析：考察候选人能否准确对比两者在数据管理、模板语法、生态系统等方面的差异。&lt;/li&gt;
&lt;li&gt;项目选型能力：评估候选人是否具备根据项目需求、团队情况等因素，合理选择技术栈的决策能力。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="11-原理说明"&gt;1.1 原理说明&lt;/h5&gt;
&lt;p&gt;React和Vue都是目前主流的前端UI框架，用于构建用户界面。它们都采用了组件化的开发思想和虚拟DOM技术来提高开发效率和性能。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;React：&lt;/strong&gt; React是一个由Facebook开发的用于构建用户界面的JavaScript库。它强调&amp;quot;一次学习，随处编写&amp;quot;，以其声明式视图、组件化、以及单向数据流而闻名。React的核心是JSX（JavaScript XML），一种允许在JavaScript中编写类似HTML结构的语法，这使得UI的逻辑和视图紧密结合。React的更新机制是基于状态的变化，当组件状态更新时，React会创建一个新的虚拟DOM树，然后与旧的虚拟DOM树进行对比（diff算法），最后只更新真实DOM中发生变化的部分。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vue：&lt;/strong&gt; Vue是一个渐进式JavaScript框架，用于构建用户界面。它被设计为可以自底向上逐层应用。Vue的核心库只关注视图层，易于上手，同时也方便与其他库或现有项目整合。Vue的主要特点包括双向数据绑定、基于HTML的模板语法（也可以使用JSX）、组件化以及响应式系统。Vue的响应式系统基于&lt;code&gt;Object.defineProperty&lt;/code&gt;（Vue 2.x）或Proxy（Vue 3.x），能够追踪数据的变化并自动更新视图。&lt;/li&gt;
&lt;/ul&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;ul&gt;
&lt;li&gt;&lt;strong&gt;组件化：&lt;/strong&gt; 两者都提倡组件化开发，将UI拆分为独立的、可复用的组件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;虚拟DOM：&lt;/strong&gt; 都使用虚拟DOM来提高性能，减少直接操作真实DOM的开销。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应式：&lt;/strong&gt; 都提供了响应式的数据绑定机制，数据变化时视图自动更新。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生态系统：&lt;/strong&gt; 都拥有庞大且活跃的社区，提供丰富的工具、库和插件。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;区别：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据流：&lt;/strong&gt; React推崇单向数据流（从父组件到子组件），而Vue支持双向数据绑定（v-model），使得表单处理等场景更为便捷。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模板语法：&lt;/strong&gt; React倾向于使用JSX，将HTML和JS逻辑写在一起；Vue默认使用基于HTML的模板语法，通过指令（如&lt;code&gt;v-if&lt;/code&gt;, &lt;code&gt;v-for&lt;/code&gt;）增强HTML功能，也可以选择使用JSX或渲染函数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;状态管理：&lt;/strong&gt; React通常结合Redux或Context API进行状态管理；Vue有官方的Vuex。两者都有各自的解决方案来管理复杂应用的状态。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;学习曲线：&lt;/strong&gt; 通常认为Vue的学习曲线相对平缓，对前端新手更友好；React由于其JSX和函数式编程的理念，可能需要一定的学习成本。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能优化：&lt;/strong&gt; Vue的响应式系统在很多情况下能自动进行细粒度的更新，减少开发者手动优化的工作；React的性能优化则更多依赖于&lt;code&gt;shouldComponentUpdate&lt;/code&gt;、&lt;code&gt;React.memo&lt;/code&gt;等手动优化手段。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="12-核心用法--示例代码如题目涉及"&gt;1.2 核心用法 + 示例代码（如题目涉及）&lt;/h5&gt;
&lt;p&gt;由于题目是对比差异和选择，这里主要通过对比说明其在项目中的选择场景：&lt;/p&gt;</description></item><item><title>京东-健康-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-39/round-50/</link><pubDate>Sun, 06 Jul 2025 14:16:57 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-39/round-50/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-39/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 中级偏上难度，适合有扎实基础和一定项目经验的应届生。既考察理论知识的深度，也注重实践能力的广度，需要候选人具备较强的学习能力和技术整合能力。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; ### 考察范围&lt;/p&gt;
&lt;p&gt;这轮校招面试主要考察四个维度：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;个人经历和项目实战&lt;/strong&gt;：通过学习经历、项目搭建、协作经验考察实际开发能力&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;移动端和多端开发&lt;/strong&gt;：小程序开发、多端适配、移动端优化等实用技能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;前端基础知识&lt;/strong&gt;：JavaScript核心概念、Vue框架原理、浏览器工作机制等&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工程化和架构思维&lt;/strong&gt;：打包工具、插件开发、系统设计等高级能力&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="重点准备知识点"&gt;重点准备知识点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;项目经验的系统性总结和技术亮点提炼&lt;/li&gt;
&lt;li&gt;小程序开发框架和多端适配方案&lt;/li&gt;
&lt;li&gt;JavaScript作用域、变量提升等核心机制&lt;/li&gt;
&lt;li&gt;Vue组件通信、生命周期、插槽等框架特性&lt;/li&gt;
&lt;li&gt;前端性能优化和工程化实践&lt;/li&gt;
&lt;li&gt;实时通讯和AI集成的技术方案&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本轮共 25 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-f826f1646088"&gt;1. 介绍自己的学习和实习经历&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;学习路径：从基础到框架的系统性学习过程&lt;/li&gt;
&lt;li&gt;实习经验：具体项目和技术栈的实践应用&lt;/li&gt;
&lt;li&gt;协作能力：与团队成员的配合和沟通经验&lt;/li&gt;
&lt;li&gt;技术深度：不仅会用还要理解原理的学习态度&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在学习经历方面，计算机科学专业背景为前端开发奠定了扎实的理论基础。大学期间系统学习了数据结构、算法、计算机网络等核心课程，这些知识在后续的前端开发中发挥了重要作用。&lt;/p&gt;
&lt;p&gt;前端技术的学习路径比较系统，从HTML、CSS、JavaScript基础开始，逐步深入到现代前端框架。先掌握了Vue.js的基本用法，然后学习了React和小程序开发。在学习过程中特别注重实践，每学习一个新技术都会通过项目来巩固理解。&lt;/p&gt;
&lt;p&gt;实习经历主要集中在两个阶段。第一次实习主要负责公司官网的维护和功能迭代，使用Vue.js技术栈，参与了从需求分析到上线部署的完整流程。这个过程中学会了如何与产品经理、设计师协作，也了解了企业级项目的开发规范。&lt;/p&gt;
&lt;p&gt;第二次实习参与了一个移动端项目的开发，使用uni-app框架实现多端适配。在这个项目中主要负责用户中心模块的开发，包括登录注册、个人信息管理、订单查询等功能。通过这次实习深入了解了移动端开发的特点和挑战。&lt;/p&gt;
&lt;p&gt;在学习和实习过程中，特别注重技术深度的挖掘。不仅学会了如何使用各种技术，更重要的是理解了技术背后的原理。比如学习Vue时，会去了解响应式系统的实现机制；学习webpack时，会研究打包优化的各种策略。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-e7ff151b31f9"&gt;2. 讲一下你的项目搭建过程，用到了哪个脚手架，有没有做其他工作？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;脚手架选择：Vue CLI vs Vite的适用场景和特点&lt;/li&gt;
&lt;li&gt;配置定制：代码规范、构建优化、环境管理&lt;/li&gt;
&lt;li&gt;开发规范：团队协作的标准化流程&lt;/li&gt;
&lt;li&gt;工程化实践：组件库、测试、部署等完整流程&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;项目搭建通常会根据具体需求选择合适的脚手架工具。对于Vue项目，主要使用Vue CLI和Vite两种方案。Vue CLI适合需要复杂配置的企业级项目，提供了完整的插件生态和配置选项。Vite则适合快速开发，启动速度更快，热更新体验更好。&lt;/p&gt;
&lt;p&gt;具体的搭建流程包括几个关键步骤。首先是技术栈选择，根据项目需求确定使用的框架、UI库、状态管理方案等。然后使用脚手架创建基础项目结构，配置开发环境和构建流程。&lt;/p&gt;
&lt;p&gt;在基础搭建完成后，会进行一系列的定制化配置。包括配置ESLint和Prettier确保代码质量，设置路由和状态管理的基础结构，配置axios拦截器处理API请求，设置环境变量管理不同环境的配置。&lt;/p&gt;
&lt;p&gt;还会建立项目的开发规范，包括目录结构规范、组件命名规范、Git提交规范等。这些规范对于团队协作非常重要，能够保证代码的一致性和可维护性。&lt;/p&gt;
&lt;p&gt;在构建优化方面，会配置代码分割、压缩、缓存等策略。对于生产环境，还会配置CDN、Gzip压缩、性能监控等。这些配置虽然不是核心业务逻辑，但对项目的性能和稳定性有重要影响。&lt;/p&gt;
&lt;p&gt;除了技术层面的工作，还会考虑项目的可持续发展。比如建立组件库，提取公共组件和工具函数；配置自动化测试，保证代码质量；建立CI/CD流程，实现自动化部署。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-305821e25fdd"&gt;3. 讲一下你在学校参与的协作项目&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;项目背景：技术栈选择和架构设计&lt;/li&gt;
&lt;li&gt;个人职责：具体负责的模块和功能实现&lt;/li&gt;
&lt;li&gt;协作流程：Git管理、代码审查、敏捷开发&lt;/li&gt;
&lt;li&gt;问题解决：接口对接、代码规范等实际挑战&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在学校期间参与了一个在线学习平台的开发项目，这是一个5人团队的协作项目，持续了一个学期。项目采用前后端分离的架构，前端使用Vue.js，后端使用Node.js。&lt;/p&gt;
&lt;p&gt;在项目中主要负责用户管理和课程展示模块的开发。用户管理包括注册登录、个人信息维护、学习进度跟踪等功能。课程展示模块需要支持视频播放、课件下载、评论互动等复杂功能。&lt;/p&gt;
&lt;p&gt;团队协作方面，使用Git进行版本控制，建立了完整的分支管理策略。主分支用于生产环境，开发分支用于功能集成，每个人都有自己的特性分支。通过Pull Request的方式进行代码审查，确保代码质量。&lt;/p&gt;
&lt;p&gt;项目管理使用敏捷开发方法，每周进行一次迭代规划，每天有简短的站会同步进度。使用Trello进行任务管理，每个功能都有明确的负责人和完成时间。&lt;/p&gt;</description></item><item><title>腾讯-QQ浏览器-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-38/round-49/</link><pubDate>Sun, 06 Jul 2025 13:37:36 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-38/round-49/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-38/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; &lt;strong&gt;中高级难度&lt;/strong&gt;。既有基础概念的深度考察，也有复杂业务场景的解决方案设计，对于校招同学有一定的挑战。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; ### 考察范围&lt;/p&gt;
&lt;p&gt;这轮面试主要考察三个维度：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;项目实战能力&lt;/strong&gt;：通过虚拟列表、Token管理等具体技术方案考察解决复杂业务问题的能力&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;前端基础功底&lt;/strong&gt;：涵盖浏览器原理、JavaScript核心机制、CSS布局、性能优化等核心知识&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;计算机基础&lt;/strong&gt;：通过算法题考察数据结构和算法基础&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="重点准备知识点"&gt;重点准备知识点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;虚拟列表等性能优化方案的深度理解和实践经验&lt;/li&gt;
&lt;li&gt;HTTP协议、浏览器工作原理、缓存机制等网络基础&lt;/li&gt;
&lt;li&gt;JavaScript事件循环、闭包、原型链等语言核心特性&lt;/li&gt;
&lt;li&gt;Vue/React框架原理，特别是响应式系统和虚拟DOM&lt;/li&gt;
&lt;li&gt;CSS布局方案和BFC等核心概念&lt;/li&gt;
&lt;li&gt;前端工程化和性能优化实践&lt;/li&gt;
&lt;li&gt;基础算法和数据结构&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="建议"&gt;建议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;深入理解前端核心概念，不仅知其然还要知其所以然&lt;/li&gt;
&lt;li&gt;积累实际项目经验，特别是性能优化和复杂业务场景的解决方案&lt;/li&gt;
&lt;li&gt;保持对新技术的敏感度，了解技术发展趋势&lt;/li&gt;
&lt;li&gt;加强计算机基础，算法和数据结构是技术能力的重要体现&lt;/li&gt;
&lt;li&gt;培养系统性思维，能够从多个角度分析和解决问题&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本轮共 20 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-fbe5211ce8dc"&gt;1. 请讲一下你项目中的的虚拟列表，包括实现原理、优化过程以及如何设置缓冲区？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;核心原理：只渲染可视区域，动态计算显示范围&lt;/li&gt;
&lt;li&gt;关键技术：滚动监听、索引计算、位置缓存&lt;/li&gt;
&lt;li&gt;优化重点：动态高度处理、缓冲区设置、滚动性能&lt;/li&gt;
&lt;li&gt;实际考虑：内存占用与性能平衡&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;虚拟列表是解决大数据量列表渲染性能问题的核心方案。其实现原理基于&amp;quot;只渲染可视区域&amp;quot;的思想。&lt;/p&gt;
&lt;p&gt;具体实现上，首先需要确定容器的可视高度和每个列表项的高度。通过监听滚动事件，实时计算当前滚动位置对应的起始索引和结束索引。核心公式是：起始索引 = Math.floor(scrollTop / itemHeight)，结束索引 = 起始索引 + Math.ceil(containerHeight / itemHeight)。&lt;/p&gt;
&lt;p&gt;在优化过程中遇到的主要挑战是处理动态高度的列表项。解决方案是维护一个位置缓存数组，记录每个列表项的实际高度和累计偏移量。当列表项高度发生变化时，需要更新缓存并重新计算后续项的位置。&lt;/p&gt;
&lt;p&gt;缓冲区设置是性能优化的关键。通常在可视区域前后各增加5-10个列表项作为缓冲，具体数量需要根据列表项的复杂度和渲染耗时来调整。缓冲区过小会导致快速滚动时出现白屏，过大则会增加内存占用和渲染负担。&lt;/p&gt;
&lt;p&gt;对于滚动性能优化，还需要结合防抖节流、requestAnimationFrame等技术，确保滚动的流畅性。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-2e4835cecc28"&gt;2. 在虚拟列表中，如何结合防抖和节流技术优化性能？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;节流应用：滚动事件实时响应，保证连续性操作的流畅度&lt;/li&gt;
&lt;li&gt;防抖应用：计算密集操作、数据预加载等非实时场景&lt;/li&gt;
&lt;li&gt;组合策略：根据不同操作特性选择合适的优化方案&lt;/li&gt;
&lt;li&gt;参数调优：时间间隔需要平衡性能和用户体验&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在虚拟列表的性能优化中，防抖和节流扮演着不同但互补的角色。&lt;/p&gt;
&lt;p&gt;对于滚动事件本身，节流是更合适的选择。因为滚动是连续性操作，用户期望得到实时反馈，而不是等待操作结束后才响应。通常设置16-33ms的节流间隔，对应60-30fps的更新频率，既保证了流畅度又避免了过度计算。&lt;/p&gt;
&lt;p&gt;防抖则主要用于一些计算密集型的操作。比如当滚动停止后，可能需要进行数据预加载、图片懒加载等操作，这些可以使用防抖来避免频繁触发。另外，对于搜索框结合虚拟列表的场景，搜索关键词的处理也适合使用防抖。&lt;/p&gt;
&lt;p&gt;在实际实现中，还需要考虑组合使用的场景。比如可以对滚动事件使用节流进行实时响应，同时对复杂的重新计算逻辑使用防抖进行优化。这样既保证了用户体验，又避免了不必要的性能消耗。&lt;/p&gt;
&lt;p&gt;需要注意的是，节流和防抖的时间设置需要根据具体业务场景调整，过短可能达不到优化效果，过长则会影响用户体验。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-07425dedaf84"&gt;3. 如何使用 requestAnimationFrame 优化虚拟列表的滚动性能？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;核心优势：与浏览器重绘周期同步，避免无效渲染&lt;/li&gt;
&lt;li&gt;应用场景：DOM更新调度、动画优化、时间切片&lt;/li&gt;
&lt;li&gt;性能提升：减少重排重绘、合并多次操作、避免掉帧&lt;/li&gt;
&lt;li&gt;注意事项：刷新率适配、兼容性考虑&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;requestAnimationFrame是浏览器提供的专门用于动画优化的API，它能够确保回调函数在浏览器下一次重绘之前执行，这对虚拟列表的滚动性能优化具有重要意义。&lt;/p&gt;</description></item><item><title>腾讯-暑期实习 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-37/round-48/</link><pubDate>Sun, 29 Jun 2025 13:39:17 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-37/round-48/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-37/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 主要几种在以下几个方向：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;vue3原理&lt;/li&gt;
&lt;li&gt;前端工程化：webpack、vite、pnpm、monorepo&lt;/li&gt;
&lt;li&gt;前端安全&lt;/li&gt;
&lt;li&gt;计算机网络&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本轮共 21 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-20e6c69e8673"&gt;1. JSON数组扁平化&amp;amp;数据过滤&lt;/h2&gt;
&lt;p&gt;假设有一个模拟接口 &lt;code&gt;fetchData()&lt;/code&gt;，返回 Promise 对象，数据格式为：&lt;br&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;#34;data&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#f92672"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;#34;value&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#f92672"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;#34;value&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;#34;children&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#f92672"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;#34;value&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt; } ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;要求：&lt;br&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;将接口返回的嵌套数据结构扁平化为一维数组&lt;/strong&gt;；&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;筛选出 &lt;strong&gt;&lt;code&gt;value&lt;/code&gt;&lt;/strong&gt; 大于等于 8 的元素&lt;/strong&gt;；&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;按 &lt;strong&gt;&lt;code&gt;id&lt;/code&gt;&lt;/strong&gt; 升序排列后，渲染为 &lt;strong&gt;&lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;&lt;/strong&gt; 列表&lt;/strong&gt;。&lt;br&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;示例输出：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;li&lt;/span&gt;&amp;gt;id:2, value:10&amp;lt;/&lt;span style="color:#f92672"&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;li&lt;/span&gt;&amp;gt;id:3, value:8&amp;lt;/&lt;span style="color:#f92672"&gt;li&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;ul&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;递归与数据结构处理&lt;/strong&gt;：考查候选人是否理解如何处理嵌套结构。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数组操作基础&lt;/strong&gt;：filter/sort/map 等高阶方法掌握情况。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;异步处理能力&lt;/strong&gt;：是否熟悉 &lt;code&gt;Promise&lt;/code&gt; 的使用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;原生 DOM 操作&lt;/strong&gt;：不用框架的情况下渲染 HTML。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="11-原理说明"&gt;1.1 原理说明&lt;/h5&gt;
&lt;p&gt;此题本质是一个数据处理与 DOM 渲染综合题，目标包括：&lt;/p&gt;</description></item><item><title>字节-今日头条-校招 · 第 1 轮 · 三面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-36/round-47/</link><pubDate>Fri, 27 Jun 2025 08:02:46 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-36/round-47/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-36/round-46/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-36/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察候选人的项目经验、技术深度与广度，以及解决实际问题的能力和算法基础。&lt;/p&gt;
&lt;p&gt;本轮共 16 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-24194e2f96e7"&gt;1. 介绍一下实习项目的业务背景&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;● 该题是主观型问题，不设&amp;quot;唯一标准答案&amp;quot;。
● 面试官主要考察答题者能否清晰、有条理地阐述复杂业务，并展现其系统性思考和沟通表达能力。
● 建议的答题结构是：首先概述项目所属行业与核心痛点，接着阐述项目目标与解决方案，最后简要提及项目成果及个人职责。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="高质量参考范文"&gt;高质量参考范文：&lt;/h5&gt;
&lt;p&gt;我之前在一家电商公司实习，主要负责一个名为&amp;quot;智能商品推荐系统&amp;quot;的项目。该项目的业务背景是，随着电商平台商品数量的激增，用户在海量商品中找到心仪商品变得越来越困难，导致用户体验下降，同时也影响了平台的转化率和GMV。为了解决这一痛点，我们团队着手开发智能推荐系统，旨在通过算法分析用户的行为数据（如浏览历史、购买记录、搜索偏好等），结合商品自身的属性，为用户提供个性化、精准的商品推荐，从而提升用户的购物效率和满意度。&lt;/p&gt;
&lt;p&gt;在这个项目中，我的主要职责是负责推荐结果的前端展示和交互优化。具体来说，我参与了推荐模块的UI设计与实现，确保推荐流的加载流畅性，并针对不同场景（如首页推荐、详情页关联推荐、购物车推荐等）进行了布局和样式的适配。此外，我还负责埋点方案的实施，以便后续对推荐效果进行数据分析和A/B测试。通过这个项目，我们发现精准推荐能够显著提高用户的点击率和转化率，帮助平台更好地匹配用户需求与商品供给，最终促进了业务增长。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-538edfd73d5f"&gt;2. 假如你是一个项目的负责人，面对一个新需求你会如何判断以及决策？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;● 该题是主观型问题，不设&amp;quot;唯一标准答案&amp;quot;。
● 面试官主要考察答题者在项目管理、需求分析、风险评估和决策制定方面的系统性思维和实践能力。
● 建议的答题结构是：首先明确需求分析的步骤，接着说明决策制定的考量因素，最后强调风险管理与团队协作。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="高质量参考范文-1"&gt;高质量参考范文：&lt;/h5&gt;
&lt;p&gt;作为项目的负责人，面对新需求时，我会采取一个结构化的判断和决策流程。首先，我会进行深入的&lt;strong&gt;需求分析和理解&lt;/strong&gt;。这包括与产品经理、业务方进行充分沟通，明确需求的来源、业务目标、用户价值和预期效果，同时也会收集用户反馈和市场数据进行辅助验证，确保我们对需求有全面的认知，而不是停留在表面。我会问自己几个关键问题：这个需求解决什么问题？能带来多大的业务价值？目标用户是谁？&lt;/p&gt;
&lt;p&gt;其次，我会进行&lt;strong&gt;可行性评估和方案设计&lt;/strong&gt;。从技术角度，我会组织技术团队评估实现方案的技术难度、所需资源（人力、时间、技术栈）、潜在风险以及对现有系统的影响。同时，我也会考虑多种技术方案，并对比它们的优劣，力求选择一个既能满足需求又具备良好扩展性和维护性的方案。在这个阶段，我会与团队成员进行充分讨论，集思广益。&lt;/p&gt;
&lt;p&gt;接着是&lt;strong&gt;优先级排序和决策制定&lt;/strong&gt;。在资源有限的情况下，我会根据需求的业务价值、技术复杂度、风险高低以及与其他需求的关联性进行综合评估，制定优先级。我会与产品、运营等相关方进行协商，达成一致的优先级共识，并最终确定新需求的上线计划和资源投入。例如，我们会将需求划分为&amp;quot;必须有&amp;quot;、&amp;ldquo;应该有&amp;rdquo;、&amp;ldquo;可以有&amp;quot;等层级，确保核心价值的优先实现。在整个过程中，我会持续关注风险管理，提前识别潜在的技术或业务风险，并制定相应的预案，确保项目能够顺利推进。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-357a219af7be"&gt;3. 功能上线后如何判断这个功能上线前后的影响和优化有多少呢？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;● 该题是主观型问题，不设&amp;quot;唯一标准答案&amp;rdquo;。
● 面试官主要考察答题者对数据分析、效果评估、用户反馈和持续优化闭环的理解与实践能力。
● 建议的答题结构是：首先说明数据指标的定义与埋点，接着阐述A/B测试的重要性，最后强调用户反馈收集和持续迭代。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="高质量参考范文-2"&gt;高质量参考范文：&lt;/h5&gt;
&lt;p&gt;功能上线后，为了准确判断其影响和优化效果，我通常会从几个维度进行综合评估。首先是&lt;strong&gt;数据指标的监控与分析&lt;/strong&gt;。在功能设计阶段，我们就会明确核心的业务指标（如点击率、转化率、留存率、DAU/MAU等）和技术指标（如页面加载速度、接口响应时间等）。功能上线前，我们会确保所有相关的用户行为和系统性能都有完善的埋点方案。上线后，通过数据分析平台（如GA、神策、友盟等）持续追踪这些指标的变化趋势。对比功能上线前后的数据，可以直观地量化功能带来的影响。&lt;/p&gt;
&lt;p&gt;其次，&lt;strong&gt;A/B测试&lt;/strong&gt;是评估功能影响最科学的方法之一。如果条件允许，我们会将新功能通过A/B测试的方式灰度上线，将用户分成对照组和实验组。对照组用户使用旧功能，实验组用户使用新功能。通过对比两组用户的核心指标数据，可以排除其他干扰因素，更准确地评估新功能带来的实际增益或负面影响。这能帮助我们判断新功能是否达到了预期目标，或者是否需要进一步优化。&lt;/p&gt;
&lt;p&gt;最后，&lt;strong&gt;用户反馈的收集与分析&lt;/strong&gt;也至关重要。我们会通过多种渠道收集用户对新功能的反馈，包括用户调研问卷、用户访谈、线上评论、客服反馈等。这些定性数据可以帮助我们理解用户在使用过程中遇到的具体问题、痛点以及他们的真实感受，从而发现数据指标无法揭示的深层问题。我们会定期复盘这些反馈，结合数据分析的结果，识别功能潜在的优化点，并将其纳入后续的产品迭代计划中，形成一个持续优化、不断提升用户体验的闭环。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-950e4ede29a8"&gt;4. 有去了解过用户反馈最多的问题或者诉求最强的问题是什么吗？&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;● 该题是主观型问题，不设&amp;quot;唯一标准答案&amp;quot;。
● 面试官出这道题主要想确认哪些知识维度？
● 考察候选人是否关注用户、理解用户痛点，并具备从用户角度思考问题的能力。
● 评估候选人是否具备主动发现问题并寻求解决方案的意识。
● 该题所考知识点中有哪些高频实际应用点？
● 用户研究与用户画像分析
● 竞品分析与行业趋势洞察
● 用户体验（UX）与产品优化&lt;/p&gt;</description></item><item><title>字节-今日头条-校招 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-36/round-46/</link><pubDate>Fri, 27 Jun 2025 08:02:46 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-36/round-46/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-36/round-45/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-36/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-36/round-47/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察前端基础知识、项目经验和算法能力。&lt;/p&gt;
&lt;p&gt;本轮共 12 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-038c546ee8da"&gt;1. 简单介绍一下你上一段实习中觉得做的比较好的项目&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;● 主观型问题，无唯一标准答案。
● 面试官主要考察你的项目理解深度、技术选型能力、问题解决能力、以及对项目成果的复盘与表达能力。
● 建议的答题结构：首先简要介绍项目背景和你的角色；接着详细阐述你在项目中负责的具体工作、遇到的挑战及如何解决；最后总结项目成果和你的收获。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我在XX公司实习期间，参与了一个内部运营效率工具的开发，其中我主导了&amp;quot;智能数据报表系统&amp;quot;的前端部分，这个项目我个人觉得做得比较好。项目背景是，之前的运营数据统计完全依赖人工手动导出和整理，效率低下且易出错。我们团队的目标是构建一个自动化、可视化的报表系统，让运营人员能够实时查看核心数据指标。&lt;/p&gt;
&lt;p&gt;我主要负责报表的可视化组件开发和数据交互逻辑。在技术选型上，我没有简单地套用现有图表库，而是深入调研了业务需求，最终选择了ECharts进行定制化开发，因为它的灵活性和丰富图表类型能很好地满足我们多样化的报表展示需求。开发过程中最大的挑战是如何处理海量数据在前端的渲染性能问题。初期我们尝试直接加载全部数据，导致页面卡顿严重。我查阅资料并与后端协商，最终采用了数据分批加载和前端数据虚拟化的方案，即只加载当前视图所需数据，并对表格和图表进行局部渲染。这不仅大幅提升了页面响应速度，也降低了后端的数据传输压力。&lt;/p&gt;
&lt;p&gt;另一个亮点是，我设计并实现了一个可配置的报表生成器。运营人员可以通过拖拽组件、配置数据源和筛选条件，自定义生成各种报表，极大地提高了他们的工作效率，也减少了开发人员的维护成本。在项目上线后，我通过用户反馈持续迭代，例如增加了数据导出功能、优化了图表联动效果，使得系统更加完善。这个项目让我深刻体会到了前端工程化和性能优化的重要性，也锻炼了我从需求分析到方案设计、再到具体实现和持续优化的全链路项目能力。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-a1b4e5301540"&gt;2. 想知道你们的项目大概是什么样的结构，你在开发的时候会从什么地方下手？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;● 主观型问题，无唯一标准答案。
● 面试官主要考察你对项目整体架构的理解、系统性思维、以及实际开发流程的把控能力。
● 建议的答题结构：首先概述项目采用的架构模式（如微前端、Monorepo、单体应用等）；接着描述核心模块的划分和技术栈；然后详细说明当你接到一个开发任务时，会从哪些方面着手分析和实现；最后可以提及一些你在开发流程中的最佳实践或思考。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我们团队负责的XX系统，其整体架构是一个典型的微前端应用。具体来说，我们采用了基于qiankun的微前端方案，将整个系统拆分为多个独立的子应用，例如用户管理、订单中心、数据分析等。每个子应用都可以独立开发、独立部署，但在主应用中进行集成和路由管理。这样的好处是，团队成员可以专注于各自的子应用开发，降低了耦合度，也便于技术栈的演进和模块的复用。&lt;/p&gt;
&lt;p&gt;当我接到一个开发任务时，通常会遵循以下步骤：&lt;/p&gt;
&lt;p&gt;首先是&lt;strong&gt;需求分析和理解&lt;/strong&gt;。我会仔细阅读需求文档，明确用户故事和业务目标，如果存在不清晰的地方，会主动与产品经理或设计师沟通，确保我对需求的理解是准确和全面的。这一步至关重要，它决定了后续开发的方向。&lt;/p&gt;
&lt;p&gt;其次是&lt;strong&gt;技术方案设计&lt;/strong&gt;。我会根据需求，结合当前项目的架构和技术栈，思考实现方案。这包括：是否需要新增组件或模块？数据流如何设计？接口如何定义？是否涉及到性能优化或兼容性问题？例如，如果是一个新功能模块，我会考虑其在微前端架构下的集成方式，以及与主应用之间的通信机制。如果涉及复杂的数据处理，我会优先考虑数据在前端的缓存策略，以及如何减少不必要的渲染。&lt;/p&gt;
&lt;p&gt;接着是&lt;strong&gt;代码实现&lt;/strong&gt;。我会根据设计好的方案，开始编写代码。我会严格遵循团队的代码规范和组件化原则，确保代码的可读性和可维护性。在实现过程中，我会注重模块的拆分和函数的封装，避免出现冗余代码。&lt;/p&gt;
&lt;p&gt;在开发过程中，我非常重视&lt;strong&gt;自测和调试&lt;/strong&gt;。我会编写单元测试和集成测试，确保自己实现的功能符合预期。如果遇到问题，会利用浏览器开发工具进行调试，分析问题原因并及时解决。此外，我也会关注代码的性能，例如使用Chrome DevTools进行性能分析，寻找优化点。&lt;/p&gt;
&lt;p&gt;最后是&lt;strong&gt;代码评审和部署&lt;/strong&gt;。在完成开发和自测后，我会提交代码进行代码评审，听取团队成员的建议，并对代码进行优化。通过评审后，会按照CI/CD流程进行部署，并在部署后关注线上监控，确保功能稳定运行。&lt;/p&gt;
&lt;p&gt;这种结构化的开发流程，使得我在面对复杂任务时能够有条不紊地进行，并能及时发现和解决问题，保障了项目的开发质量和效率。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-9aff19f25b6c"&gt;3. IntersectionObserver的事件回调是宏任务还是微任务？如何判断呢？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;● JavaScript 事件循环机制：考察对宏任务和微任务的理解，以及它们在事件循环中的执行顺序。
● 浏览器 API 原理：考察对 &lt;code&gt;IntersectionObserver&lt;/code&gt; 这一 Web API 的底层工作原理的掌握，特别是其回调函数的执行时机。
● 实际应用与判断：考察如何在实际开发中判断异步操作的类型，并理解其对程序性能和行为的影响。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h4 id="11-原理说明"&gt;1.1 原理说明&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;IntersectionObserver&lt;/code&gt; 的事件回调是&lt;strong&gt;微任务&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;宏任务 (MacroTask)&lt;/strong&gt;：包括 &lt;code&gt;script&lt;/code&gt; (整体代码)、&lt;code&gt;setTimeout&lt;/code&gt;、&lt;code&gt;setInterval&lt;/code&gt;、&lt;code&gt;setImmediate&lt;/code&gt; (Node.js 独有)、I/O、UI 渲染等。每次事件循环只会执行一个宏任务，执行完后会检查微任务队列。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;微任务 (MicroTask)&lt;/strong&gt;：包括 &lt;code&gt;Promise.then()&lt;/code&gt;/&lt;code&gt;.catch()&lt;/code&gt;/&lt;code&gt;.finally()&lt;/code&gt;、&lt;code&gt;MutationObserver&lt;/code&gt;、&lt;code&gt;process.nextTick&lt;/code&gt; (Node.js 独有)、&lt;code&gt;queueMicrotask&lt;/code&gt;。微任务在当前宏任务执行完毕后，下一个宏任务开始之前执行，且会清空所有微任务。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;IntersectionObserver&lt;/code&gt; 的回调函数被设计为微任务，是为了保证在当前帧的 DOM 更新完成之后、但浏览器渲染之前执行。这样可以确保在回调函数中进行的 DOM 操作能够及时反映在当前帧的渲染中，避免了不必要的布局抖动或视觉闪烁。&lt;/p&gt;</description></item><item><title>字节-今日头条-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-36/round-45/</link><pubDate>Fri, 27 Jun 2025 08:02:45 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-36/round-45/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-36/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-36/round-46/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察前端基础知识和工程化实践&lt;/p&gt;
&lt;p&gt;本轮共 19 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-1760562f8190"&gt;1. 介绍一下简历中的组件库项目&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;非唯一标准答案&lt;/strong&gt;：本题是主观型问题，没有唯一的标准答案，主要考察面试者的综合能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;考察能力&lt;/strong&gt;：面试官主要考察您的表达能力、对项目背景和技术细节的理解、解决问题的思路系统性，以及项目复盘和总结的能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;答题结构建议&lt;/strong&gt;：建议从项目背景和目的、技术选型与核心功能、遇到的挑战与解决方案、个人贡献与收获等方面展开阐述，力求条理清晰、重点突出。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="高质量参考范文"&gt;高质量参考范文：&lt;/h5&gt;
&lt;p&gt;在我的简历中，我提到了一个组件库项目，这个项目是我在实习期间为了统一团队UI规范，提升开发效率而主导或参与开发的。我们的目标是构建一套覆盖常用UI组件（如按钮、输入框、弹窗、表格等）的跨框架（或特定框架如Vue/React）的组件库，以满足业务快速迭代的需求，并保证产品界面的一致性。&lt;/p&gt;
&lt;p&gt;在技术选型上，我们选择了Vue 3 + TypeScript + Vite + Sass Modules作为核心技术栈。Vue 3 的 Composition API 帮助我们更好地组织组件逻辑，提升了组件的复用性和可维护性；TypeScript则保证了代码的类型安全，尤其是在大型项目协作中大大减少了潜在的类型错误。Vite作为构建工具，极大地提升了开发服务器的启动速度和热更新效率。在样式方面，我们采用了Sass Modules，确保了组件样式的局部作用域，避免了全局污染，同时通过Sass的变量和混入特性，提升了样式代码的可维护性。&lt;/p&gt;
&lt;p&gt;在核心功能实现上，我们关注了组件的通用性和可配置性。例如，在实现一个Select组件时，我们不仅考虑了基本选择功能，还加入了搜索过滤、多选、自定义渲染模板、异步加载选项等高级特性。每个组件都经过了详细的API设计和文档编写，确保其他开发者能够快速上手和正确使用。我们还集成了单元测试和端到端测试，以保证组件的质量和稳定性。&lt;/p&gt;
&lt;p&gt;在项目过程中，我们也遇到了一些挑战。例如，如何设计一套灵活的主题机制，使得组件库能够轻松适应不同业务线的品牌风格，我们最终通过CSS Variables和一套主题生成工具解决了这个问题。另一个挑战是性能优化，特别是大型组件（如虚拟列表的表格）的渲染性能，我们通过按需加载、虚拟滚动等技术手段，确保了组件在处理大量数据时依然保持流畅。&lt;/p&gt;
&lt;p&gt;通过这个组件库项目，我不仅深入理解了前端组件化开发的最佳实践，也锻炼了我在项目规划、技术选型、问题解决和团队协作方面的能力。我觉得最大的收获是，看到自己开发的组件被其他业务方广泛使用，并有效提升了他们的开发效率时，那种成就感是非常大的。这个项目也让我对前端工程化有了更深刻的理解，认识到标准化、自动化和高质量交付对于前端开发的重要性。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-61d0b68b7fb6"&gt;2. vite 和 webpack 有什么区别？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;构建工具的理解&lt;/strong&gt;：面试官希望了解面试者对前端构建工具的整体认知，包括它们在前端开发流程中的作用和重要性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vite与Webpack的核心差异&lt;/strong&gt;：考察面试者是否能清晰阐述两者在开发模式（Dev Server）和生产模式（Build）上的根本性区别，特别是它们处理模块依赖和启动开发服务器的方式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能优化&lt;/strong&gt;：面试官想确认面试者是否能从性能角度分析两者的优劣，特别是Vite如何利用ESM（ECMAScript Modules）和原生浏览器支持实现快速的开发体验。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术趋势&lt;/strong&gt;：考察面试者是否关注前端生态的新技术发展，并能理解新技术带来的优势和对现有工具的影响。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="11-原理说明"&gt;1.1 原理说明&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Webpack&lt;/strong&gt;：
Webpack 是一个模块打包器。在开发模式下，Webpack 会将整个应用的所有模块（JavaScript、CSS、图片等）打包成浏览器可以识别的静态资源。在启动开发服务器之前，它需要完成整个打包过程。当代码发生修改时，Webpack 会重新编译并生成新的打包文件，然后通过热模块替换（HMR）机制将更新注入到浏览器中。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vite&lt;/strong&gt;：
Vite 是一种基于浏览器原生 ES Modules 的构建工具。在开发模式下，Vite 不会预先打包整个应用。它利用浏览器对 ES Modules 的原生支持，当浏览器请求某个模块时，Vite 会即时地对该模块进行转换（例如处理 TypeScript、Vue/React 单文件组件等），然后直接提供给浏览器。这极大地减少了开发服务器的启动时间和热更新的时间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核心区别与联系&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;开发模式启动速度&lt;/strong&gt;：Webpack 需要先打包再启动服务，随着项目规模增大，打包时间会显著增加。Vite 则利用浏览器原生 ES Modules 按需加载，实现了&amp;quot;冷启动&amp;quot;的秒开。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;热更新（HMR）机制&lt;/strong&gt;：Webpack 的热更新通常需要重新编译被修改的模块及其依赖链。Vite 的热更新同样基于 ES Modules，当一个模块被修改时，Vite 只需要精确地替换该模块及其直接相关的部分，更新速度更快，因为不需要重新构建整个依赖图。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生产环境构建&lt;/strong&gt;：尽管开发模式下两者原理不同，但在生产环境构建时，Vite 内部仍然会使用 Rollup 进行打包，类似于 Webpack 的打包输出，以获得最佳的兼容性和性能优化（例如代码分割、Tree-shaking 等）。这意味着 Vite 在生产构建阶段也进行打包，并非完全无打包。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;底层技术&lt;/strong&gt;：Webpack 依赖于自己的模块解析和打包机制，而 Vite 则深度依赖于浏览器原生的 ES Modules 特性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;为什么会出现 Vite&lt;/strong&gt;：随着前端项目日益庞大，基于打包器的开发服务器在冷启动和热更新方面的性能瓶颈日益凸显。Vite 的出现正是为了解决这一痛点，通过利用浏览器原生能力，显著提升开发效率和体验。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="12-核心用法--使用场景"&gt;1.2 核心用法 + 使用场景&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vite 的优势使用场景&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;大型项目开发&lt;/strong&gt;：对于拥有大量模块和复杂依赖的项目，Vite 的即时按需编译能够显著缩短开发服务器的启动时间和热更新响应时间，提升开发效率。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;追求极致开发体验&lt;/strong&gt;：如果你希望在开发过程中获得近乎瞬时的代码修改反馈，Vite 是一个理想的选择。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新建项目&lt;/strong&gt;：对于新项目，Vite 提供了更现代、更快速的开发起点。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Webpack 的优势使用场景&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;老旧项目或复杂构建需求&lt;/strong&gt;：对于历史项目，或需要高度定制化构建流程（例如微前端、特殊资源处理）的项目，Webpack 成熟的生态系统和灵活的配置依然是其优势。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对浏览器兼容性有极高要求&lt;/strong&gt;：Webpack 拥有更广泛的浏览器兼容性处理能力，可以通过各种 Loader 和 Plugin 支持老旧浏览器特性。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核心用法体现&lt;/strong&gt;：
无论是 Vite 还是 Webpack，它们的核心目标都是为了提供更好的开发体验和生产环境下的代码优化。Vite 通过&amp;quot;开发阶段无打包&amp;quot;的理念解决了传统打包器的性能痛点，而 Webpack 则以其强大的生态和高度可配置性，满足了各种复杂的构建需求。开发者在项目中选择使用哪种工具，通常取决于项目规模、团队熟悉度、对开发效率和生产环境性能的权衡。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="13-常见误区或面试陷阱"&gt;1.3 常见误区或面试陷阱&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;误区一：Vite 在生产环境也是无打包的。&lt;/strong&gt;
这是一个常见的误解。Vite 在开发环境利用原生 ESM 实现按需加载，确实没有预打包的步骤。但为了在生产环境中获得最佳的性能和兼容性（例如代码压缩、Tree-shaking、兼容性处理等），Vite 仍然会使用 Rollup 进行打包。面试时如果直接说 Vite 生产环境也无打包，会暴露对 Vite 工作原理理解不深。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;误区二：Vite 能够完全替代 Webpack。&lt;/strong&gt;
尽管 Vite 在许多方面表现出色，尤其是在开发体验上，但它并不能在所有场景下完全替代 Webpack。Webpack 的生态系统更加庞大和成熟，拥有更多针对特定场景的 Loader 和 Plugin，其配置灵活性也更高。例如，一些复杂的构建需求、特定的兼容性要求或集成旧技术栈时，Webpack 可能会是更稳健的选择。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;误区三：只强调速度快，不深入原理。&lt;/strong&gt;
面试官更希望听到你对 Vite 和 Webpack 底层原理的理解，而不仅仅是停留在&amp;quot;Vite 比 Webpack 快&amp;quot;的表层认知。理解它们在模块处理、HMR 实现、构建流程上的差异，并能结合实际场景分析各自的优劣，才能体现出更深入的理解。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;误区四：混淆&amp;quot;打包&amp;quot;和&amp;quot;编译/转换&amp;quot;。&lt;/strong&gt;
Vite 在开发模式下不是&amp;quot;打包&amp;quot;，而是对单个文件进行&amp;quot;编译/转换&amp;quot;以适应浏览器。而 Webpack 则是在启动服务前进行完整的&amp;quot;打包&amp;quot;过程。清晰区分这两个概念很重要。&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-7babb4ebd32f"&gt;3. vite 打包可能会有什么问题呢？需要怎么处理？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vite 生产环境构建的理解&lt;/strong&gt;：考察面试者是否清楚 Vite 在开发和生产环境的不同工作机制，特别是它在生产环境如何进行打包。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;常见打包问题及解决方案&lt;/strong&gt;：面试官想了解面试者是否遇到过 Vite 打包过程中可能出现的问题，以及如何诊断和解决这些问题，体现解决实际问题的能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rollup 配置的掌握&lt;/strong&gt;：由于 Vite 生产环境依赖 Rollup，面试官会关注面试者是否了解如何通过配置 Rollup 来解决特定的打包问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能优化与兼容性&lt;/strong&gt;：考察面试者在打包层面如何考虑应用的性能和浏览器兼容性，以及如何通过打包工具进行优化。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="11-原理说明-1"&gt;1.1 原理说明&lt;/h5&gt;
&lt;p&gt;尽管 Vite 在开发模式下以其&amp;quot;无打包&amp;quot;的理念提供极速体验，但在生产环境，它仍然需要对代码进行打包，以实现最佳的性能优化和兼容性。Vite 内部使用 &lt;a href="https://rollupjs.org/"&gt;Rollup&lt;/a&gt; 作为其生产环境的打包工具。Rollup 的优势在于其高效的 Tree-shaking（清除未使用的代码）和生成优化过的 ES Modules 捆绑包。因此，Vite 打包时可能遇到的问题，很多时候是与 Rollup 的打包特性、插件机制以及项目本身的特定需求相关的。&lt;/p&gt;</description></item><item><title>阿里-蚂蚁金服-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-34/round-42/</link><pubDate>Fri, 27 Jun 2025 06:05:39 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-34/round-42/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-34/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-34/round-43/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察校招生的基础内容&lt;/p&gt;
&lt;p&gt;本轮共 21 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-086d87101a30"&gt;1. 数组排序：实现一个函数，对包含数字和字符串的混合数组进行排序，数字在前按升序，字符串在后按字母顺序。&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;JavaScript算法。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sortMixedArray&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;arr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;sort&lt;/span&gt;((&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;typeA&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;typeof&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;typeB&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;typeof&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;typeA&lt;/span&gt; &lt;span style="color:#f92672"&gt;!==&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;typeB&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;typeA&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;number&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;typeA&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;number&amp;#39;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;localeCompare&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h2 id="question-subjective-11d6fb8e8fe1"&gt;2. 发布订阅模式：实现一个简单的EventEmitter类，包含on, emit, off方法。&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;JavaScript设计模式。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;EventEmitter&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;constructor&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;events&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;on&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;callback&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;events&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;events&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;events&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;callback&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;emit&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;, ...&lt;span style="color:#a6e22e"&gt;args&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;events&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;events&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;callback&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;callback&lt;/span&gt;(...&lt;span style="color:#a6e22e"&gt;args&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;off&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;callback&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;events&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;events&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;events&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;cb&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;cb&lt;/span&gt; &lt;span style="color:#f92672"&gt;!==&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;callback&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h2 id="question-subjective-33ea8704520e"&gt;3. lodash.get实现：实现一个类似lodash.get的函数，安全地获取嵌套对象属性。&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;JavaScript对象操作。&lt;/p&gt;</description></item><item><title>阿里-蚂蚁金服-校招 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-34/round-43/</link><pubDate>Fri, 27 Jun 2025 06:05:39 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-34/round-43/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-34/round-42/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-34/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察校招生的基础内容&lt;/p&gt;
&lt;p&gt;本轮共 15 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-12b75c445924"&gt;1. 自我介绍&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;自我认知。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;您好！我是一名对前端开发充满热情的工程师，拥有[X]年的开发经验。我熟练掌握HTML、CSS和JavaScript等前端技术，并在多个项目中运用Vue、React等框架构建用户友好的应用。在大学期间，我主修计算机科学，这为我打下了坚实的编程基础。通过参与各类项目，我不仅提升了技术能力，还培养了良好的团队协作和问题解决能力。我热爱学习新技术，经常阅读技术博客并参与开源项目。在之前的实习和工作中，我积累了丰富的实战经验，能够独立完成项目开发并优化性能。我期待能在贵公司继续我的前端开发之旅，为团队贡献我的技能和热情。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-48248947c671"&gt;2. 什么时候开始接触前端？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;学习经历。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我是在大学二年级的时候开始接触前端开发的。当时，我选修了一门网页设计与开发的课程，这让我对前端开发产生了浓厚的兴趣。从那时起，我便开始系统地学习HTML、CSS和JavaScript等前端技术，并通过大量的实践项目不断提升自己的技能。毕业后，我继续深入学习前端框架和工具，如Vue、React等，并在实际工作中不断积累经验。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-a3197363b10d"&gt;3. 复杂度比较高的项目有哪些&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;项目经验。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我参与过一个大型电商平台的前端开发，该项目的复杂度较高，主要体现在以下几个方面：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1. 技术栈丰富：项目中使用了Vue.js、Vuex、Vue Router、Vite、TypeScript等技术，结合了 Vuex 进行状态管理，Vue Router 实现了复杂的路由管理，Vite 作为构建工具提高了开发效率。
2. 性能要求高：由于平台需要支持大量的商品列表和用户并发访问，对性能的要求极高。我们通过代码分割、懒加载、图片优化等手段确保了页面的快速加载和流畅交互。
3. 功能模块复杂：涉及商品展示、购物车、订单管理、用户中心等多个功能模块，各模块之间需要紧密协作和数据共享。
4. 跨团队协作：前端团队与后端团队、设计团队紧密合作，确保项目的顺利交付。
&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-cda84e15acb0"&gt;4. 实习中的全栈部分做了什么&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;全栈开发能力。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在实习期间，我参与了多个全栈开发项目，主要负责以下工作：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1. 后端接口开发：使用Node.js和Express框架开发RESTful API接口，与前端进行数据交互。我设计并实现了用户认证、商品管理、订单处理等功能的API。
2. 数据库设计与操作：负责MySQL数据库的设计和优化，包括表结构设计、索引优化和查询性能提升。编写SQL语句进行数据的增删改查操作。
3. 前端与后端的联调：确保前后端数据格式的一致性和接口的稳定性，处理可能出现的跨域问题和数据验证问题。
4. 部署与运维：参与项目的部署工作，使用Docker容器化应用，并通过Nginx进行反向代理配置。监控应用的运行状态，及时处理线上问题。
&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-fba89be7c9b5"&gt;5. Vue 和 React 都是什么时候开始接触的&lt;/h2&gt;
&lt;h3 id="题目要点-4"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;技术学习历程。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我是在大学期间开始接触Vue和React的。具体来说：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1. Vue：在大三时，我通过一个个人项目开始学习Vue。当时，我被Vue简洁的语法和强大的组件化特性所吸引，于是深入研究了Vue的文档，并通过实践项目掌握了Vue的基本使用方法，包括组件的创建、数据绑定、事件处理等。
2. React：在大四时，我为了扩展自己的技术栈，开始学习React。我通过官方文档和在线教程了解了React的组件化思想、JSX语法以及Hooks的使用。通过一个小型的社交媒体项目，我实践了React的单向数据流和状态管理。
&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-4d44d004b9ad"&gt;6. 对原生 JS 如何学习的，掌握程度怎么样&lt;/h2&gt;
&lt;h3 id="题目要点-5"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;JavaScript能力。&lt;/p&gt;</description></item><item><title>阿里-阿里妈妈-实习 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-33/round-40/</link><pubDate>Fri, 27 Jun 2025 06:04:12 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-33/round-40/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-33/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-33/round-41/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察校招生的基础内容&lt;/p&gt;
&lt;p&gt;本轮共 13 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-9ff563bd8749"&gt;1. 实现第一个元素不移动后续元素与左边相隔8px（:not(:first-child）&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;CSS选择器与布局。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;要实现第一个元素不移动，后续元素与左边相隔8px，可以使用CSS中的&lt;code&gt;:not(:first-child)&lt;/code&gt;选择器来选择除第一个元素外的所有同级元素，并为其设置左边距。这在布局中非常有用，可以避免对第一个元素应用不必要的样式。以下是一个示例：&lt;br&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;container&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;item&amp;#34;&lt;/span&gt;&amp;gt;Item 1&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;item&amp;#34;&lt;/span&gt;&amp;gt;Item 2&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;item&amp;#34;&lt;/span&gt;&amp;gt;Item 3&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;item&amp;#34;&lt;/span&gt;&amp;gt;Item 4&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;container&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;display&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;flex&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;item&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;not&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;first-child&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;margin-left&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在这个示例中，&lt;code&gt;.item:not(:first-child)&lt;/code&gt;选择器匹配了所有带有&lt;code&gt;item&lt;/code&gt;类的元素，除了第一个元素。然后，我们通过&lt;code&gt;margin-left: 8px&lt;/code&gt;为这些元素设置了左边距，使它们与左边的元素相隔8px。第一个元素不会受到影响，因此不会产生左边距，从而实现了题目要求的布局效果。这种技术在创建水平排列的元素时非常有用，例如导航栏或标签页，可以确保第一个元素与容器的边缘对齐，而后续元素之间保持一致的间距。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-c77b5c6f-9fcc-40a6-bbf0-9f412d6ce94c"&gt;2. 写一个防抖&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/c77b5c6f-9fcc-40a6-bbf0-9f412d6ce94c"&gt;实现 debounce（防抖）函数&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;触发高频时间后n秒内函数只会执行一次,如果n秒内高频时间再次触发,则重新计算时间。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;触发高频时间后n秒内函数只会执行一次,如果n秒内高频时间再次触发,则重新计算时间。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;debounce&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;fn&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;time&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;timeout&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;clearTimeout&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;timeout&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;timeout&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;setTimeout&lt;/span&gt;(() =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fn&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;apply&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;arguments&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }, &lt;span style="color:#a6e22e"&gt;time&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;防抖常应用于用户进行搜索输入节约请求资源，window触发resize事件时进行防抖只触发一次。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-0b51a6d42592"&gt;3. 讲讲你的项目难点&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;项目经验与问题解决能力。&lt;/p&gt;</description></item><item><title>阿里-阿里妈妈-实习 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-33/round-41/</link><pubDate>Fri, 27 Jun 2025 06:04:12 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-33/round-41/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-33/round-40/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-33/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察校招生的基础内容&lt;/p&gt;
&lt;p&gt;本轮共 9 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-1398dd08a3be"&gt;1. Flex布局中flex-grow与flex-shrink的计算规则？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;CSS布局。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在Flex布局中，&lt;code&gt;flex-grow&lt;/code&gt;和&lt;code&gt;flex-shrink&lt;/code&gt;属性用于控制子元素在可用空间内的扩展和收缩行为。它们的计算规则如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;flex-grow&lt;/code&gt;：
&lt;ol&gt;
&lt;li&gt;定义：定义项目的扩展比例，即项目在主轴方向上可占有的额外空间的比例。&lt;/li&gt;
&lt;li&gt;计算规则：剩余空间按项目&lt;code&gt;flex-grow&lt;/code&gt;值的比例分配。如果所有项目的&lt;code&gt;flex-grow&lt;/code&gt;值之和大于1，则按比例分配；如果小于1，则先分配剩余空间。&lt;/li&gt;
&lt;li&gt;示例：如果有两个子元素，&lt;code&gt;flex-grow&lt;/code&gt;分别为1和2，总剩余空间为300px，则第一个子元素获得100px，第二个获得200px。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flex-shrink&lt;/code&gt;：
&lt;ol&gt;
&lt;li&gt;定义：定义项目的收缩比例，即项目在主轴方向上需要收缩时的比例。&lt;/li&gt;
&lt;li&gt;计算规则：当总项目大小超过容器可用空间时，项目按&lt;code&gt;flex-shrink&lt;/code&gt;值的比例收缩。收缩的最小尺寸受&lt;code&gt;min-width&lt;/code&gt;或&lt;code&gt;min-height&lt;/code&gt;限制。&lt;/li&gt;
&lt;li&gt;示例：如果有两个子元素，&lt;code&gt;flex-shrink&lt;/code&gt;分别为1和2，总超出行空间为100px，则第一个子元素收缩约33.33px，第二个收缩约66.66px。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;完整计算步骤：
&lt;ol&gt;
&lt;li&gt;计算总可用空间：容器主轴长度减去所有项目初始尺寸（&lt;code&gt;flex-basis&lt;/code&gt;或未设置时的内容尺寸）。&lt;/li&gt;
&lt;li&gt;判断剩余空间：
&lt;ol&gt;
&lt;li&gt;若剩余空间为正，按&lt;code&gt;flex-grow&lt;/code&gt;分配扩展空间。&lt;/li&gt;
&lt;li&gt;若剩余空间为负，按&lt;code&gt;flex-shrink&lt;/code&gt;分配收缩空间。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;计算比例：每个项目的比例为&lt;code&gt;flex-grow&lt;/code&gt;或&lt;code&gt;flex-shrink&lt;/code&gt;值除以所有项目对应值之和。&lt;/li&gt;
&lt;li&gt;分配空间：按比例将剩余空间分配或从项目中扣除。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flex&lt;/code&gt;属性：&lt;code&gt;flex&lt;/code&gt;是&lt;code&gt;flex-grow&lt;/code&gt;、&lt;code&gt;flex-shrink&lt;/code&gt;和&lt;code&gt;flex-basis&lt;/code&gt;的简写形式。例如，&lt;code&gt;flex: 1 1 0&lt;/code&gt;表示&lt;code&gt;flex-grow: 1&lt;/code&gt;、&lt;code&gt;flex-shrink: 1&lt;/code&gt;、&lt;code&gt;flex-basis: 0&lt;/code&gt;。这在等比例分配剩余空间时非常有用。&lt;/li&gt;
&lt;/ol&gt;
&lt;/details&gt;
&lt;h2 id="question-e9bcc1f4-1b0a-4213-9d3a-8e64c97c7848"&gt;2. 讲一下js闭包&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/e9bcc1f4-1b0a-4213-9d3a-8e64c97c7848"&gt;说说你对闭包的理解，以及闭包使用场景&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;h1 id="什么是闭包"&gt;什么是闭包&lt;/h1&gt;
&lt;p&gt;简单理解就是函数中嵌套函数。我们都知道局部变量我们是无法访问的，但是通过闭包可以做到。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 正常访问
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;lan&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;zh&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;hello&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;前端未来&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;)&lt;span style="color:#75715e"&gt;//很明显&amp;#39;undefined&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 换成闭包
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;hello&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;前端未来&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;demo&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;)&lt;span style="color:#75715e"&gt;//打印：前端未来
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="闭包的应用场景"&gt;闭包的应用场景&lt;/h1&gt;
&lt;h2 id="1-数据封装和隐私"&gt;1. 数据封装和隐私&lt;/h2&gt;
&lt;p&gt;闭包可以用来封装数据和功能，创建具有私有变量和公共接口的模块。&lt;/p&gt;
&lt;h3 id="应用"&gt;应用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;创建具有私有状态的模块或对象。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="2-函数工厂"&gt;2. 函数工厂&lt;/h2&gt;
&lt;p&gt;闭包用于创建返回函数的函数，这些返回的函数可以维持状态。&lt;/p&gt;</description></item><item><title>阿里-国际电商-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-32/round-38/</link><pubDate>Fri, 27 Jun 2025 06:02:07 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-32/round-38/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-32/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-32/round-39/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察校招生的基础内容&lt;/p&gt;
&lt;p&gt;本轮共 19 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-5605b7f269f9"&gt;1. 讲一下你的技术栈，为什么要学前端，如何学习前端的？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;技术栈、学习动机与方法。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;ol&gt;
&lt;li&gt;技术栈：
&lt;ol&gt;
&lt;li&gt;HTML/CSS：用于构建页面结构和样式。&lt;/li&gt;
&lt;li&gt;JavaScript：包括ES6+特性，用于实现页面交互。&lt;/li&gt;
&lt;li&gt;框架：熟练使用Vue.js和React，了解其生态系统（如Vue Router、Vuex、React Router、Redux）。&lt;/li&gt;
&lt;li&gt;构建工具：使用Vite和Webpack进行项目构建和优化。&lt;/li&gt;
&lt;li&gt;状态管理：使用Vuex和Redux进行状态管理。&lt;/li&gt;
&lt;li&gt;UI组件库：使用Element UI、Ant Design等。&lt;/li&gt;
&lt;li&gt;其他工具：Git、ESLint、Prettier、Jest等。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;学习动机：
&lt;ol&gt;
&lt;li&gt;前端开发结合了技术和创意，能够直接看到代码转化为用户界面，带来了即时满足感。&lt;/li&gt;
&lt;li&gt;前端领域技术更新快，充满挑战，提供了不断学习新知识的机会。&lt;/li&gt;
&lt;li&gt;对用户界面和交互设计的兴趣，希望创造良好的用户体验。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;学习方法：
&lt;ol&gt;
&lt;li&gt;在线课程：通过Coursera、Udemy、MDN Web Docs等平台学习基础知识。&lt;/li&gt;
&lt;li&gt;实践项目：通过个人项目和开源项目应用所学知识。&lt;/li&gt;
&lt;li&gt;阅读书籍：如《JavaScript高级程序设计》、《你不知道的JavaScript》。&lt;/li&gt;
&lt;li&gt;参与社区：在GitHub、Stack Overflow等社区与开发者交流，解决遇到的问题。&lt;/li&gt;
&lt;li&gt;技术博客：关注CSS-Tricks、JavaScript.info等博客，了解新技术和最佳实践。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/details&gt;
&lt;h2 id="question-ae93b62f-d9ef-46c2-8151-da164426f49f"&gt;2. 常见的H5标签有哪些 ，你是怎么用的&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/ae93b62f-d9ef-46c2-8151-da164426f49f"&gt;常见的H5标签有哪些 ，你是怎么用的&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;常见 H5 标签包括结构语义标签、文本语义标签、表单标签和媒体标签；实际使用中优先考虑语义表达和可访问性，而非样式；充分利用表单和媒体标签的原生能力以减少 JS 复杂度；&lt;code&gt;canvas&lt;/code&gt; 与 &lt;code&gt;svg&lt;/code&gt; 需根据场景选择；合理使用语义化标签能显著提升页面质量和长期可维护性。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在实际工程中，H5 标签并不是“记住有哪些”，而是&lt;strong&gt;是否理解它们在语义、结构、可访问性和默认行为上的差异，并能在合适的场景中使用&lt;/strong&gt;。对标签的理解，直接影响页面结构质量、SEO 以及后续的可维护性。&lt;/p&gt;
&lt;p&gt;从结构层面看，最常用的一类是&lt;strong&gt;语义化结构标签&lt;/strong&gt;。例如 &lt;code&gt;header&lt;/code&gt;、&lt;code&gt;nav&lt;/code&gt;、&lt;code&gt;main&lt;/code&gt;、&lt;code&gt;section&lt;/code&gt;、&lt;code&gt;article&lt;/code&gt;、&lt;code&gt;aside&lt;/code&gt;、&lt;code&gt;footer&lt;/code&gt;。在页面搭建时，通常会用 &lt;code&gt;header&lt;/code&gt; 承载页面或模块级头部信息，用 &lt;code&gt;nav&lt;/code&gt; 明确标识导航区域，用 &lt;code&gt;main&lt;/code&gt; 作为页面主体的唯一入口，再用 &lt;code&gt;section&lt;/code&gt; 或 &lt;code&gt;article&lt;/code&gt; 对内容进行分块。这类标签本身不改变样式，但会向浏览器、搜索引擎和辅助技术清晰表达“这块内容的角色是什么”，比单纯使用 &lt;code&gt;div&lt;/code&gt; 更具表达力。&lt;/p&gt;</description></item><item><title>阿里-国际电商-校招 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-32/round-39/</link><pubDate>Fri, 27 Jun 2025 06:02:07 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-32/round-39/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-32/round-38/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-32/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察校招生的基础内容&lt;/p&gt;
&lt;p&gt;本轮共 9 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-52145ae489ef"&gt;1. React/Vue/Angular框架熟悉哪个？对比一下&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;前端框架。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我对React和Vue较为熟悉，以下是对这三大框架的对比：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;React：
&lt;ol&gt;
&lt;li&gt;优点：
&lt;ol&gt;
&lt;li&gt;组件化：React采用组件化开发，将复杂的用户界面拆分为多个可复用的组件，提高代码的可维护性和复用性。&lt;/li&gt;
&lt;li&gt;虚拟DOM：使用虚拟DOM优化DOM操作，减少页面重绘和回流，提升性能。&lt;/li&gt;
&lt;li&gt;生态丰富：拥有庞大的生态系统，如Redux、React Router等，可满足各种复杂的开发需求。&lt;/li&gt;
&lt;li&gt;社区活跃：社区庞大，更新迅速，遇到问题时容易找到解决方案。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;缺点：
&lt;ol&gt;
&lt;li&gt;学习曲线：对初学者来说，需要学习JSX语法和组件化的思想，有一定学习成本。&lt;/li&gt;
&lt;li&gt;配置繁琐：项目搭建和配置相对复杂，需要手动配置Webpack等构建工具。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Vue：
&lt;ol&gt;
&lt;li&gt;优点：
&lt;ol&gt;
&lt;li&gt;易上手：语法简洁，文档清晰，容易上手，适合初学者快速入门。&lt;/li&gt;
&lt;li&gt;渐进式框架：可以逐步引入Vue，与现有项目或其他技术结合使用，灵活性高。&lt;/li&gt;
&lt;li&gt;模板语法：使用HTML模板，对熟悉HTML和JavaScript的开发者更友好。&lt;/li&gt;
&lt;li&gt;性能优化：也采用虚拟DOM，性能表现良好。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;缺点：
&lt;ol&gt;
&lt;li&gt;生态不够丰富：相较于React，生态和社区稍小，插件和库的选择相对有限。&lt;/li&gt;
&lt;li&gt;大型项目支持：在处理大型复杂项目时，可能不如React和Angular成熟。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Angular：
&lt;ol&gt;
&lt;li&gt;优点：
&lt;ol&gt;
&lt;li&gt;全栈解决方案：提供从前端到后端的一整套解决方案，包括路由、状态管理、表单处理等。&lt;/li&gt;
&lt;li&gt;强类型系统：基于TypeScript开发，具有强类型检查，有助于大型项目的代码维护和团队协作。&lt;/li&gt;
&lt;li&gt;依赖注入：内置依赖注入系统，方便管理组件和服务之间的依赖关系。&lt;/li&gt;
&lt;li&gt;适合企业级应用：在开发大型企业级应用时，提供了一套完整的架构和规范。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;缺点：
&lt;ol&gt;
&lt;li&gt;学习曲线陡峭：对初学者来说，需要掌握TypeScript、依赖注入、模块化等概念，学习成本较高。&lt;/li&gt;
&lt;li&gt;灵活性较低：框架较为庞大，定制化程度不如React和Vue高，不适合小型项目快速开发。&lt;/li&gt;
&lt;li&gt;社区相对较小：相较于React，社区活跃度和更新速度稍逊一筹。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/details&gt;
&lt;h2 id="question-f1a76998-d6bd-487e-ae2e-06a045f8e7aa"&gt;2. React Hooks闭包陷阱的产生原因？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/f1a76998-d6bd-487e-ae2e-06a045f8e7aa"&gt;说说你对 React Hook的闭包陷阱的理解，有哪些解决方案？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;React Hook 的闭包陷阱是一个常见的问题,它发生在使用 Hook 时,特别是在处理事件处理函数或异步操作时。&lt;/p&gt;
&lt;p&gt;闭包陷阱的本质是,在 Hook 内部定义的函数会捕获 Hook 函数执行时的状态,而不是最新的状态。这可能会导致一些意想不到的行为,比如事件处理函数无法访问最新的状态,或者异步操作使用了过期的数据。&lt;/p&gt;
&lt;p&gt;造成这个问题的原因是,React Hook 的设计使得组件函数在每次渲染时都会重新定义内部的函数,而这些函数会关闭当时的状态。&lt;/p&gt;
&lt;p&gt;解决这个问题的主要方案有以下几种:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;使用 useCallback Hook&lt;/strong&gt;:&lt;/p&gt;</description></item><item><title>阿里-灵犀互娱-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-31/round-36/</link><pubDate>Fri, 27 Jun 2025 06:00:30 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-31/round-36/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-31/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-31/round-37/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察校招生的基础内容&lt;/p&gt;
&lt;p&gt;本轮共 21 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-745bcd0bd804"&gt;1. 先简单自我介绍&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;自我认知。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;您好，我叫[你的名字]，毕业于[学校名称]的[专业名称]专业。在大学期间，我就对计算机科学产生了浓厚的兴趣，尤其是前端开发领域。在学习和实践中，我积累了扎实的编程基础，熟练掌握了HTML、CSS、JavaScript等前端开发技术，并在多个项目中担任核心开发角色。我热爱前端开发工作，喜欢通过代码创造用户友好的界面和交互体验。在业余时间，我会不断学习新技术，提升自己的专业能力。我希望能够在一个富有创新和挑战的环境中工作，与优秀的团队成员共同成长。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-0758f3ea2c02"&gt;2. 什么时候学前端？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;学习经历。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我是在大学二年级的时候开始接触前端开发的。当时，我选修了一门网页设计与开发的课程，这让我对前端开发产生了浓厚的兴趣。从那时起，我便开始系统地学习HTML、CSS和JavaScript等前端技术，并通过大量的实践项目不断提升自己的技能。毕业后，我继续深入学习前端框架和工具，如Vue、React等，并在实际工作中不断积累经验。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-0ee7770504c2"&gt;3. 怎么学前端？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;学习方法。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;学习前端开发需要系统的学习和不断的实践。首先，我从基础的HTML、CSS和JavaScript开始，通过阅读书籍、在线教程和官方文档，打下了坚实的基础。然后，我深入学习了前端框架，如Vue和React，通过实践项目来理解框架的核心概念和使用方法。同时，我积极参与开源项目和在线社区，与其他开发者交流经验，解决遇到的问题。此外，我还关注前端技术的最新发展趋势，通过参加技术会议、观看在线课程等方式不断更新自己的知识体系。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-9b77d3095037"&gt;4. 你的未来规划？&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;职业规划。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我的短期目标是在前端开发领域持续深耕，提升自己的技术能力和项目经验。我希望能够在当前的岗位上承担更多的责任，参与复杂项目的开发，并不断优化现有系统的性能和用户体验。长期来看，我希望能够成为前端技术专家，带领团队进行技术创新和项目研发。同时，我也希望能够不断提升自己的架构设计能力和团队管理能力，为公司的技术发展做出更大的贡献。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-4a1a8c54feda"&gt;5. 你觉得你什么地方比较强？哪里比较薄弱？&lt;/h2&gt;
&lt;h3 id="题目要点-4"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;自我认知。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我认为我的强项在于对前端技术的深入理解和实践经验。我能够快速学习新技术，并将其应用到实际项目中。同时，我具备良好的问题解决能力和团队协作精神，能够与团队成员高效合作，共同完成项目目标。然而，我也意识到自己在某些方面还有提升的空间。例如，在性能优化和大型项目的架构设计方面，我还需要进一步积累经验。此外，我还需要加强对后端技术的了解，以更好地进行前后端协同开发。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-f6c8f24757b3"&gt;6. 一个前端架构师要有什么长处？&lt;/h2&gt;
&lt;h3 id="题目要点-5"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;职业素养。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;一个优秀的前端架构师需要具备多方面的长处。首先，需要有深厚的技术功底，对前端技术栈有全面而深入的理解，包括HTML、CSS、JavaScript、前端框架、构建工具等。其次，需要具备良好的系统设计和架构能力，能够设计出高性能、可扩展、易维护的前端系统。此外，前端架构师还需要有较强的项目管理能力，能够领导团队进行项目的规划、开发和交付。良好的沟通能力和团队协作精神也是必不可少的，能够与产品、后端团队等进行有效的沟通和协作。最后，前端架构师需要有敏锐的技术洞察力，能够关注行业动态，引入新的技术和方法，推动团队的技术进步。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-0c0db5d1-e09a-4699-911a-3cfa4f4bd765"&gt;7. 微前端是什么？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/0c0db5d1-e09a-4699-911a-3cfa4f4bd765"&gt;什么是微前端？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-6"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;微前端（Micro-Frontends）是一种类似于微服务的架构，它将微服务的理念应用于浏览器端，即将 Web 应用由单一的单体应用转变为多个小型前端应用聚合为一的应用。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;微前端（Micro-Frontends）是一种类似于微服务的架构，它将微服务的理念应用于浏览器端，即将 Web 应用由单一的单体应用转变为多个小型前端应用聚合为一的应用。&lt;/p&gt;
&lt;p&gt;各个前端应用还可以独立运行、独立开发、独立部署。&lt;/p&gt;
&lt;p&gt;微前端不是单纯的前端框架或者工具，而是一套架构体系，&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-1c3850f1-2fdf-46a8-8b6e-ff9a6f1abf08"&gt;8. SPA和MPA的区别？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/1c3850f1-2fdf-46a8-8b6e-ff9a6f1abf08"&gt;SPA和MPA的区别？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-7"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;SPA 通过前端路由在单一 HTML 中完成页面切换，交互流畅但首屏和 SEO 成本较高；MPA 每次导航请求新页面，SEO 友好且隔离性强，但交互体验有限；两者本质差异在于前后端渲染与路由职责的划分；现代项目常通过 SSR、SSG 等方式在两种模式之间折中。&lt;/p&gt;</description></item><item><title>阿里-灵犀互娱-校招 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-31/round-37/</link><pubDate>Fri, 27 Jun 2025 06:00:30 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-31/round-37/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-31/round-36/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-31/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察校招生的基础内容&lt;/p&gt;
&lt;p&gt;本轮共 13 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-5fb1a3884b85"&gt;1. 你是什么时候开始学前端的&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;学习经历。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我接触前端开发是在大学二年级的时候。当时，我选修了一门网页设计与开发的课程，这让我对前端开发产生了浓厚的兴趣。从那时起，我便开始系统地学习HTML、CSS和JavaScript等前端技术。我通过阅读书籍、在线教程和官方文档，打下了坚实的基础。同时，我积极参与实践项目，不断提升自己的技能。毕业后，我继续深入学习前端框架和工具，如Vue、React等，并在实际工作中不断积累经验。这段学习经历不仅让我掌握了前端开发的技术，还培养了我对前端开发的热爱和持续学习的态度。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-468b089f1bb3"&gt;2. 为什么选择前端这个方向呢，是如何学习前端的&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;学习动机与方法。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我选择前端开发是因为它结合了技术和创意，能够直接看到自己的代码转化为用户界面，这种即时反馈让我感到非常满足。同时，前端领域技术更新快，充满挑战，能够不断学习新知识。我通过在线课程（如Coursera、Udemy）、官方文档（如MDN Web Docs）和实践项目学习前端。我积极参与开源社区（如GitHub），与其他开发者交流经验，并通过阅读技术博客（如CSS-Tricks、JavaScript.info）保持对新技术的敏感度。这种多渠道的学习方式让我能够全面掌握前端开发的技能，并在实践中不断提升。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-8dcadd663636"&gt;3. 说一下你觉得前端和后端有什么区别&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;前后端理解。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;前端和后端在技术栈、运行环境、关注点等方面有显著区别：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;技术栈：
&lt;ol&gt;
&lt;li&gt;前端：主要使用HTML、CSS、JavaScript及其框架（如Vue、React、Angular）进行开发。例如，使用Vue.js构建用户界面，处理用户交互逻辑。&lt;/li&gt;
&lt;li&gt;后端：使用服务器端语言（如Node.js、Java、Python、Ruby）和框架（如Express、Spring Boot、Django、Rails）开发API、处理业务逻辑和与数据库交互。例如，使用Node.js和Express框架搭建RESTful API服务器。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;运行环境：
&lt;ol&gt;
&lt;li&gt;前端：代码运行在客户端浏览器中，与用户直接交互。前端开发者需要考虑不同浏览器的兼容性和用户体验。&lt;/li&gt;
&lt;li&gt;后端：代码运行在服务器上，处理请求、管理数据和执行业务逻辑。后端开发者关注服务器性能、安全性和可扩展性。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;关注点：
&lt;ol&gt;
&lt;li&gt;前端：注重用户体验、界面设计、响应式布局和性能优化（如页面加载速度、交互流畅性）。前端开发者需要与设计师紧密合作，实现视觉效果和交互功能。&lt;/li&gt;
&lt;li&gt;后端：关注数据存储、业务逻辑实现、API设计和安全性。后端开发者需要与数据库交互，处理并发请求，并确保系统的稳定性和可靠性。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;开发工具：
&lt;ol&gt;
&lt;li&gt;前端：使用VS Code等编辑器，搭配浏览器开发者工具进行调试。依赖构建工具（如Vite、Webpack）进行代码打包和优化。&lt;/li&gt;
&lt;li&gt;后端：使用IntelliJ IDEA、PyCharm等IDE，搭配数据库管理工具（如pgAdmin、MySQL Workbench）进行开发。需要配置服务器环境（如Nginx、Apache）和部署工具（如Docker、Kubernetes）。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;数据处理：
&lt;ol&gt;
&lt;li&gt;前端：主要处理数据的展示和用户输入的收集。通过API从后端获取数据，并将其转换为用户界面。&lt;/li&gt;
&lt;li&gt;后端：负责数据的存储、查询和业务逻辑处理。与数据库（如MySQL、MongoDB）交互，执行复杂的数据操作和事务管理。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;性能优化：
&lt;ol&gt;
&lt;li&gt;前端：优化页面加载时间、减少重绘和回流、提升交互响应速度。例如，通过懒加载、代码分割、图片优化等技术提高性能。&lt;/li&gt;
&lt;li&gt;后端：优化服务器响应时间、数据库查询效率、减少内存泄漏和提升并发处理能力。例如，使用缓存机制（如Redis）、数据库索引优化、连接池管理等技术提高性能。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-83c1d7c55a18"&gt;4. 最近有在看什么技术文章吗&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;学习态度。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;最近我在阅读关于WebAssembly性能优化的文章，了解如何通过WebAssembly提升前端应用的运行效率。例如，我读了一篇关于使用WebAssembly进行图像处理的文章，介绍了如何将图像处理算法编译为WebAssembly模块，从而在浏览器中实现高性能的图像编辑功能。&lt;/p&gt;
&lt;p&gt;同时，我也在关注前端框架的新特性，如Vue 3的Composition API和React的Concurrent Mode。这些新技术有助于构建更高效、响应更快的用户界面。&lt;/p&gt;
&lt;p&gt;此外，我还阅读了一些关于前端安全的文章，特别是关于防止XSS攻击和CSRF攻击的最佳实践，这些知识对于构建安全的Web应用至关重要。&lt;/p&gt;
&lt;p&gt;通过这些文章，我能够不断更新自己的知识体系，保持对技术前沿的敏感度，并将所学应用到实际项目中。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-e150e0ff-0182-4410-b082-b7d9dc215616"&gt;5. canvas 引擎有什么优化渲染性能的方案&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/e150e0ff-0182-4410-b082-b7d9dc215616"&gt;canvas 有什么优化渲染性能的方案&lt;/a&gt;&lt;/p&gt;</description></item><item><title>阿里-智能产品事业部-暑期实习 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-30/round-35/</link><pubDate>Fri, 27 Jun 2025 05:57:10 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-30/round-35/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-30/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察校招生的基础内容&lt;/p&gt;
&lt;p&gt;本轮共 18 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-0583a5eb88da"&gt;1. 请介绍一下你在 [具体项目名称] 中主要做了哪些工作？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;项目经验。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;回答参考：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;项目架构设计：参与设计项目的整体架构，选择前端技术栈。考虑到项目规模和性能需求，选择了 Vue.js 作为前端框架，Vuex 进行状态管理，Vue Router 实现单页面应用的路由管理，Vite 作为构建工具。这些技术的选择旨在提高开发效率和应用性能。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;核心模块开发：负责开发用户认证模块，实现了基于 JWT（JSON Web Token）的登录、注册和权限管理功能。通过与后端 API 的紧密协作，确保了用户数据的安全传输和存储。同时，开发了数据可视化模块，利用 ECharts 库展示复杂的业务数据，帮助用户更直观地理解和分析数据。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;性能优化：通过分析页面的性能瓶颈，实施了一系列优化措施。例如，采用代码分割技术将应用拆分成多个小块，实现按需加载；使用懒加载技术延迟加载非首屏资源；对图片资源进行压缩和格式优化，减少页面加载时间。这些优化显著提升了页面的加载速度，改善了用户体验。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;代码审查与测试：积极参与代码审查过程，遵循项目编码规范，确保代码质量。编写了大量的单元测试和集成测试用例，使用测试框架（如 Jest）进行自动化测试，确保代码的稳定性和可靠性，减少上线后的潜在问题。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-8c38cc2d315c"&gt;2. 在 [具体项目名称] 中，遇到了哪些技术难点？你是如何解决的？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;问题解决能力。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;回答参考：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;跨浏览器兼容性：项目需要支持多个主流浏览器，包括一些旧版本的浏览器。为了解决这一问题，使用 Babel 将 ES6+ 代码转译为 ES5，确保大部分现代 JavaScript 特性能够在旧浏览器中运行。同时，引入 Polyfill 库来补充那些浏览器原生不支持的 API，例如 Promise、fetch 等。此外，使用 Autoprefixer 工具为 CSS 添加必要的浏览器前缀，确保 CSS 样式在不同浏览器中的一致性。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;性能优化：随着项目规模的扩大，页面的加载时间和交互响应时间面临着挑战。通过分析，发现主要的性能瓶颈在于大量的初始 JavaScript 包和未优化的图片资源。为解决此问题，实施了代码分割策略，将应用的代码分割成多个小块，按需加载，减少了初始加载的包大小。同时，将图片资源转换为 WebP 格式，并实现了图片的懒加载，只有在用户滚动到图片位置时才加载图片，从而显著缩短了页面的初始加载时间。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;后端 API 集成：在开发过程中，遇到了 API 响应数据格式不一致的问题，这给前端的数据处理带来了困难。为了解决这个问题，设计了一个统一的数据处理中间层，对后端返回的数据进行预处理和格式化，使其符合前端的要求。同时，与后端团队进行了深入沟通，推动他们优化 API 设计，以更好地满足前端的需求。&lt;/p&gt;</description></item><item><title>阿里-阿里云-暑期实习 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-29/round-34/</link><pubDate>Fri, 27 Jun 2025 05:49:45 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-29/round-34/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-29/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 一共三轮面试，经过整理后形成该面经。&lt;/p&gt;
&lt;p&gt;主要考察了候选人的实习经历、项目经验以及对前端工具和技术的理解。问题涵盖了从Vite插件开发到模块管理等多个方面，重点测试了候选人的实际操作能力和对技术细节的掌握。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试深度考察工程化全链路能力（Vite插件开发/预构建/HMR原理）、性能优化实战（INP项目包体积↓40%/LCP时间↓50%）、跨端架构设计（JavaScript Bridge通信/兼容性治理）及模块化高级应用（单例设计/循环依赖检测）。难点聚焦于pnpm幽灵依赖治理、Vite HMR全流程解析及Node.js运行时设计思想。&lt;/p&gt;
&lt;p&gt;本轮共 32 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-8e9bf321df59"&gt;1. 请介绍你在乾象、腾讯的实习经历，包括实习期间遇到的难点和亮点。&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;实习经历, 项目背景, 技术挑战, 解决方案, 成绩, 亮点&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;可以从项目背景、具体职责、遇到的技术挑战及解决方案等方面进行阐述。同时，可以分享一些在实习中取得的成绩或亮点，比如优化效果、团队协作等。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-e9efc1766bce"&gt;2. 现场实现一个最近开发的模块/组件，例如 URL Filter。&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;设计思路, 实现过程, 单元测试, 代码示例&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;可以详细描述这个模块/组件的设计思路、实现过程以及如何进行单元测试。如果可能的话，还可以展示一些代码片段来说明关键部分。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-9a4f386ff5db"&gt;3. 在实习期间开发的 Vite 插件的功能是如何实现的？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;架构兼容性&lt;/strong&gt;：理解 Vite 插件如何复用 Rollup 钩子并扩展开发环境特有的 Server 钩子。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;钩子应用场景&lt;/strong&gt;：能够准确区分 &lt;code&gt;config&lt;/code&gt;（配置修改）、&lt;code&gt;resolveId&lt;/code&gt;/&lt;code&gt;load&lt;/code&gt;（路径解析）、&lt;code&gt;transform&lt;/code&gt;（代码改写）的应用边界。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AST 与代码转换&lt;/strong&gt;：掌握如何通过 AST 操纵实现对代码的无损增强，并维持 SourceMap 的连续性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;环境控制&lt;/strong&gt;：利用 &lt;code&gt;configureServer&lt;/code&gt; 扩展中间件，以及通过 &lt;code&gt;handleHotUpdate&lt;/code&gt; 实现精准的热更新控制。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;虚拟模块技术&lt;/strong&gt;：利用虚拟模块机制实现编译时信息的动态注入。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;Vite 插件的实现本质上是基于 Rollup 插件接口的扩展，并结合了 Vite 特有的开发服务器钩子。可以从插件系统的架构设计、生命周期钩子（Hooks）的执行时序、以及针对开发环境与生产环境的差异化处理三个维度进行回答。&lt;/p&gt;</description></item><item><title>阿里-盒马-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-28/round-32/</link><pubDate>Fri, 27 Jun 2025 05:48:59 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-28/round-32/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-28/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-28/round-33/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 聚焦前端基础深度：虚拟DOM性能边界（复杂DOM场景优劣）、响应式布局实现（媒体查询/弹性布局）、浏览器兼容性实战（Polyfill/Babel）、微信小程序架构设计理念。难点在于Rem计算优化策略和O(1)空间复杂度的字符串逆序算法设计。&lt;/p&gt;
&lt;p&gt;本轮共 10 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-12b75c445924"&gt;1. 自我介绍&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;个人背景、技能、经验、职业规划等。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;参考模版如下，一般3分钟以内即可。&lt;br&gt;
面试官您好！我叫[姓名]，毕业于[毕业院校]，专业是[专业名称]。我有XX段前端开发实习经验，熟练掌握HTML、CSS、JavaScript等前端技术栈，主要的技术栈是React。在XX公司实习期间，主要参与过供应链管理系统和微信小程序开发，学习了前端相关专业技术，以及熟悉了项目的整体流程，同时积累了丰富的项目经验。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-5573b31b-5f00-409c-b032-3285ac844d62"&gt;2. React 的虚拟 DOM 解决了什么问题？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/5573b31b-5f00-409c-b032-3285ac844d62"&gt;React 的虚拟 DOM 解决了什么问题？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;跨平台能力&lt;/strong&gt;：通过对象层的抽象，实现了 UI 描述与具体渲染平台的解耦。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开发范式转换&lt;/strong&gt;：将命令式的 DOM 操作转变为声明式的数据驱动，提升了复杂业务的可维护性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能兜底&lt;/strong&gt;：通过批处理和 Diff 算法，在不增加开发者负担的情况下，减少了不必要的真实 DOM 操作开销。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;研发效率&lt;/strong&gt;：让开发者专注于业务逻辑而非底层 DOM 树的增删改查，降低了出错概率。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在探讨 React 虚拟 DOM（Virtual DOM）所解决的问题时，不能简单地将其归结为“性能更快”，这实际上是一个常见的误区。&lt;/p&gt;
&lt;p&gt;从长期的工程实践和框架演进来看，虚拟 DOM 核心解决了以下几个维度的挑战：&lt;/p&gt;
&lt;h3 id="1-解决跨平台与抽象层的问题"&gt;1. 解决跨平台与抽象层的问题&lt;/h3&gt;
&lt;p&gt;虚拟 DOM 最本质的贡献在于建立了一层&lt;strong&gt;声明式的抽象&lt;/strong&gt;。在传统的 Web 开发中，代码直接耦合在真实的 DOM 环境中。而虚拟 DOM 将复杂的 UI 转换成了一种轻量级的 JavaScript 对象结构（即 VNode）。&lt;/p&gt;
&lt;p&gt;这种抽象层使得 React 脱离了浏览器的物理限制。因为 VNode 只是普通的 JS 对象，它不仅可以被渲染为浏览器的 DOM，也可以被渲染为移动端的原生控件（React Native）、服务端字符串（SSR）甚至是 Canvas 绘制指令。它解决了 UI 描述与底层渲染引擎之间的强耦合问题，实现了“一次学习，随处编写”的愿景。&lt;/p&gt;</description></item><item><title>阿里-盒马-校招 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-28/round-33/</link><pubDate>Fri, 27 Jun 2025 05:48:59 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-28/round-33/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-28/round-32/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-28/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 深入框架原理与工程化：小程序加载流程（缓存/渲染机制）、Vue路由动态加载（Code Splitting）、全局状态管理（Vuex模块化）、生命周期资源管理（mounted/beforeDestroy）。难点在于手势识别算法（滑动速度计算）和可控动画引擎（开始/暂停/取消）。&lt;/p&gt;
&lt;p&gt;本轮共 12 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-35e4a8d7-248e-429c-b590-da73408f3d37"&gt;1. 小程序的页面加载流程是怎样的？请简要描述从用户点击小程序图标到页面显示的整个过程。&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/35e4a8d7-248e-429c-b590-da73408f3d37"&gt;小程序的页面加载流程是怎样的？请简要描述从用户点击小程序图标到页面显示的整个过程。&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;双线程并行&lt;/strong&gt;：启动过程是渲染层（UI）和逻辑层（JS）同步初始化的过程。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;离线包机制&lt;/strong&gt;：通过本地缓存和分包加载策略，极大减少了网络传输对首屏的影响。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;预加载优化&lt;/strong&gt;：微信客户端通过预热环境和提前下载包来压榨启动耗时。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据驱动渲染&lt;/strong&gt;：首屏显示依赖于逻辑层到渲染层的初始数据传输（setData 机制的前身）。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;小程序的加载是一个多线程协作的过程，主要可以分为&lt;strong&gt;环境准备&lt;/strong&gt;、&lt;strong&gt;代码下载&lt;/strong&gt;、&lt;strong&gt;注入运行&lt;/strong&gt;以及&lt;strong&gt;首屏渲染&lt;/strong&gt;四个阶段。&lt;/p&gt;
&lt;h3 id="1-运行环境准备准备阶段"&gt;1. 运行环境准备（准备阶段）&lt;/h3&gt;
&lt;p&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;双线程环境初始化&lt;/strong&gt;：微信会同时初始化两个运行环境，即&lt;strong&gt;逻辑层（AppService）&lt;strong&gt;和&lt;/strong&gt;渲染层（WebView）&lt;/strong&gt;。为了提速，微信通常会预先启动一个通用的空白 WebView（预加载机制），从而缩短环境搭建的时间。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-代码包下载与加载资源阶段"&gt;2. 代码包下载与加载（资源阶段）&lt;/h3&gt;
&lt;p&gt;在环境准备的同时，微信会根据小程序的 AppID 去服务端请求最新的代码包。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;增量更新与缓存&lt;/strong&gt;：如果本地已有缓存，则直接校验版本；若无或版本过旧，则下载加密的代码包。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分包加载优化&lt;/strong&gt;：如果开发者配置了分包，此时只会下载“主包”内容，从而减少首次下载的数据量，提升启动速度。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-代码注入与逻辑初始化初始化阶段"&gt;3. 代码注入与逻辑初始化（初始化阶段）&lt;/h3&gt;
&lt;p&gt;代码包下载完成后，微信会开始解析并执行代码。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;逻辑层注入&lt;/strong&gt;：执行 &lt;code&gt;app.js&lt;/code&gt; 和各页面的 JS 逻辑。此时，小程序会触发 &lt;code&gt;App.onLaunch&lt;/code&gt; 和 &lt;code&gt;App.onShow&lt;/code&gt; 生命周期回调。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置解析&lt;/strong&gt;：解析 &lt;code&gt;app.json&lt;/code&gt; 和页面配置，确定全局样式、路由关系及初始页面。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-渲染层视图构建与首屏渲染渲染阶段"&gt;4. 渲染层视图构建与首屏渲染（渲染阶段）&lt;/h3&gt;
&lt;p&gt;这是用户肉眼感知页面出现的关键时刻。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;视图层初始化&lt;/strong&gt;：渲染层载入 &lt;code&gt;WXML&lt;/code&gt; 转换后的模板和 &lt;code&gt;WXSS&lt;/code&gt; 样式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;初始数据传输（First Paint）&lt;/strong&gt;：逻辑层在实例化页面后，会将初始数据（Initial Data）通过微信底层提供的 &lt;code&gt;evaluateJavascript&lt;/code&gt; 方式，跨线程传递给渲染层。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动态渲染&lt;/strong&gt;：渲染层接收到数据后，结合模板生成最终的 DOM 树，并交由浏览器引擎进行绘制。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5-交互就绪finish-阶段"&gt;5. 交互就绪（Finish 阶段）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;生命周期触发&lt;/strong&gt;：页面初次渲染完成后，逻辑层会收到反馈，并触发页面的 &lt;code&gt;onReady&lt;/code&gt; 回调。此时，逻辑层与渲染层已经建立了稳定的双向数据绑定，用户可以开始进行交互操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-92af3054-e90c-4c0d-a5af-2a54b19931ab"&gt;2. 小程序页面间有哪些传递数据的方法？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/92af3054-e90c-4c0d-a5af-2a54b19931ab"&gt;小程序页面间有哪些传递数据的方法？&lt;/a&gt;&lt;/p&gt;</description></item><item><title>京东-技术中台-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-27/round-30/</link><pubDate>Fri, 27 Jun 2025 05:48:05 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-27/round-30/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-27/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-27/round-31/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试深度考察JavaScript核心原理（闭包、继承实现）、前端框架（Vue响应式机制、虚拟DOM性能、Vue vs React区别）、性能优化（高并发请求处理、HTTP/2应用）、前端安全（XSS/CSRF防御）。难点聚焦于Vue响应式系统限制的解决（如动态字段更新）、复杂布局实现（自适应流式），以及高效算法设计（O(n)去重）。&lt;/p&gt;
&lt;p&gt;本轮共 14 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-12b75c445924"&gt;1. 自我介绍&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;个人背景、能力、经验。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;我叫[姓名]，毕业于[学校]，专业是[专业]。我有[X]年的前端开发经验，熟练掌握HTML、CSS、JavaScript等前端技术，熟悉Vue.js和React框架。在项目中，我注重代码质量和用户体验，善于解决复杂的技术问题。我曾参与过多个大型项目的开发，例如[项目名称]，负责[具体工作]，通过优化代码结构和性能，提升了页面加载速度和用户体验。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-48a8fe6d93f0"&gt;2. 怎么学习javascript的？讲一下闭包，自己的使用场景&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;JavaScript学习方法、闭包概念及应用。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;学习JavaScript时，我首先从基础语法入手，通过阅读经典书籍如《JavaScript高级程序设计》来系统地学习。闭包是JavaScript中的一个重要概念，它允许函数记住并访问其创建时所在的作用域链中的变量。闭包的使用场景很多，比如在事件处理中，可以使用闭包来保存事件相关的数据。例如，创建一个计数器函数，每次调用时返回当前的计数值，利用闭包可以保持计数器的状态。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-21144fa1-41b7-4077-97cd-b0c6030b10e0"&gt;3. Javascript如何实现继承？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/21144fa1-41b7-4077-97cd-b0c6030b10e0"&gt;Javascript如何实现继承？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;h2 id="1-原型链继承"&gt;1. 原型链继承&lt;/h2&gt;
&lt;p&gt;通过将一个构造函数的实例作为另一个构造函数的原型，实现属性和方法的继承。&lt;/p&gt;
&lt;h3 id="特点"&gt;特点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;简单易实现。&lt;/li&gt;
&lt;li&gt;缺点是父类实例的属性会被所有子类实例共享。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="2-借用构造函数经典继承"&gt;2. 借用构造函数（经典继承）&lt;/h2&gt;
&lt;p&gt;通过在子类构造函数中调用父类构造函数，实现属性的继承。&lt;/p&gt;
&lt;h3 id="特点-1"&gt;特点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;避免了原型链继承共享属性的问题。&lt;/li&gt;
&lt;li&gt;但无法继承父类的原型方法。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="3-组合继承原型链借用构造函数"&gt;3. 组合继承（原型链+借用构造函数）&lt;/h2&gt;
&lt;p&gt;结合原型链继承和借用构造函数的方法，既调用父类构造函数，又将父类原型赋值给子类原型。&lt;/p&gt;
&lt;h3 id="特点-2"&gt;特点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;可以继承实例属性和原型方法。&lt;/li&gt;
&lt;li&gt;需要注意避免构造函数属性的多次调用。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="4-原型式继承"&gt;4. 原型式继承&lt;/h2&gt;
&lt;p&gt;使用一个函数来创建一个新对象，并将这个新对象的原型指向另一个对象。&lt;/p&gt;
&lt;h3 id="特点-3"&gt;特点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;适用于对象之间的属性继承，不涉及构造函数。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="5-寄生式继承"&gt;5. 寄生式继承&lt;/h2&gt;
&lt;p&gt;基于原型式继承，但添加了额外的包装函数，以提供更好的控制和灵活性。&lt;/p&gt;
&lt;h3 id="特点-4"&gt;特点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;通过创建对象的副本来实现继承，避免修改原始对象。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="6-es6-类继承"&gt;6. ES6 类继承&lt;/h2&gt;
&lt;p&gt;使用&lt;code&gt;class&lt;/code&gt;关键字和&lt;code&gt;extends&lt;/code&gt;关键字实现继承。&lt;/p&gt;
&lt;h3 id="特点-5"&gt;特点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;语法简洁，易于理解。&lt;/li&gt;
&lt;li&gt;底层仍然是基于原型链实现。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="一是什么"&gt;一、是什么&lt;/h2&gt;
&lt;p&gt;继承（inheritance）是面向对象软件技术当中的一个概念。&lt;/p&gt;
&lt;p&gt;如果一个类别B“继承自”另一个类别A，就把这个B称为“A的子类”，而把A称为“B的父类别”也可以称“A是B的超类”&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;继承的优点&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;继承可以使得子类具有父类别的各种属性和方法，而不需要再次编写相同的代码&lt;/p&gt;</description></item><item><title>京东-技术中台-校招 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-27/round-31/</link><pubDate>Fri, 27 Jun 2025 05:48:05 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-27/round-31/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-27/round-30/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-27/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试聚焦CSS布局核心问题（浮动清除、BFC机制）、高频JS手写能力（防抖函数）、工程化实践（TS迁移痛点、Vue3升级策略）、深度性能优化（缓存协同更新、Tree Shaking原理）。难点在于浮动导致的布局塌陷解决方案、CDN与本地缓存协同策略设计，以及复杂框架迁移的兼容性处理。&lt;/p&gt;
&lt;p&gt;本轮共 11 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-1bcbaffba536"&gt;1. 浮动元素导致的布局错乱应该如何解决？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;CSS浮动布局及解决方案。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;浮动元素会导致其父元素高度塌陷，从而影响布局。解决方法有：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1. 清除浮动：在浮动元素后面添加一个空的`div`，设置`clear: both`。
2. 使用伪元素清除浮动：在父元素上使用`::after`伪元素，设置`clear: both`。
&lt;/code&gt;&lt;/pre&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;parent&lt;/span&gt;::&lt;span style="color:#a6e22e"&gt;after&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;content&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;display&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;block&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;clear&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;both&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;1. 使用`overflow: hidden`：给父元素设置`overflow: hidden`，但可能会隐藏超出部分的内容。
2. 使用`BFC`（块级格式化上下文）：通过设置`display: flow-root`或`overflow: auto`等属性，使父元素形成一个独立的BFC，从而包含浮动元素。
&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-f249762a3656"&gt;2. 实现一个固定侧边栏+自适应主内容的布局&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;CSS布局技巧。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;可以使用&lt;code&gt;flexbox&lt;/code&gt;布局实现固定侧边栏和自适应主内容的布局：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;container&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;sidebar&amp;#34;&lt;/span&gt;&amp;gt;侧边栏&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;main&amp;#34;&lt;/span&gt;&amp;gt;主内容&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;container&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;display&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;flex&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;sidebar&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 固定宽度 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;#f0f0f0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;main&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;flex&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 自适应宽度 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;#ffffff&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h2 id="question-c77b5c6f-9fcc-40a6-bbf0-9f412d6ce94c"&gt;3. 实现 debounce（防抖）函数&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/c77b5c6f-9fcc-40a6-bbf0-9f412d6ce94c"&gt;实现 debounce（防抖）函数&lt;/a&gt;&lt;/p&gt;</description></item><item><title>京东-广告数据-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-26/round-29/</link><pubDate>Fri, 27 Jun 2025 05:46:50 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-26/round-29/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-26/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 考察核心集中在前端性能优化（如无限加载卡顿、页面渲染延迟）、CSS布局与兼容性（如Flexbox自适应、跨浏览器适配）及Vue框架原理（如响应式限制、虚拟DOM优劣）。需重点准备懒加载/虚拟滚动优化、兼容性Hack技巧、异步执行顺序分析及需求拆分设计能力。&lt;/p&gt;
&lt;p&gt;本轮共 12 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-1471ea7054ad"&gt;1. 现在我们有一个 618 活动页的需求，需要你来做，你会如何拆分需求，如何设计？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;需求分析与设计能力&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;ol&gt;
&lt;li&gt;首先与产品、设计、运营等多部门沟通，明确活动页的核心功能、促销规则、页面风格等基本需求。例如，确定活动主题（如限时秒杀、满减优惠等）、预计流量、商品展示形式等。&lt;/li&gt;
&lt;li&gt;根据功能模块拆分需求，可将活动页分为头部导航区（包含活动标题、时间、入口等信息）、商品展示区（如秒杀商品列表、热门推荐商品列表等）、促销信息区（展示活动规则、优惠券领取等）、底部信息区（如活动说明、客服入口等）。&lt;/li&gt;
&lt;li&gt;在设计上，根据品牌风格和活动主题确定整体视觉风格，包括配色方案（如节日氛围的红色、金色等）、字体选择、图片风格等。针对商品展示区，考虑采用网格布局或瀑布流布局，以合理展示商品信息，包括商品图片、名称、价格、优惠信息等。对于交互设计，需考虑页面的滚动加载、商品点击跳转、优惠券领取等交互效果，确保用户体验流畅。&lt;/li&gt;
&lt;/ol&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-f2b52b32bd5b"&gt;2. 商品列表中一行有五个商品卡片，最后一个自适应剩余空间，怎么实现。&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;CSS 布局能力&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;可以使用 CSS 的 Flexbox 布局来实现。首先将商品列表的容器设置为 flex 布局，即 &lt;code&gt;display: flex&lt;/code&gt;。然后对前四个商品卡片设置固定宽度，例如 &lt;code&gt;width: 100px&lt;/code&gt;，最后一个商品卡片设置 &lt;code&gt;flex: 1&lt;/code&gt;，这样它就会占据所在行剩余的空间，实现自适应效果。同时，为了防止一行中商品卡片因内容过多而超出父容器宽度，可对每个商品卡片设置 &lt;code&gt;overflow: hidden&lt;/code&gt;，确保其内容在自身区域内显示，并且可以添加 &lt;code&gt;white - space: nowrap&lt;/code&gt; 和 &lt;code&gt;text - overflow: ellipsis&lt;/code&gt; 来处理溢出的文字内容。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-ebdcefd0ba4c"&gt;3. CSS 样式开发中你都遇到过哪些兼容性问题，如何解决的。&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;CSS 问题解决能力及兼容性知识&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;ol&gt;
&lt;li&gt;在不同浏览器中遇到过盒模型问题，例如 IE 浏览器的怪异盒模型与其他浏览器的标准盒模型不同，导致元素尺寸计算不一致。解决方法是使用 &lt;code&gt;box - sizing: border - box&lt;/code&gt;，并结合 CSS 重置样式表统一各浏览器的盒模型表现。
2. 浮动布局在某些低版本浏览器中可能出现父元素高度塌陷或子元素排列不整齐的问题。可以通过为父元素添加 &lt;code&gt;clearfix&lt;/code&gt; 清除浮动，即设置父元素 &lt;code&gt;overflow: hidden&lt;/code&gt; 或使用伪元素 &lt;code&gt;:after&lt;/code&gt; 添加清除浮动的样式来解决。
3. CSS3 动画在部分浏览器中可能不支持，或者动画效果不一致。例如，IE 浏览器对 CSS3 动画的支持较弱。解决方法是使用渐进增强的方式，在支持 CSS3 动画的浏览器中展示动画效果，对于不支持的浏览器提供简单的过渡效果或静态样式，并利用Modernizr 等工具进行特性检测，根据检测结果加载相应的样式和脚本。
4. 字体渲染在不同操作系统和浏览器中可能存在差异，影响页面的美观和一致性。可以通过设置字体的 &lt;code&gt;font - family&lt;/code&gt; 为系统安全字体组合，并使用相对单位（如 &lt;code&gt;em&lt;/code&gt;、&lt;code&gt;rem&lt;/code&gt;）设置字体大小，以提高字体的兼容性和可读性。&lt;/li&gt;
&lt;/ol&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-99d5bcff8208"&gt;4. 你刚刚说的上滑无限加载有没有性能问题，你怎么解决？&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;前端性能优化知识&lt;/p&gt;</description></item><item><title>字节-飞书-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-25/round-27/</link><pubDate>Thu, 26 Jun 2025 08:23:26 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-25/round-27/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-25/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-25/round-28/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察前端基础知识和实际应用能力。&lt;/p&gt;
&lt;p&gt;本轮共 20 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-c7bf157863bd"&gt;1. 实现一个宽度自适应的搜索框。&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CSS布局能力：&lt;/strong&gt; 面试官希望确认候选人对CSS的布局方式（如Flexbox、Grid或传统布局）的掌握程度，以及如何实现元素的响应式和自适应。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应式设计：&lt;/strong&gt; 考察候选人是否能考虑不同屏幕尺寸下的用户体验，并运用CSS媒体查询、视口单位等技术实现宽度自适应。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTML结构：&lt;/strong&gt; 确认候选人是否能编写语义化且结构清晰的HTML代码。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="11-原理说明"&gt;1.1 原理说明&lt;/h5&gt;
&lt;p&gt;宽度自适应的搜索框是指搜索框的宽度能够根据其父容器的宽度或视口宽度自动调整，以适应不同的屏幕尺寸和设备。实现这种效果通常依赖于CSS的弹性布局（Flexbox）或网格布局（Grid），结合相对单位（如百分比、vw/vh）或弹性单位（如flex属性）。其核心思想是让元素能够&amp;quot;伸缩自如&amp;quot;，而不是固定尺寸。&lt;/p&gt;
&lt;h5 id="12-核心用法--示例代码"&gt;1.2 核心用法 + 示例代码&lt;/h5&gt;
&lt;p&gt;以下是使用Flexbox实现宽度自适应搜索框的示例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;search-container&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;search-input&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;placeholder&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;请输入搜索内容&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;button&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;search-button&amp;#34;&lt;/span&gt;&amp;gt;搜索&amp;lt;/&lt;span style="color:#f92672"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;search-container&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;display&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;flex&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 占据父容器的全部宽度 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;max-width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;600&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 设置最大宽度，防止过宽 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;margin&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;auto&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 居中显示 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;border&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;solid&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;#ccc&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;border-radius&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;overflow&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;hidden&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 防止内容溢出 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;search-input&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;flex-grow&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 占据剩余空间 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;padding&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;border&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;none&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;outline&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;none&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 移除聚焦时的边框 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;search-button&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;padding&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;15&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;#007bff&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;color&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;white&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;border&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;none&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;cursor&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;pointer&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;font-size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;search-button&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;hover&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background-color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;#0056b3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* 媒体查询，适应小屏幕 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#66d9ef"&gt;media&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#f92672"&gt;max-width&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#f92672"&gt;768px&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;search-container&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;max-width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;90&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;场景说明：&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>字节-飞书-校招 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-25/round-28/</link><pubDate>Thu, 26 Jun 2025 08:23:26 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-25/round-28/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-25/round-27/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-25/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察前端开发者的项目经验、技术深度、问题解决能力以及对未来发展的思考。&lt;/p&gt;
&lt;p&gt;本轮共 15 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-15807fff741e"&gt;1. 了解飞书么，讲一下你的使用感受&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;● 说明该题是主观型问题，不考&amp;quot;唯一标准答案&amp;quot;&lt;/p&gt;
&lt;p&gt;● 面试官主要考察答题者对产品的理解、用户体验的洞察以及归纳总结能力&lt;/p&gt;
&lt;p&gt;● 答题结构建议：首先简要说明你对飞书的整体印象和使用频率，然后从几个具体的产品功能或使用场景出发，详细阐述你的感受、亮点和可以改进的地方。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;高质量参考范文：
我对飞书这款产品有比较深入的了解，因为我们团队在日常工作中就是飞书的重度用户，几乎所有的协作和沟通都在上面进行。从我的使用感受来看，飞书在一体化协作方面做得非常出色，它不仅仅是一个简单的即时通讯工具，更是一个集成了文档、会议、日程、OKR、邮件等多种功能的综合性协作平台，极大地提升了团队的工作效率。&lt;/p&gt;
&lt;p&gt;我感受最深的有以下几点：&lt;/p&gt;
&lt;p&gt;首先是&lt;strong&gt;文档和表格的强大协作能力&lt;/strong&gt;。飞书文档支持多人实时协同编辑，光标跟随、评论批注等功能都非常流畅，我们团队经常用它来共同撰写需求文档、项目周报等。表格功能也比传统Excel更灵活，支持多种视图和自动化能力，对于项目管理和数据统计非常方便，我们很多内部管理工作都迁移到了飞书表格上。这种所见即所得、实时同步的体验，比我们之前使用分离的工具效率高出很多。&lt;/p&gt;
&lt;p&gt;其次是&lt;strong&gt;会议和日历的无缝整合&lt;/strong&gt;。飞书会议的音视频质量很高，屏幕共享和标注功能也很实用。最棒的是它和日历的深度集成，我们可以在日历中直接创建会议，并关联飞书文档，会议结束后纪要也能快速生成并同步。这种从会议发起、进行到纪要归档的全流程一体化体验，减少了大量来回切换应用的麻烦。&lt;/p&gt;
&lt;p&gt;当然，在使用过程中，我也注意到一些可以改进的地方。例如，对于一些复杂的数据可视化需求，飞书表格目前的图表功能可能还不够强大，我们有时需要导出数据到其他专业工具进行处理。另外，在面对外部协作场景时，虽然飞书支持分享外部链接，但在权限控制和安全性方面，如果能提供更多灵活的配置选项，会更便于与外部伙伴高效协同。&lt;/p&gt;
&lt;p&gt;总的来说，飞书极大地改变了我们团队的协作模式，提升了整体工作效率。它在集成化、实时协作和移动端体验方面都有着显著优势。我相信随着产品的不断迭代，它在更多细分场景和个性化需求方面会做得更好。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-55e951a3b8c8"&gt;2. 如果飞书的某一个页面崩溃了 ，你会如何处理？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;● 说明该题是主观型问题，不考&amp;quot;唯一标准答案&amp;quot;&lt;/p&gt;
&lt;p&gt;● 面试官主要考察答题者的故障排查能力、问题分析思路、应急处理流程以及对用户体验的关注&lt;/p&gt;
&lt;p&gt;● 答题结构建议：首先表明你会从用户角度出发，然后从前端排查、后端排查、联调分析、解决方案、预防措施等多个维度，阐述你处理问题的完整思路和步骤。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;高质量参考范文：
如果飞书的某个页面崩溃了，我会立即启动一套系统的故障排查和处理流程，目标是尽快定位问题、恢复服务，并最大程度地减少对用户的影响。&lt;/p&gt;
&lt;p&gt;我的处理思路和步骤通常如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;初步判断与用户安抚（P0 紧急）&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;快速截图/录屏：&lt;/strong&gt; 立即保留现场证据，包括控制台报错、网络请求、崩溃页面截图等，为后续分析提供依据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安抚用户/上报：&lt;/strong&gt; 如果是线上普遍性问题，会第一时间通过内部渠道（如即时通讯工具）向上级和相关团队（后端、产品、SRE等）同步情况，并考虑是否需要发布公告，引导用户刷新页面或使用其他临时方案，确保用户感受到问题正在被处理。&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;code&gt;Console&lt;/code&gt;面板，查看是否有JavaScript错误、警告或网络请求失败的提示。JavaScript报错通常是页面崩溃的直接原因，栈追踪能帮助定位代码位置。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络请求分析：&lt;/strong&gt; 检查&lt;code&gt;Network&lt;/code&gt;面板，看是否有接口请求失败（如4XX、5XX错误），或者请求超时。特别是5XX错误，可能指示后端服务异常导致页面无法获取必要数据而崩溃。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存与CPU占用：&lt;/strong&gt; 使用&lt;code&gt;Performance&lt;/code&gt;和&lt;code&gt;Memory&lt;/code&gt;面板，观察页面崩溃前是否有内存飙升或CPU占用过高的情况，这可能指向内存泄漏、死循环或计算密集型操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码回溯与版本：&lt;/strong&gt; 确认当前页面的代码版本，检查近期是否有相关代码上线，是否有回滚的必要。使用&lt;code&gt;Source&lt;/code&gt;面板进行断点调试，观察变量值和代码执行流程。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地存储检查：&lt;/strong&gt; 检查&lt;code&gt;LocalStorage&lt;/code&gt;、&lt;code&gt;SessionStorage&lt;/code&gt;和&lt;code&gt;IndexedDB&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;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;接口健康状况：&lt;/strong&gt; 如果前端排查怀疑是后端问题，我会联系后端开发或SRE团队，确认相关API接口的健康状况、服务日志、异常报警信息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据库或缓存：&lt;/strong&gt; 后端会进一步排查数据库连接、缓存服务是否正常，是否有慢查询或数据一致性问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;依赖服务：&lt;/strong&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;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;锁定问题点：&lt;/strong&gt; 根据排查结果，确定是前端代码Bug（如空指针、死循环、组件渲染异常）、后端接口问题、网络问题、兼容性问题，还是其他服务故障。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;制定方案：&lt;/strong&gt; 如果是前端Bug，立即着手修复，并进行单元测试和集成测试。如果是后端问题，协同后端团队修复。如果是数据问题，考虑数据清洗或兼容处理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;紧急发布/回滚：&lt;/strong&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>字节-本地生活-校招 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-19/round-19/</link><pubDate>Tue, 24 Jun 2025 14:45:10 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-19/round-19/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-19/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-19/round-20/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本轮面试侧重考察候选人前端基础知识的系统掌握程度，包括 CSS 盒模型、选择器机制、ES6 语法、异步任务队列、响应式原理与网络协议等，同时会通过算法题考查思维能力与编码规范。&lt;/p&gt;
&lt;p&gt;重点关注以下几个方面：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;CSS布局与样式：考察对盒模型、选择器的深入理解，以及实际应用中的最佳实践&lt;/li&gt;
&lt;li&gt;JavaScript核心：重点关注ES6特性、闭包、异步编程等基础概念的掌握程度&lt;/li&gt;
&lt;li&gt;框架原理：主要考察Vue3响应式系统的实现原理与优化思路&lt;/li&gt;
&lt;li&gt;工程化思维：通过HTTP、缓存、性能优化等问题考察工程实践经验&lt;/li&gt;
&lt;li&gt;算法能力：通过字符串处理等典型题目考察基本编程功底&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;本轮共 17 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-12b75c445924"&gt;1. 自我介绍&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;这是一道主观性问题，没有标准答案。面试官主要考察：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;表达能力：语言组织、逻辑清晰度&lt;/li&gt;
&lt;li&gt;职业规划：技术深度、发展方向&lt;/li&gt;
&lt;li&gt;项目经验：技术栈匹配度、解决问题能力&lt;/li&gt;
&lt;li&gt;个人特质：学习能力、团队协作&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;&amp;ldquo;您好，我是XXX，有5年前端开发经验。毕业于XXX大学计算机科学专业，目前在一家互联网公司担任高级前端工程师。&lt;/p&gt;
&lt;p&gt;我擅长的技术栈是 Vue 和 React 生态，对前端工程化和性能优化有深入研究。最近两年主要负责公司的低代码平台建设，带领团队完成了从0到1的平台搭建。在这个项目中，我们解决了很多技术难题，比如大型JSON-Schema的渲染性能优化、自定义组件的实时预览等。通过这些优化，平台的页面渲染性能提升了60%，现在支持了超过100个业务团队的日常工作。&lt;/p&gt;
&lt;p&gt;在技术深度上，我特别关注前端框架底层原理，写过几篇关于Vue3响应式系统的技术文章，并给社区贡献过几个PR。同时我也在公司内部主导了前端性能监控体系的建设，建立了从采集、分析到报警的完整链路。&lt;/p&gt;
&lt;p&gt;选择字节跳动是因为被这里浓厚的技术氛围吸引，也认可公司在前端领域的技术实力。我希望能在更大的平台上，和优秀的团队一起解决更有挑战的问题。&amp;rdquo;&lt;/p&gt;
&lt;p&gt;答题建议结构&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;基本信息与技术栈&lt;/strong&gt;（15-20秒）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;教育背景&lt;/li&gt;
&lt;li&gt;工作年限&lt;/li&gt;
&lt;li&gt;技术栈概览&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;核心项目经历&lt;/strong&gt;（30-40秒）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1-2个最有代表性的项目&lt;/li&gt;
&lt;li&gt;突出个人贡献和技术难点&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;技术深度展示&lt;/strong&gt;（20-30秒）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;专注的技术领域&lt;/li&gt;
&lt;li&gt;技术产出或开源贡献&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;职业规划&lt;/strong&gt;（10-15秒）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对岗位的理解&lt;/li&gt;
&lt;li&gt;个人发展诉求&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;答题要点提示&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;时间控制在90秒左右&lt;/li&gt;
&lt;li&gt;按照时间重要性安排内容比重&lt;/li&gt;
&lt;li&gt;突出个人特色，避免平铺直述&lt;/li&gt;
&lt;li&gt;适度准备，保持自然流畅&lt;/li&gt;
&lt;li&gt;结合岗位特点，突出匹配度&lt;/li&gt;
&lt;/ol&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-45ad807cb4c3"&gt;2. 标准盒模型与IE盒模型的区别，如何通过CSS切换两种模型？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;考察对CSS盒模型的深入理解，包括两种盒模型的区别、计算方式及其对布局的影响。同时也考察在工程实践中如何合理使用box-sizing，以及不同盒模型在响应式布局中的应用场景和性能影响。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h5 id="11-原理说明"&gt;1.1 原理说明&lt;/h5&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;p&gt;&lt;strong&gt;标准盒模型 (content-box)&lt;/strong&gt;：
• &lt;code&gt;width/height&lt;/code&gt; 仅包含内容区域
• 实际占用空间 = width + padding + border + margin
• 优点：精确控制内容区域大小
• 缺点：需要额外计算实际占用空间&lt;/p&gt;</description></item><item><title>字节-本地生活-校招 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-19/round-20/</link><pubDate>Tue, 24 Jun 2025 14:45:10 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-19/round-20/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-19/round-19/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-19/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本轮面试重点考察候选人的项目经验、技术深度和工程化思维。主要包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;算法编程能力：通过合并有序数组等题目考察基本编程功底&lt;/li&gt;
&lt;li&gt;项目经验：深入考察实习期间的技术选型、架构设计等关键决策&lt;/li&gt;
&lt;li&gt;微前端技术：重点关注跨应用通信、样式隔离等核心问题&lt;/li&gt;
&lt;li&gt;AI 应用实践：考察将新技术应用到工程实践中的能力&lt;/li&gt;
&lt;li&gt;跨窗口通信：考察复杂场景下的技术方案设计能力&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;本轮共 15 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-670965696dfe"&gt;1. 将两个升序数组合并为一个升序数组&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;数组操作能力&lt;/li&gt;
&lt;li&gt;双指针算法应用&lt;/li&gt;
&lt;li&gt;原地修改的实现&lt;/li&gt;
&lt;li&gt;边界条件处理&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;这道题可以使用双指针从后向前遍历的方法，将较大的数放入nums1的末尾。代码实现如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;merge&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;nums1&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;m&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;nums2&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;n&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;p1&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;m&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// nums1的指针
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;p2&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;n&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// nums2的指针
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;p&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;m&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;n&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 合并后数组的指针
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;p2&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) { &lt;span style="color:#75715e"&gt;// 只要nums2还有元素需要合并
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;p1&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nums1&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;p1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nums2&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;p2&lt;/span&gt;]) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;nums1&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;p&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nums1&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;p1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;p1&lt;/span&gt;&lt;span style="color:#f92672"&gt;--&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;nums1&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;p&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nums2&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;p2&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;p2&lt;/span&gt;&lt;span style="color:#f92672"&gt;--&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;p&lt;/span&gt;&lt;span style="color:#f92672"&gt;--&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nums1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;算法分析：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;时间复杂度：O(m+n)，只需遍历一次&lt;/li&gt;
&lt;li&gt;空间复杂度：O(1)，原地修改不需要额外空间&lt;/li&gt;
&lt;li&gt;关键点：从后向前遍历避免覆盖nums1中的有效元素&lt;/li&gt;
&lt;/ol&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-47494d13dd4e"&gt;2. 上一段实习在联想主要做的是什么产品？采用了什么技术架构？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;这是一道主观性问题，面试官主要考察：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;项目描述能力：是否能清晰表达项目背景、目标和价值&lt;/li&gt;
&lt;li&gt;技术选型能力：是否有合理的技术决策思路&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;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;&amp;ldquo;在联想实习期间，我主要负责一个企业级IT资产管理平台的开发工作。这是一个服务于公司内部的中后台系统，日均活跃用户约2000人，管理着超过10万台设备资产。这个平台的核心价值在于提升IT资产管理效率，降低运维成本。&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><item><title>小红书-社招-3年 · 第 2 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-157/</link><pubDate>Sun, 01 Feb 2026 14:42:08 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-157/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-156/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-158/"&gt;第 3 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 这一轮主要考察了小程序的性能优化、核心监控指标、首屏时间的计算、业务价值验证、高频事件处理等方面的知识。&lt;/p&gt;
&lt;p&gt;本轮共 11 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-92e09b66-a9fc-435d-ad28-99011b2ddeaa"&gt;1. 小程序性能优化做了哪些事情？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/92e09b66-a9fc-435d-ad28-99011b2ddeaa"&gt;小程序可以做哪些性能优化？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;小程序性能优化围绕逻辑层与视图层分离架构展开，重点是减少 setData 频率与数据体积，控制列表节点数量，优化首包体积与启动链路，并通过分包加载、WXS 与懒加载等手段降低渲染压力。核心原则是减少跨线程通信与避免无意义重渲染，从架构层面解决性能瓶颈。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;小程序的性能优化，不能只从“前端渲染”角度看。它的运行模型和 Web 不同，存在 &lt;strong&gt;逻辑层（JSCore）与视图层（WebView）分离&lt;/strong&gt; 的架构特征，核心瓶颈往往出在：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;跨线程通信成本&lt;/li&gt;
&lt;li&gt;setData 传输体积&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;hr&gt;
&lt;h2 id="一理解运行架构是前提"&gt;一、理解运行架构是前提&lt;/h2&gt;
&lt;p&gt;以 微信小程序 为例：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;逻辑层：JS 执行环境&lt;/li&gt;
&lt;li&gt;视图层：WebView 渲染&lt;/li&gt;
&lt;li&gt;两层通过 JSON 序列化通信&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;每一次 &lt;code&gt;setData&lt;/code&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;数据序列化&lt;/li&gt;
&lt;li&gt;线程间传输&lt;/li&gt;
&lt;li&gt;视图层 diff&lt;/li&gt;
&lt;li&gt;真实节点更新&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所以小程序性能优化的第一原则是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;减少跨线程通信的数据量与次数。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="二控制-setdata-的粒度与频率"&gt;二、控制 setData 的粒度与频率&lt;/h2&gt;
&lt;h3 id="1-避免大对象全量更新"&gt;1. 避免大对象全量更新&lt;/h3&gt;
&lt;p&gt;错误方式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setData&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;form&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;newFormObject&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果 form 很大，每次都会整体传输。&lt;/p&gt;
&lt;p&gt;正确方式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setData&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;form.username&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用路径更新，最小化数据传输。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="2-合并多次-setdata"&gt;2. 合并多次 setData&lt;/h3&gt;
&lt;p&gt;多次调用：&lt;/p&gt;</description></item><item><title>小红书-社招-1年 · 第 2 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/round-155/</link><pubDate>Sun, 01 Feb 2026 14:40:35 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/round-155/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/round-154/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 这一轮主要考察了项目经验和技术选型，包括Vue3+TS的选择理由、UI框架的优势、TypeScript的应用、组件化方案、Canvas离屏渲染、Service Worker等内容。&lt;/p&gt;
&lt;p&gt;本轮共 14 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-5e97f1f58c95"&gt;1. 讲一下你觉的最有成就感的项目&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;实际问题, 创新性, 用户价值, 项目背景, 技术选型, 实现过程, 最终效果, 亮点, 贡献&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;最有成就感的项目通常是那些能够解决实际问题、具有创新性并且对用户有显著价值的项目。在回答这个问题时，可以从项目的背景、目标、技术选型、实现过程以及最终效果等方面进行详细描述。重点突出项目的亮点和自己在其中的贡献。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-46188abebbf3"&gt;2. 项目为什么选择Vue3+TS而非React&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;Vue3 + TypeScript 的选择通常基于团队技术栈一致性、Composition API 带来的逻辑复用能力、与 TypeScript 的良好类型推导，以及在中后台场景中更成熟的生态和更低的工程复杂度，从而提升整体开发效率与可维护性。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在技术选型阶段通常会综合考虑团队技术栈、项目复杂度以及开发效率等因素。对于以中后台系统或业务管理平台为主的项目，Vue3 在整体开发体验和约束能力上往往更容易形成统一规范。&lt;/p&gt;
&lt;p&gt;首先是框架设计层面的差异。Vue3 通过 Composition API 将逻辑拆分为可组合的函数单元，在复杂业务场景下可以很好地解决 Options API 中逻辑分散的问题，同时又保留了模板语法，使得结构、逻辑、样式之间的职责划分更加清晰。对于需要长期维护的业务项目，这种组织方式通常更容易理解和维护。&lt;/p&gt;
&lt;p&gt;其次是 TypeScript 的结合程度。Vue3 在框架层面对 TypeScript 做了较深的适配，例如 &lt;code&gt;defineComponent&lt;/code&gt;、&lt;code&gt;setup&lt;/code&gt;、&lt;code&gt;ref&lt;/code&gt;、&lt;code&gt;reactive&lt;/code&gt; 等 API 都有较完整的类型推导能力，配合 &lt;code&gt;&amp;amp;lt;script setup&amp;amp;gt;&lt;/code&gt; 可以获得较好的类型提示和开发体验。在大型项目中，类型系统能够帮助提前暴露接口契约问题，提高代码的可维护性。&lt;/p&gt;
&lt;p&gt;另外在生态与工程效率方面，Vue3 在国内中后台领域的组件生态较成熟，例如组件库、低代码平台以及相关工具链都比较完善，能够快速搭建业务系统。对于团队成员技术背景主要偏 Vue 的情况下，可以降低学习成本和沟通成本，提高整体开发效率。&lt;/p&gt;
&lt;p&gt;从工程复杂度角度看，React 在灵活性上更强，但很多能力需要通过生态组合实现，例如状态管理、表单方案等，需要额外制定规范。Vue3 本身提供了较完整的开发范式，在团队规模较大的情况下更容易形成统一的代码风格。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-6d85386cc446"&gt;3. NutUI在营销活动中相比其他UI框架有什么优势&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;移动端, 轻量, 高性能, 易于使用, 组件库, 用户体验, 开发效率, 按需加载, 应用体积&lt;/p&gt;</description></item><item><title>字节-技术中台-校招 · 第 2 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-76/round-122/</link><pubDate>Tue, 02 Sep 2025 07:35:12 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-76/round-122/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-76/round-121/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-76/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察小程序、前端基础及算法等方面的知识。&lt;/p&gt;
&lt;p&gt;本轮共 17 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-1b4035e44b36"&gt;1. 讲一下你的小程序项目&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;这是一个典型的主观型问题，没有唯一的标准答案。面试官主要考察候选人的项目经验、技术选型能力、问题解决能力以及对小程序生态的整体理解。&lt;/li&gt;
&lt;li&gt;答题时建议围绕项目背景、个人职责、技术挑战与解决方案、项目成果与思考等方面展开，体现出系统性和条理性。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在我的某某项目中，我主要负责开发一个基于微信小程序的某某功能模块，比如一个校园服务小程序，其中我负责了课程表、成绩查询以及校园活动发布的功能。&lt;/p&gt;
&lt;p&gt;项目启动之初，我们对需求进行了详细的分析。我选择了小程序作为技术栈，主要是考虑到其轻量级、无需下载安装的特性，能够快速触达用户，并且微信生态提供了丰富的API支持，例如微信支付、地理位置等，非常适合我们校园服务的场景。在技术选型上，我们使用了原生小程序开发模式，结合了小程序自定义组件的能力，将课程表、活动列表等通用UI和逻辑封装成可复用组件，大大提高了开发效率和代码的可维护性。&lt;/p&gt;
&lt;p&gt;在开发过程中，我遇到了一些挑战。例如，课程表数据的展示，由于涉及到大量的时间和格子计算，以及复杂的状态管理，我采用了组件化的方式来解耦视图和逻辑。为了避免频繁调用&lt;code&gt;setData&lt;/code&gt;导致性能问题，我仔细规划了数据结构，并通过局部更新和事件代理的方式，将数据更新的粒度控制到最小，确保了界面的流畅性。此外，在处理校园活动图片上传和展示时，也遇到了图片内存飙升的问题，我通过启用&lt;code&gt;lazy-load&lt;/code&gt;属性，并对图片进行后端压缩和CDN分发，有效解决了内存占用过高的问题，提升了用户体验。在保证安全性的前提下，对于用户敏感信息，我们严格遵循小程序的加密存储和传输规范。&lt;/p&gt;
&lt;p&gt;项目上线后，用户反馈良好，尤其是加载速度快、操作流畅得到了肯定。通过这个项目，我不仅深化了对小程序双线程架构、生命周期、组件化等核心概念的理解，也锻炼了我在实际项目中解决复杂性能问题的能力。同时，也让我认识到在项目开发中，前期的技术选型、架构设计以及对潜在性能瓶颈的预判都是至关重要的。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-56a4db8d2890"&gt;2. 小程序的架构组成&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;宿主环境&lt;/strong&gt;: 了解小程序运行的载体，如微信、支付宝等App提供的运行环境。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;双线程模型&lt;/strong&gt;: 掌握小程序的逻辑层和视图层分离，通过异步通信机制进行数据交换。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组件系统&lt;/strong&gt;: 熟悉小程序内置组件和自定义组件的构成。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据层&lt;/strong&gt;: 理解小程序数据管理和更新机制。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;小程序生命周期&lt;/strong&gt;: 熟悉小程序应用和页面的生命周期函数。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;1.1 原理说明&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;宿主环境&lt;/strong&gt;: 小程序运行在一个特定的宿主环境中，这个环境由微信、支付宝等App提供。它为小程序提供了运行所需的API、渲染能力、文件系统等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;双线程模型&lt;/strong&gt;: 小程序采用双线程模型，即逻辑层和视图层分别运行在不同的线程中。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;逻辑层&lt;/strong&gt;: 运行在JSCore（或V8引擎）中，负责处理业务逻辑、数据请求、数据处理等，使用JavaScript编写。它不直接操作DOM。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;视图层&lt;/strong&gt;: 负责渲染页面，使用WebView（或独立的渲染引擎）渲染WXML和WXSS。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通信机制&lt;/strong&gt;: 逻辑层和视图层之间通过Native层进行异步通信。视图层将用户操作（如点击、输入）传递给逻辑层，逻辑层处理后将数据变化通知视图层进行更新。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组件系统&lt;/strong&gt;: 小程序提供了一套丰富的基础组件，如&lt;code&gt;view&lt;/code&gt;、&lt;code&gt;text&lt;/code&gt;、&lt;code&gt;image&lt;/code&gt;等，开发者也可以基于这些基础组件创建自定义组件，实现模块化开发。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据层&lt;/strong&gt;: 小程序的数据管理主要通过&lt;code&gt;Page.prototype.data&lt;/code&gt;和&lt;code&gt;this.setData&lt;/code&gt;进行。数据变化后，通过双线程通信机制同步到视图层，触发视图更新。
1.2 核心用法 + 示例代码&lt;/li&gt;
&lt;li&gt;在小程序中，开发者主要通过&lt;code&gt;JavaScript&lt;/code&gt;编写逻辑层代码，&lt;code&gt;WXML&lt;/code&gt;构建页面结构，&lt;code&gt;WXSS&lt;/code&gt;定义页面样式。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;app.js&lt;/code&gt; 定义小程序的全局逻辑，&lt;code&gt;app.json&lt;/code&gt; 进行全局配置，&lt;code&gt;app.wxss&lt;/code&gt; 定义全局样式。&lt;/li&gt;
&lt;li&gt;每个页面由 &lt;code&gt;.js&lt;/code&gt;（逻辑）、&lt;code&gt;.json&lt;/code&gt;（配置）、&lt;code&gt;.wxml&lt;/code&gt;（结构）、&lt;code&gt;.wxss&lt;/code&gt;（样式）组成。&lt;/li&gt;
&lt;li&gt;示例：页面数据更新&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// page.js
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Page&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;message&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Hello Mini Program!&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;onLoad&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;setTimeout&lt;/span&gt;(() =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setData&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;message&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Data Updated!&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }, &lt;span style="color:#ae81ff"&gt;2000&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;这种架构分离了业务逻辑和页面渲染，提高了性能和安全性，也方便平台对小程序进行管控。
1.3 常见误区或面试陷阱&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;误区&lt;/strong&gt;: 认为小程序是基于浏览器内核直接运行的H5页面。实际上，小程序运行在独立的宿主环境，有其特定的渲染机制和API。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;误区&lt;/strong&gt;: 将双线程通信理解为同步通信。实际上是异步通信，需要注意数据同步的时序问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;陷阱&lt;/strong&gt;: 不清楚小程序无法直接操作DOM的原因，本质上是为了安全和性能考量，避免开发者直接对渲染层进行复杂操作，影响性能和用户体验。&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-563164fe9a90"&gt;3. 小程序和 H5 在开发和使用上有哪些主要的区别和优势？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;运行环境&lt;/strong&gt;: 区分小程序和H5的运行载体和能力限制。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开发模式&lt;/strong&gt;: 掌握两种技术栈的开发流程和工具链。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能&lt;/strong&gt;: 对比加载速度、运行流畅度等方面的差异。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;功能和权限&lt;/strong&gt;: 了解各自能调用的系统能力和接口。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用户体验&lt;/strong&gt;: 分析用户感知到的流畅性、便捷性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分发和推广&lt;/strong&gt;: 比较获取用户、传播的难易程度。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;1.1 原理说明&lt;/p&gt;</description></item><item><title>字节跳动-商业化-校招 · 第 2 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-75/round-120/</link><pubDate>Tue, 02 Sep 2025 07:31:02 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-75/round-120/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-75/round-119/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-75/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 本次面试主要考察前端基础（CSS布局、JavaScript原型链）、React框架深入理解（虚拟DOM、性能优化）、设计模式应用以及算法能力。&lt;/p&gt;
&lt;p&gt;本轮共 13 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-2866e3cd23be"&gt;1. 实现一个三栏布局，左右两侧固定宽度，中间区域自适应&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;面试官出这道题主要想确认哪些知识维度？
&lt;ul&gt;
&lt;li&gt;考生对CSS布局（如Flexbox, Grid, 浮动, 定位, 表格布局等）的掌握程度。&lt;/li&gt;
&lt;li&gt;考生如何处理不同元素之间的空间分配和自适应能力。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;该题所考知识点中有哪些高频实际应用点？
&lt;ul&gt;
&lt;li&gt;页面整体布局，如经典后台管理系统布局（侧边栏固定，内容区自适应）。&lt;/li&gt;
&lt;li&gt;组件内部布局，如卡片、列表项中固定图标/按钮，内容区域自适应。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;&lt;strong&gt;1.1 原理说明&lt;/strong&gt;
三栏布局是一种常见的网页布局方式，其核心在于实现左右两边固定宽度，中间内容区域根据可用空间自适应。这要求布局方案能够灵活处理流体宽度和固定宽度元素的共存，并且能够正确处理元素之间的堆叠和清除浮动等问题。不同的CSS布局技术提供了不同的实现原理和特性，选择合适的方案取决于兼容性要求、布局复杂度和维护成本。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.2 核心用法 + 示例代码&lt;/strong&gt;
以下是几种实现三栏布局的常见方法，并说明其原理和适用场景：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.2.1 Flexbox 布局&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;原理：&lt;/strong&gt; Flexbox (弹性盒子) 是一种一维布局模式，它在父容器中管理子项的分布和对齐。通过设置主轴和交叉轴，可以非常灵活地控制子元素的排列。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用场景：&lt;/strong&gt; 现代浏览器环境下的首选布局方式，适用于需要灵活对齐、空间分配的场景。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例代码：&lt;/strong&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;container-flex&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;&amp;gt;Left&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;center&amp;#34;&lt;/span&gt;&amp;gt;Center&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;right&amp;#34;&lt;/span&gt;&amp;gt;Right&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;container-flex&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;display&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;flex&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 开启Flex布局 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;left&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; .&lt;span style="color:#a6e22e"&gt;right&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 左右固定宽度 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;flex-shrink&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 防止收缩 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;center&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;flex-grow&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; &lt;span style="color:#75715e"&gt;/* 中间区域自适应，占据剩余空间 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优势：&lt;/strong&gt; 代码简洁，语义化好，对齐和分配空间非常方便。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;1.2.2 Grid 布局&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>京东-物流-秋招 · 第 2 轮 · 第二轮</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-55/round-85/</link><pubDate>Sun, 27 Jul 2025 15:48:27 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-55/round-85/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-55/round-84/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-55/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;面试时间：&lt;/strong&gt; 60分钟&lt;/p&gt;
&lt;p&gt;本轮共 16 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-327d97d7d172"&gt;1. 前端和后端有什么区别？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;职责分工不同，前端关注用户体验，后端关注业务逻辑，但需要密切协作完成产品开发。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;前端和后端在职责、技术栈、关注点等方面都有明显区别。前端主要负责用户界面和交互体验，使用HTML、CSS、JavaScript等技术，关注的是如何让用户更好地使用产品。后端则负责业务逻辑处理、数据存储、系统架构等，使用Java、Python、Node.js等语言，关注的是系统的稳定性、安全性和性能。&lt;/p&gt;
&lt;p&gt;工作内容上，前端需要将设计稿转化为可交互的页面，处理用户输入、数据展示、页面跳转等；后端需要设计数据库结构、编写API接口、处理业务逻辑、确保数据安全等。思维方式也不同，前端更多从用户角度思考问题，注重体验和视觉效果；后端更多从系统角度思考，注重逻辑严谨性和数据一致性。&lt;/p&gt;
&lt;p&gt;但两者并不是完全独立的，现代Web开发中前后端需要密切协作，通过API接口进行数据交互，共同完成产品功能。随着技术发展，界限也在模糊，比如Node.js让前端开发者也能做后端开发。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-a769eef3130d"&gt;2. 如果现在有一个需要前后端协作的功能开发需求，你认为前端和后端在沟通和配合上最重要的是什么？&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;API接口设计一致性、数据格式规范、清晰的沟通方式、完善的联调流程是协作的关键。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;最重要的是在项目开始前就API接口的设计达成一致。这包括接口的URL设计、请求方法、参数格式、返回数据结构、错误处理方式等。清晰的接口文档能够避免后续很多沟通成本和返工问题。&lt;/p&gt;
&lt;p&gt;其次是建立统一的数据格式规范。比如时间格式、状态码定义、分页参数等，这些看似细节的问题如果不提前约定，会在开发过程中产生很多摩擦。还要约定好错误处理机制，什么情况下返回什么状态码，错误信息的格式等。&lt;/p&gt;
&lt;p&gt;沟通方式也很重要。建议使用统一的协作工具，如Postman分享API文档，或者使用Swagger等工具生成接口文档。定期的技术评审会议也必不可少，确保双方对需求理解一致。&lt;/p&gt;
&lt;p&gt;最后是要建立联调测试的流程。前端可以先用Mock数据开发，后端接口完成后再进行联调，这样能够并行开发，提高效率。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-8ece703ad1f7"&gt;3. 项目是怎么接到的？&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;通过课程项目、实验室项目、实习项目和个人项目等多种渠道积累开发经验。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;主要通过几个渠道获得项目经验。首先是课程项目，在Web开发、软件工程等课程中，老师会布置一些实际的开发任务，比如开发一个在线学习平台、图书管理系统等。这些项目虽然规模不大，但涵盖了完整的开发流程。&lt;/p&gt;
&lt;p&gt;实验室项目是另一个重要来源。导师的研究项目中经常需要开发一些数据展示、实验管理的Web系统，会让研究生参与开发。这类项目更贴近实际应用，需求也更复杂一些。&lt;/p&gt;
&lt;p&gt;还有就是实习期间参与的公司项目。虽然作为实习生主要是辅助开发，但能够接触到真实的商业项目，了解完整的产品开发流程。&lt;/p&gt;
&lt;p&gt;另外也会主动寻找一些开源项目参与贡献，或者自己发起一些小项目来练习新技术。比如看到一个有趣的API，就会想着用它开发一个小应用来练手。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-d94383ceb7e2"&gt;4. 讲一个你觉得最有成就感的项目&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;科研数据可视化平台，解决了性能优化和数据适配的技术挑战，最终被多个实验室采用。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;最有成就感的是在实验室开发的一个科研数据可视化平台。这个项目是为了帮助实验室的研究人员更好地分析和展示实验数据。&lt;/p&gt;
&lt;p&gt;项目的挑战在于需要处理大量的科研数据，并且要支持多种图表类型的动态切换。数据量大的时候页面会卡顿，用户体验很差。通过学习和实践，使用了虚拟滚动技术处理大列表，用Web Workers在后台处理数据计算，用Canvas替代DOM渲染复杂图表，最终解决了性能问题。&lt;/p&gt;
&lt;p&gt;另一个难点是不同研究方向的数据格式差异很大，需要设计一个灵活的数据适配层。通过抽象出通用的数据模型，并提供配置化的字段映射功能，让系统能够适应不同的数据格式。&lt;/p&gt;
&lt;p&gt;最终这个平台不仅在我们实验室使用，还被其他几个实验室采用，帮助研究人员提高了数据分析效率。看到自己开发的系统真正解决了实际问题，并且得到用户认可，这种成就感是最大的收获。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-97f2b3016aef"&gt;5. 前端怎么样才是一种好的体验？&lt;/h2&gt;
&lt;h3 id="题目要点-4"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;性能优化、交互反馈改进、错误处理优化、移动端适配、基于反馈的持续改进。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;好的前端体验应该是用户感知不到技术存在的体验。首先是性能方面，页面加载要快，交互要流畅，用户不应该感受到明显的等待时间。这需要做好资源优化、懒加载、缓存策略等。&lt;/p&gt;
&lt;p&gt;界面设计要直观易懂，用户能够快速找到需要的功能，操作流程要符合用户习惯。响应式设计也很重要，在不同设备上都能提供良好的体验。&lt;/p&gt;
&lt;p&gt;交互反馈要及时准确。用户的每个操作都应该有明确的反馈，比如按钮点击效果、加载状态提示、操作结果通知等。错误处理要友好，当出现问题时，要给用户清晰的错误信息和解决建议。&lt;/p&gt;
&lt;p&gt;可访问性也是好体验的重要组成部分。要考虑到不同能力用户的需求，比如键盘导航、屏幕阅读器支持等。&lt;/p&gt;
&lt;p&gt;最后是要保持一致性，整个应用的交互模式、视觉风格、信息架构都要保持统一，让用户形成稳定的使用预期。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-a1e083f32238"&gt;6. 平时怎么学习前端的？&lt;/h2&gt;
&lt;h3 id="题目要点-5"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;系统性学习、实践项目、阅读源码、关注社区、记录总结、保持好奇心。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;学习前端主要通过几个渠道。首先是系统性学习，通过在线课程平台如慕课网、极客时间等学习完整的技术体系。看技术书籍也很重要，比如《JavaScript高级程序设计》、《CSS权威指南》等经典书籍能够建立扎实的基础。&lt;/p&gt;
&lt;p&gt;实践是最重要的学习方式。会跟着教程做一些小项目，然后尝试改进和扩展功能。GitHub上有很多优秀的开源项目，通过阅读源码能够学到很多最佳实践。&lt;/p&gt;
&lt;p&gt;技术社区是获取最新信息的重要渠道。经常浏览掘金、思否、MDN等网站，关注前端技术的发展趋势。参加一些技术分享会和线上讲座，能够了解行业动态和实际应用经验。&lt;/p&gt;
&lt;p&gt;建立了自己的学习笔记系统，将学到的知识点整理成文档，定期回顾和总结。还会写一些技术博客，通过输出来加深理解。&lt;/p&gt;
&lt;p&gt;保持好奇心很重要，看到新技术会主动去了解和尝试。比如最近学习了WebAssembly、微前端等新技术，虽然可能暂时用不到，但能够拓宽技术视野。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-087d2cdb21b3"&gt;7. 最近了解到的新技术讲一下&lt;/h2&gt;
&lt;h3 id="题目要点-6"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;WebAssembly提供高性能计算能力，微前端解决大型应用架构问题，新CSS特性增强布局能力。&lt;/p&gt;</description></item><item><title>小红书-社招-3年 · 第 3 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-158/</link><pubDate>Sun, 01 Feb 2026 14:42:08 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-158/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-157/"&gt;第 2 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 这一轮主要考察了小程序的低代码设计架构、Web Worker的使用、中台系统的微前端拆分策略等方面的知识。&lt;/p&gt;
&lt;p&gt;本轮共 4 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-002c3370fca7"&gt;1. 讲一下你关于小程序的低代码设计架构&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;小程序低代码架构本质是配置驱动的运行时体系，核心包括 DSL 协议设计、组件注册机制、运行时解析与数据驱动更新；必须围绕 setData 性能约束进行差量更新与渲染优化；工程重点不在编辑器，而在运行时引擎的性能治理与扩展能力设计。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;小程序的低代码架构，本质是在&lt;strong&gt;受限运行环境下实现“可配置驱动 UI 与逻辑”&lt;/strong&gt;。核心不是拖拽能力，而是如何让页面结构、交互逻辑、数据流都由配置驱动，同时保证性能与可维护性。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一整体架构分层"&gt;一、整体架构分层&lt;/h2&gt;
&lt;p&gt;小程序低代码一般分为四层：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;编辑层 → DSL 层 → 运行时引擎 → 渲染层&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;编辑层负责产出结构化配置；DSL 层定义组件树与属性协议；运行时负责解析与调度；渲染层落在小程序原生组件体系之上（如 WXML + setData 机制，在 微信小程序 中即运行于其渲染框架内）。&lt;/p&gt;
&lt;p&gt;关键问题在于：小程序不是虚拟 DOM 模型，而是逻辑层与视图层分离，通过 JSON 数据桥接，因此架构必须围绕数据驱动。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="二dsl-设计"&gt;二、DSL 设计&lt;/h2&gt;
&lt;p&gt;DSL 通常采用 JSON Schema 形式，核心包含：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;组件类型&lt;/li&gt;
&lt;li&gt;属性 props&lt;/li&gt;
&lt;li&gt;样式&lt;/li&gt;
&lt;li&gt;事件绑定&lt;/li&gt;
&lt;li&gt;数据源&lt;/li&gt;
&lt;li&gt;条件显示规则&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;低代码的关键在于“协议稳定性”，一旦 DSL 设计混乱，后续扩展成本会极高。因此会设计：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;组件注册机制&lt;/li&gt;
&lt;li&gt;属性校验规则&lt;/li&gt;
&lt;li&gt;默认值策略&lt;/li&gt;
&lt;li&gt;版本兼容策略&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="三运行时引擎"&gt;三、运行时引擎&lt;/h2&gt;
&lt;p&gt;运行时是核心。&lt;/p&gt;</description></item></channel></rss>