news 2026/9/1 22:43:42

2026前端面试高频题复盘:React/Vue/微前端与性能优化核心考点

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
2026前端面试高频题复盘:React/Vue/微前端与性能优化核心考点

1. 为什么要在5月底整理这份前端面经:跳槽窗口的观察与复盘

5月28号,我把自己近一个多月攒下的前端面试记录从头到尾过了一遍,理出这份面经。过去这段时间我一直有随手记录面试题的习惯,不管是自己面还是帮朋友复盘,都会把题目、回答思路、踩坑点存下来。这轮集中整理,是因为刚好赶上2026届暑期实习和年中跳槽叠加的窗口,身边不少人在准备前端面试,高频问题高度集中,八股文题库更新速度也比想象中快得多——React 19 的 action、Vue 3.5 的响应式优化、微前端拆分的实际场景,这些都被问到了。与其让这些记录躺在备忘录里,不如整理成一份能照着复习的完整面经。

先说结论:这轮面试考察的深度明显比前两年更深,单靠背八股文已经不够,面试官几乎每个人都会追问“为什么”和“源码怎么实现的”。但好消息是,核心考点依然有迹可循,只要按专题系统复盘,短时间内提升效果非常显著。下面这份整理,覆盖了我自己遇到的腾讯、字节、蚂蚁、满帮等多家公司的前端面试题,以及我复盘后的解答思路。适合正在准备前端面试、想系统梳理知识点的同学参考,也适合想要查漏补缺的中级前端开发者对照自检。

2. 从八股到原理:这些前端面试题背后的底层能力考察

2.1 浏览器输入URL到页面渲染:永远绕不开的完整链路

几乎每一场前端面试都会从这道题开始,但不同轮次的考察深度完全不同。一面通常只要求流畅说出整条链路:DNS解析、TCP握手、TLS协商、HTTP请求、HTML解析、CSSOM构建、JavaScript执行、合成与绘制。二面开始,面试官会在关键节点上深挖。

这次几乎每家都追问了这几个点,整理如下:

考察点常见追问回答关键
DNS解析浏览器DNS缓存有几层?DNS over HTTPS了解吗?浏览器缓存、系统缓存、路由器缓存、本地DNS服务器逐层查找;DoH可以防劫持
TCP连接为什么是三次握手?队头阻塞怎么解决?同步双方序号;HTTP/2多路复用解决应用层队头阻塞,但TCP层仍有队头阻塞
渲染流程CSS会阻塞DOM解析吗?JavaScript会阻塞吗?CSS不会阻塞DOM解析,但会阻塞渲染;普通script会阻塞DOM解析,async和defer可以解决
合成与绘制什么属性触发重排、重绘、合成?transform和opacity只触发合成,性能最好

最容易答漏的是deferasync的区别。defer是延迟到DOM解析完后执行,多个defer按顺序执行;async是下载完立即执行,不保证顺序。我建议把DOMContentLoadedload事件的关系也一并讲清楚,这样面试官会认为你真正理解而不是死记硬背。

2.2 JavaScript异步与作用域闭包:从输出题到手写Promise

异步编程是前端面试的必考地带。JS输出顺序题这几年考得炉火纯青,考察的是事件循环、微任务和宏任务的执行时机。给大家一个最简判断法:同步代码优先执行,然后清空微任务队列,再取一个宏任务执行,如此往复。微任务包括Promise.thenqueueMicrotaskMutationObserver,宏任务包括setTimeoutsetIntervalI/OUI渲染

针对输出顺序题,我的经验是先画两条队列,把任务按类型放进去,再逐步模拟。推荐用代码验证,比如:

console.log('script start'); setTimeout(() => { console.log('setTimeout'); }, 0); Promise.resolve().then(() => { console.log('promise1'); }).then(() => { console.log('promise2'); }); console.log('script end');

输出顺序是script startscript endpromise1promise2setTimeout。这个答案背后有两个关键点:第一,Promise构造函数里的代码是同步执行的,只有then里的回调才是微任务;第二,微任务队列清空是一次性把当前队列全部执行完,期间新增的微任务也会被继续执行。

