<?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/%E8%85%BE%E8%AE%AF/</link><description>Recent content in 腾讯 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 07 Sep 2025 02:45:19 +0000</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E8%85%BE%E8%AE%AF/index.xml" rel="self" type="application/rss+xml"/><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>腾讯-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>腾讯-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-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>腾讯-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></channel></rss>