手写题方面,今年高频出现的是:手写Promise.allPromise.race、防抖节流、深拷贝、数组扁平化。手写Promise.all时要注意几点:返回一个Promise、入参是数组、空数组直接resolve、任意一个reject则整体reject、结果顺序要和入参顺序一致。这里最容易出错的是结果收集部分,建议用索引而非push,否则异步返回顺序不一致时结果会错位。

提示:手写代码时不要闷头写。先把思路讲出来,再动手,边写边解释关键点。面试官更多是在考察你的思维过程,而不是单纯看最终代码。

2.3 CSS布局与性能优化:看似基础实则拉开差距

CSS考察集中在三件套:水平垂直居中、Flex布局细节、Grid布局应用。这三道题基本属于送分题,但2026年面试开始出现更多「新CSS特性」的考察,比如容器查询(Container Queries)、:has()选择器、subgrid。字节一面就问了一道:用:has()实现一个「当卡片内有图片时展示特殊边框」的样式。这道题很多人连:has()是什么都不知道,但其实一行CSS就能搞定:

.card:has(img) { border: 2px solid #4f46e5; }

CSS性能优化方面,问得最多的是will-change的坑。面试官会追问:will-change是不是越多越好?答案是否定的。will-change会让浏览器提前做好合成准备,但滥用会占用大量GPU内存,甚至导致页面卡顿。正确用法是只在动画即将发生时添加,动画结束后移除。

3. 框架源码与设计思想:React与Vue的考察重心

3.1 React:fiber架构、hooks原理和并发特性

React相关面试题在这轮面试中的比重明显上升,尤其是React 19正式发布后,很多公司开始考察新特性。但核心还是那些:fiber架构、hooks闭包陷阱、渲染调度。

React fiber的核心价值是什么?一句话概括:让渲染可中断、可恢复、可优先级排序。传统diff递归过程不能中断,一旦开始就要一次性完成,浏览器主线程长时间被占用,用户输入得不到响应。fiber把渲染工作拆分成一个个小单元,配合requestIdleCallbackMessageChannel实现时间切片,每执行完一个fiber节点就让出主线程,让浏览器处理高优先级任务。

考察hooks时,高频问题包括:useEffectuseLayoutEffect的区别、useCallbackuseMemo的使用场景、自定义hooks的封装思路。useEffect是在浏览器绘制完成后异步执行,useLayoutEffect是在DOM变更后、浏览器绘制前同步执行。如果需要在DOM变更后立即读取布局并同步修改,要使用useLayoutEffect,否则会看到闪烁。

React 19新增的useActionStateuseOptimistic也在面试中频繁出现。蚂蚁的一个面试官直接让我手写一个useOptimistic的简单实现,核心逻辑是通过一个虚拟状态让UI先更新,后台请求完成后用真实数据替换:

function useOptimistic(actualState, reducer, initialOptimisticState) { const [optimisticState, setOptimisticState] = useState(initialOptimisticState || actualState); const updateOptimistic = useCallback((action) => { setOptimisticState(reducer(optimisticState, action)); }, [optimisticState, reducer]); // 实际项目中会在请求成功后用 actualState 同步 return [optimisticState, updateOptimistic]; }

3.2 Vue:响应式原理的迭代和diff差异

Vue相关面试题主要集中在响应式原理、diff算法、组合式API与选项式API的对比。Vue 3.5发布后,响应式系统做了不小的优化,尤其是WeakMap缓存和computed的懒计算策略被问得很多。

Vue 2的Object.defineProperty和Vue 3的Proxy,区别在哪里?这是必考题。Object.defineProperty只能劫持已有属性,无法监听新增属性和删除属性,所以Vue 2需要Vue.setVue.delete处理这些情况。Proxy可以直接代理整个对象,新增、删除、修改都能被拦截。但Proxy也有一个坑:兼容性问题,并且在get拦截中如果返回的是对象,还需要递归代理。Vue 3通过reactive函数实现了惰性代理,只有真正访问到嵌套对象时才做响应式处理,这也提升了初始化的性能。

Vue 3.5的computed变化值得一提。官方引入了ComputedRef的缓存机制改进,在依赖不变时直接返回缓存值,新增了watchdeep选项优化,以及useTemplateRef这个新API。一位面试官追问:template refuseTemplateRef的区别是什么?useTemplateRef可以在组合式API中安全地使用,且类型推导更完善,这是Vue 3.5推荐的新写法。

提示:回答Vue和React比较类问题时,别说“Vue简单React难”这种话。合理的切入角度是:两者设计哲学不同,Vue模板语法静态分析更友好,React更灵活更适合高度动态的场景;Vue的响应式系统自动追踪依赖,React需要开发者手动管理状态和渲染优化。

3.3 组件库设计与状态管理

组件库相关问题在满帮的二面中被问到。面试官让我讲一下「如果设计一个前端组件库,需要考虑哪些方面」。这是一个开放题,我建议按照以下维度展开:组件分类设计(基础组件、业务组件、布局组件)、样式方案(CSS Modules、CSS-in-JS、Tailwind)、主题定制、文档与Demo、测试覆盖、按需加载。如果面试官提到hzero这类企业级前端框架,可以补充一下企业级组件库和通用组件库的差异:企业级组件库需要更强调权限控制、数据字典对接、表单联动等业务能力。

状态管理方面,React生态优先回答Redux Toolkit或Zustand,Vue生态则是Pinia。Zustand在这轮面试中被频繁提及,原因是它足够轻量、不需要Provider包裹、可以在组件外部使用。比如在路由守卫或者普通工具函数里操作全局状态,Zustand比Redux简单得多:

import { create } from 'zustand'; const useStore = create((set) => ({ user: null, setUser: (user) => set({ user }), })); // 组件外使用 useStore.getState().setUser({ name: '前端小张' });

4. 工程化、微前端与新兴方向:中高级面试的分水岭

4.1 微前端:不止是概念,更要能讲落地细节

微前端已经成了中高级前端面试的标配考点。这轮字节和蚂蚁都问到了。高频问题:微前端解决了什么问题?主流实现方案有哪些?qiankun和module federation的对比?实际落地有哪些坑?

微前端解决的核心问题是:多团队独立开发部署、技术栈异构、巨石应用拆分。主流方案分为三种:基座模式(qiankun基于single-spa)、构建时集成(webpack module federation)、运行时隔离(Web Components)。qiankun通过HTML Entry加载子应用,用proxy沙箱和快照沙箱做JS隔离,用样式前缀做CSS隔离。

面试官一道经典追问:qiankun的沙箱有哪些缺陷?第一,proxy沙箱不支持IE;第二,JavaScript隔离是假隔离,如果子应用通过window向全局挂载持久数据,沙箱销毁后数据就丢了;第三,CSS隔离不够彻底,动态插入的样式可能逃逸。module federation的思路完全不同,它是在构建时声明remote和exposes,运行时由浏览器动态加载模块,优点是没有沙箱开销、共享依赖更灵活,缺点是Webpack 5以上才原生支持,Vite生态支持相对较弱。

实际落地时有一个非常容易踩的坑:子应用样式冲突。多个子应用同时挂在页面上时,全局class名容易互相覆盖。我的经验是,子应用打包时配置css-loadermodules选项做局部作用域,或者统一约定前缀。还有全局事件污染的问题,子应用在beforeUnmount生命周期里一定要清理自己绑定的window事件。

4.2 性能优化:从指标到实战手段

前端性能优化是面试中的常青树,但2026年面试官更看重「指标驱动」而非罗列优化手段。我问到的典型题目是:首屏加载时间过长,你应该怎么排查和优化?

回答思路建议如下:先定义指标,用Performance API或Lighthouse测量FCP、LCP、CLS、TBT。然后根据指标定位瓶颈。TTFB过高,排查服务端响应和CDN;LCP过大,压缩图片、使用CDN、配置预加载;TBT较高,拆分JavaScript、减少主线程阻塞;CLS波动,给图片和多媒体占位。

代码层面最大的优化点是JavaScript体积。Webpack或Vite构建分析、路由懒加载、第三方库按需引入是常规操作。今年面试官开始追问更细的:怎么减少node_modules的打包体积?推荐使用rollup-plugin-visualizerwebpack-bundle-analyzer分析体积,lodash改成按需导入、moment换成dayjs、大型组件库使用自动导入插件。另外Web Worker也越来越被重视,这次面经热词里出现了「前端使用worker上传大文件」——大文件上传时用Worker做切片哈希计算,可以避免主线程卡顿。

关于大文件上传,我把完整思路整理在这里。先File.slice切片,然后计算每个切片的MD5,最后并发上传,后端合并。计算MD5是CPU密集型操作,几GB的文件会卡死主线程,所以常见方案是把哈希计算丢到Worker里:

// main.js const worker = new Worker('/hash-worker.js'); worker.postMessage(file); worker.onmessage = (e) => { console.log('文件哈希:', e.data); }; // hash-worker.js self.onmessage = async (e) => { const file = e.data; const chunks = []; const chunkSize = 2 * 1024 * 1024; for (let i = 0; i < file.size; i += chunkSize) { chunks.push(file.slice(i, i + chunkSize)); } // 使用 spark-md5 计算 const spark = new SparkMD5.ArrayBuffer(); for (const chunk of chunks) { spark.append(await chunk.arrayBuffer()); } self.postMessage(spark.end()); };

4.3 前端AI开发工具:2026年面试绕不开的加分项

这次面经整理发现一个明显趋势:面试官开始询问候选人是否使用AI工具辅助开发。不是考察工具操作,而是关注你如何把AI能力集成到工作流中。问题包括:Cursor在开发中的使用体验?如何利用AI辅助编写单元测试?前端如何对接大模型能力?

我给一个完整的回答框架。第一,AI工具使用感:Cursor的代码补全和Composer能力,可以用来生成重复性模板代码、重构不合理的函数、生成类型定义。第二,AI写代码的边界:AI生成代码很容易出现过设计,生成一大堆无用抽象层。正确方式是给AI明确约束,比如“不要创建多余文件”“保持现有代码风格”“不要引入新的依赖”。第三,专业化的前端AI应用开发已经出现,比如基于anything-llm这类开源项目做前端二开,或者对接SSE(Server-Sent Events)实现流式问答。

我在回答SSE时被追问过一个问题:为什么不直接用WebSocket?SSE和WebSocket的核心区别在于:SSE是单向的(服务端到客户端)、基于HTTP协议、自动重连、只支持文本;WebSocket是双向的、独立协议、需要额外处理连接状态。对于AI对话这种主要接收流式输出的场景,SSE更轻量,而且可以直接用fetch配合ReadableStream读取:

const response = await fetch('/api/chat', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ message: '你好' }), }); const reader = response.body.getReader(); const decoder = new TextDecoder(); while (true) { const { done, value } = await reader.read(); if (done) break; console.log(decoder.decode(value)); }

5. 手写题与算法:现场做代码的节奏与思路

5.1 高频手写题汇总与解答要点

前端面试的手写题,范围其实非常固定。我把自己这轮遇到的题目做了统计:

题目出现次数难度备注
手写深拷贝5简单要考虑循环引用、Symbol、正则等
Promise.all / 手写Promise4中等重点考察异步控制
防抖 / 节流5简单要能说出适用场景
数组扁平化 / 去重3简单注意时间复杂度
实现一个发布订阅2中等结合事件总线考察
手写useState3中等React hooks原理
大数相加2中等字符串处理
LRU缓存2较难高频进阶题

手写题的核心要求不是写出来,而是讲清楚边界条件和性能优化点。比如手写防抖节流,两个函数的区别要能讲明白。防抖:触发后等待N秒执行,N秒内再次触发则重新计时。节流:N秒内最多执行一次。防抖适用于输入搜索、窗口resize后的计算;节流适用于滚动加载、点击提交。

5.2 算法题复习策略与实际考试复盘

算法面试在前端岗位的权重近年有所变化,不再像当年那样人人手撕hard题,但中等难度题目仍是常客。这轮遇到的最多的是:数组类问题(两数之和、三数之和、合并区间)、字符串类(无重复字符最长子串、有效括号)、链表类(反转链表)、二叉树类(层序遍历)、动态规划入门(爬楼梯、打家劫舍)。

以字节一面为例,算法题是合并两个有序数组,但面试官加了一个限制:要求原地合并,空间复杂度O(1)。题目本身不难,但要用双指针从后往前遍历,如果从前往后,挪动元素的时间复杂度会退化到O(n²)。这是一个很好的思维差距:会做是一回事,做得优是另一回事。

复习策略方面,我建议不要盲目刷题,按照数据结构分类复习,每种题型吃透3-5道经典题,理解套路比刷题数量重要。尤其是前端面试,算法占比通常只有20%-30%,把时间过分花在算法上性价比很低。练手推荐LeetCode Hot 100,面试前两周开始每天两道保持手感。

注意:手写算法题时,先确认输入输出边界,再动手。很多人一上来就写,结果忽略了空数组、负数、重复元素等边界,反而被扣分。

6. 项目经历怎样讲才能和面经考点互相印证

6.1 STAR法则在前端面试中的实际用法

这轮面试让我最深的感悟是:项目经历的讲述质量,直接决定了面试官对你的技术印象。很多人项目做得很扎实,但讲得毫无章法。面试官问“介绍一下你最有代表性的项目”,候选人从项目背景讲到功能需求,再讲技术选型,最后却说不出自己的贡献点在哪——这是大忌。

推荐用STAR法则组织项目描述:S(情境)、T(任务)、A(行动)、R(结果)。注意,前端面试的STAR要突出技术深度。一个合格的回答框架是:

  • 项目背景:为什么做这个项目?解决什么痛点?
  • 我的角色:是负责人、核心开发者还是参与者?
  • 技术难点:最大的技术挑战是什么?
  • 解决过程:做了哪些方案对比?为什么选这个?
  • 量化结果:性能提升了多少?接入了多少业务线?

比如一个「前端系统管理下的字典管理」项目,听起来很简单,但你可以这样讲:字典管理解决了后端枚举硬编码的问题,前端通过字典类型动态渲染下拉框和标签,支持国际化、缓存、远程加载。然后引出技术深度:怎么设计缓存失效策略?怎么处理字典类型变更后的页面更新?权限控制怎么做?这样就把一个业务功能讲出了技术含量。

6.2 从项目引申出的面试八股追问

面试官非常善于从项目细节切入,然后顺着你的回答一路追问到八股文。我之前在项目里用到了RxDB,面试官就问:RxDB的同步冲突怎么解决?为什么选择IndexedDB而非localStorage?再追问IndexedDB的索引机制、事务模型以及和Web SQL的对比。如果对基础掌握不够扎实,很容易在这个环节翻车。

因此,准备项目讲述时,有一个技巧:把你项目涉及到的技术点列出来,然后为每个技术点准备3层深度的问题和答案。第一层:What,我在项目中怎么用的。第二层:Why,为什么选择这个技术,替代方案有哪些。第三层:How,这个技术的原理是什么,底层是怎么实现的。这样准备完之后,面试官无论怎么追问都能接住。

7. 面经里没人明说的隐性考察点与备考节奏

7.1 代码题之外的软实力考察

前端面试并不全是技术题目,尤其是二面和三面,面试官会花相当篇幅考察沟通能力、学习能力和团队协作。这轮蚂蚁的一面让候选人介绍「遇到线上问题如何排查」,考察的其实是问题定位思路:

  1. 复现问题,收集报错信息
  2. 查看监控平台,定位影响范围
  3. 检查网络请求、控制台报错、服务端日志
  4. 二分法缩小范围:是代码改动引起还是环境变化引起
  5. 修复后补充回归用例

这个回答体现的是工程素养。很多8年经验的前端,代码能力很强,线上问题排查思路却混乱不堪,这在大厂面试中是明显的减分项。

7.2 面试备考节奏:三周突击方案建议

根据这份面经整理,我总结了一个三周备考节奏,供正在准备面试的同学参考:

第一周:核心八股梳理。按照HTML/CSS、JavaScript、浏览器与网络、框架原理、工程化五大模块,每天一个模块,把高频考点过一遍,建立知识框架。

第二周:源码与手写题强化。每天手写2-3道手写题,重点搞定Promise系列、深拷贝、防抖节流、事件总线;同时精读React或Vue的核心源码,至少能把fiber或响应式原理讲清楚。

第三周:模拟面试与项目梳理。把自己最有分量的两个项目按STAR法则重新整理,用流程图把关键路径画出来;找朋友或自己录音模拟面试,提前适应面试节奏。

还有一个细节:技术面通过后,HR面也不要掉以轻心。HR面也会问技术相关的话题,比如“你了解我们公司的业务吗”“你对加班怎么看”“遇到技术分歧时怎么处理”。提前准备几个通用回答角度,能让你更有底气。

8. 最后分享一个我踩过的坑

这次整理面经时,我复盘了自己一次典型的失败经历,过程值得分享。准备某大厂面试时,我花大量时间刷算法题和背底层原理,但忽略了对自己项目的深度挖掘。面试官问“一句话说清楚这个项目的核心难点”,我居然卡住了。不是不知道答案,而是从来没有用这么短的语句去概括过自己的技术思路。结果整场面试显得逻辑混乱、表达不清晰,虽然代码题全答出来了,还是挂在了综合评价上。

后来我做了一件事,效果显著:把每个项目都写成三个版本,30秒简介版、3分钟深度版、10分钟完整版。30秒版用于自我介绍和项目概要,3分钟版用于回答“介绍一下你的项目”,10分钟版用于应对深度追问。写完后找朋友模拟面试,反复打磨表达。后续几场面试,项目讲述环节明显顺畅了,面试官对技术深度的认可度也更高。

这是我这次整理前端面经最想强调的一点:面试不仅是知识储备的比拼,更是表达和策略的较量。把八股文背熟只是基础,能用自己的话讲清楚设计取舍和踩坑过程,才是让面试官记住你的关键。希望这份面经整理,能帮你在下一场面试里少踩几个坑。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 22:40:25

校招服务端笔试全解析:从选择题到编程题的高频考点与实战策略

1. 试卷整体拆解&#xff1a;校招服务端笔试题到底在考什么先说点实在的。服务端开发这个岗位&#xff0c;每年校招笔试筛人比例都很高&#xff0c;金山办公这套卷子基本能代表国内一线互联网和软件公司服务端岗的出题风格。我做这套题已经是好几年前的事了&#xff0c;但回看它…

作者头像 李华
网站建设 2026/9/1 22:39:12

图像标注实战:基于CNN+LSTM+注意力机制的NLP大作业全解析

简介&#xff1a;本资源是一份面向高校自然语言处理课程学习者的高分期末大作业项目&#xff0c;聚焦图像标注这一典型多模态任务&#xff0c;完整实现从图像特征提取、文本生成到前后端交互的全流程。资源包含86个文件&#xff0c;主体为19个带详细注释的Python源码&#xff0…

作者头像 李华
网站建设 2026/9/1 22:35:41

爱奇艺测试开发笔试题深度解析:从考点到实战备考指南

1. 写在前面&#xff1a;为什么2020年的题现在还有研究价值刷到这份“爱奇艺2020校招测试开发方向笔试题&#xff08;第一场&#xff09;”的时候&#xff0c;我愣了一下。六年前的题了&#xff0c;我居然还存着当年整理的考点笔记&#xff0c;翻出来一看&#xff0c;发现一个有…

作者头像 李华
网站建设 2026/9/1 22:35:17

Jetson Nano+STM32视觉识别控制舵机实战:从训练到部署全流程解析

简介&#xff1a;本资源是一个面向嵌入式AI初学者与课程设计者的端侧智能控制实战项目&#xff0c;聚焦Jetson Nano与STM32协同完成图像识别→指令下发→舵机精准响应的完整闭环。适用于毕业设计、大创竞赛、嵌入式实训及深度学习部署练手&#xff0c;尤其适合缺乏PCB设计经验但…

作者头像 李华
网站建设 2026/9/1 22:34:49

MKVToolNix:无损封装视频音频字幕,解决文件合并与多轨道管理

这次我们来看一个在视频剪辑和创作领域被很多用户称为“神器”的工具——MKVToolNix。它不是用来剪辑时间线或添加特效的&#xff0c;而是专门解决一个非常具体但高频的痛点&#xff1a;无损地合并、提取或修改视频容器中的音轨、字幕等多媒体流。简单说&#xff0c;它能把一个…

作者头像 李华
网站建设 2026/9/1 22:33:27

真人版角色复刻全流程拆解:从创意到成片的完整链路

最近刷到一条短视频&#xff0c;标题写的是“【青霧cos】全网第一只真人版茄子鬼&#xff1f;青霧终将成为自己&#xff01;”。点进去之前&#xff0c;我以为又是某个游戏角色的恶搞仿妆&#xff1b;点进去之后发现不是随意套个滤镜搞笑&#xff0c;而是整套真人妆造、服装、灯…

作者头像 李华