「一面19问!小红书前端面试官的压迫感我算领教了——当Tailwind配置、Vue响应式原理、HTTP/2队头阻塞连环砸来时,我CPU差点干烧了🔥 这份硬核到骨髓的考卷,本质上是在筛选『能造轮子更懂拆轮子』的工程师!」
┌───────────────┬───────────────────────────────┐
| 必杀考题 | 面试官真正在意的底层能力 |
├───────────────┼───────────────────────────────┤
| Tailwind配置 | CSS原子化工程落地能力 |
| 容器查询替代 | 突破媒体查询的性能思维 |
| Vue响应式原理 | 框架源码逆向解剖能力 |
| 手写并发控制 | 高并发场景的救火实力 |
| HTTP/2优化 | 网络层深度调优意识 |
└───────────────┴───────────────────────────────┘
血泪经验:
层叠优先级算法
和!important陷阱
,而不是扯作用域组件缓存策略
和内存泄露监控方案
的trade-off考察点:对 Tailwind CSS 的优势和适用场景的理解。参考答案: Tailwind CSS 是一种实用主义的 CSS 框架,它提供了低级的工具类,让开发者能够快速构建自定义的设计,而无需编写自定义的 CSS。选择 Tailwind CSS 的原因主要有以下几点:
sm:
, md:
, lg:
等)可以轻松实现不同屏幕尺寸下的样式调整,无需额外编写媒体查询。考察点:对 Tailwind CSS 样式冲突处理机制的理解。参考答案: Tailwind CSS 主要通过以下几种方式解决样式冲突:
text-red-500
和 text-blue-500
同时应用于一个元素时,text-blue-500
的样式会生效。tw-
,从而与其他样式库的类名区分开来。考察点:对 Tailwind CSS 响应式断点实现原理的理解。参考答案: Tailwind CSS 的响应式断点是通过 CSS 媒体查询实现的。在 Tailwind CSS 的配置文件中,定义了一系列的断点,每个断点对应一个屏幕宽度范围。例如:
module.exports = {
theme: {
screens: {
'sm': '640px',
'md': '768px',
'lg': '1024px',
'xl': '1280px',
},
},
};
当在 HTML 中使用响应式类名时,如 md:text-lg
,Tailwind CSS 会生成相应的媒体查询规则:
@media (min-width: 768px) {
.md\:text-lg {
font-size: 1.25rem;
}
}
这样,当屏幕宽度大于或等于 768px 时,md:text-lg
的样式就会生效。
考察点:对 CSS 容器查询(Container Queries)的理解及其与媒体查询的对比。参考答案: CSS 容器查询(Container Queries)是一种新的 CSS 特性,它允许基于容器的大小而不是视口的大小来应用样式。容器查询的基本语法如下:
@container (min-width: 300px) {
p {
font-size: 1.25rem;
}
}
容器查询的容器需要通过 container-type
属性指定:
.container {
container-type: inline-size;
}
容器查询与媒体查询的主要区别在于:
考察点:对响应式开发中性能优化的理解。参考答案: 在响应式开发中,窗口大小变化会触发重排(Reflow)和重绘(Repaint),导致页面抖动。为了避免这种抖动,可以采取以下措施:
throttle
或 debounce
方法:window.addEventListener('resize', _.throttle(handleResize, 100));
考察点:对 requestAnimationFrame
和 requestIdleCallback
的理解及其在渲染优化中的应用。参考答案:
requestAnimationFrame
**:用于在浏览器重绘之前执行代码,通常用于动画和视觉效果的更新。它会在下一次重绘之前被调用,确保动画的平滑性。requestIdleCallback
**:用于在浏览器空闲时执行代码,通常用于非关键任务,如数据处理、DOM 操作等。它会在浏览器完成当前任务后,且在下一次重绘之前有空闲时间时被调用。 在执行时机上,requestAnimationFrame
优先于 requestIdleCallback
触发。因为 requestAnimationFrame
用于确保动画的平滑性,而 requestIdleCallback
用于处理非关键任务,浏览器会优先保证动画的流畅性。考察点:对 Vue 的异步组件和 Webpack 代码分割的理解。参考答案: 在 Vue 中,defineAsyncComponent
可以用来定义异步组件,结合 Webpack 的代码分割实现懒加载。具体实现如下:
import { defineAsyncComponent } from 'vue';
const AsyncComponent = defineAsyncComponent(() =>
import('./components/MyComponent.vue')
);
Webpack 会自动将 import()
调用的模块分割成单独的代码块,并在需要时动态加载。这样,只有当 AsyncComponent
被实际使用时,对应的代码块才会被加载,从而实现懒加载。
考察点:对动态加载失败处理机制的理解。参考答案: 在动态加载组件或模块时,可能会出现加载失败的情况。为了处理这种情况,可以提供降级方案:
const AsyncComponent = defineAsyncComponent({
loader: () =>import('./components/MyComponent.vue'),
errorComponent: () =>import('./components/ErrorComponent.vue'),
delay: 200,
timeout: 3000,
onError: (error, retry, fail) => {
if (error.name === 'NetworkError') {
retry();
} else {
fail();
}
},
});
考察点:对 Vue 中 keep-alive
的原理和实现机制的理解。参考答案:keep-alive
是 Vue 中的一个内置组件,用于缓存动态组件,避免重复渲染。它的原理如下:
keep-alive
会将缓存的组件实例存储在一个缓存对象中。当组件被切换时,keep-alive
会检查缓存对象中是否已经存在该组件的实例。如果存在,则直接从缓存中取出实例并复用;如果不存在,则创建一个新的实例并将其存储到缓存中。keep-alive
提供了两个生命周期钩子:activated
和 deactivated
。当组件被缓存时,会触发 deactivated
钩子;当组件从缓存中被激活时,会触发 activated
钩子。keep-alive
提供了一些配置选项,如 include
和 exclude
,用于指定哪些组件需要被缓存。考察点:对 Vue 路由和 keep-alive
的结合使用。参考答案: 在多级路由下,可以通过 include
属性精准控制组件缓存。include
可以是一个字符串数组,指定哪些组件需要被缓存。例如:
<keep-alive :include="['Home', 'About']">
<router-view />
</keep-alive>
在多级路由中,可以通过动态计算 include
的值来实现精准控制。例如:
computed: {
include() {
return this.$route.matched.map(route => route.name);
},
}
这样,只有当前路由及其子路由对应的组件会被缓存。
考察点:对内存泄露排查方法的理解。参考答案: 缓存过多可能导致内存泄露,可以通过以下方法排查:
deactivated
钩子或未正确清理定时器等。考察点:对 Vite 热更新机制的理解。参考答案: Vite 的热更新(HMR)是一种在开发过程中自动更新代码的技术,无需重新加载整个页面。Vite 的 HMR 机制基于 WebSocket 和模块热替换(HMR)协议。具体工作原理如下:
考察点:对 Vite 和 Webpack 热更新机制的对比。参考答案: Vite 的 HMR 速度优于 Webpack 的主要原因如下:
考察点:对 HTTP/2 和 HTTP/1.0 的对比。参考答案: HTTP/2 相对于 HTTP/1.0 的优化主要包括以下几点:
考察点:对 HTTP/2 多路复用机制的理解及其与 HTTP/1.1 长连接的对比。参考答案: HTTP/2 的多路复用通过在同一个 TCP 连接上同时发送多个请求和响应,解决了 HTTP/1.1 的队头阻塞问题。在 HTTP/1.1 中,由于协议限制,一个 TCP 连接在同一时间只能处理一个请求,如果一个请求被阻塞,后续的请求也会被延迟。HTTP/2 的多路复用机制允许同时处理多个请求,即使某个请求被阻塞,其他请求仍然可以继续进行,从而提高了资源加载效率。 与 HTTP/1.1 的长连接优化相比,HTTP/2 的多路复用更加高效。HTTP/1.1 的长连接虽然可以减少连接建立的开销,但仍然无法解决队头阻塞问题。而 HTTP/2 的多路复用从根本上解决了这一问题,提高了网络利用率和资源加载速度。
考察点:对 HTTPS 加密机制的理解。参考答案: HTTPS 使用混合加密机制来防止中间人攻击,主要包括以下步骤:
考察点:对浏览器渲染流程的理解。参考答案: 浏览器的渲染流程主要包括以下步骤:
考察点:对重排和重绘的理解及其对性能的影响。参考答案:
考察点:对 JavaScript 事件循环机制的理解。参考答案: 在 JavaScript 的事件循环中,微任务和宏任务的执行顺序如下:
Promise
的回调、MutationObserver
的回调等。setTimeout
、setInterval
、requestAnimationFrame
等。考察点:对 requestAnimationFrame
的理解。参考答案:requestAnimationFrame
属于宏任务。它用于在浏览器重绘之前执行代码,通常用于动画和视觉效果的更新。requestAnimationFrame
会在下一次重绘之前被调用,确保动画的平滑性。
考察点:对发布订阅模式的理解和实现能力。参考答案: 发布订阅模式是一种设计模式,用于实现对象之间的解耦。以下是发布订阅模式的实现:
class EventEmitter {
constructor() {
this.events = {};
}
on(event, callback) {
if (!this.events[event]) {
this.events[event] = [];
}
this.events[event].push(callback);
}
emit(event, ...args) {
if (this.events[event]) {
this.events[event].forEach(callback => {
callback(...args);
});
}
}
off(event, callback) {
if (this.events[event]) {
this.events[event] = this.events[event].filter(cb => cb !== callback);
}
}
}
const emitter = new EventEmitter();
emitter.on('message', (msg) => {
console.log(`Received message: ${msg}`);
});
emitter.emit('message', 'Hello, world!');
考察点:对并发控制的理解和实现能力。参考答案: 并发控制可以通过多种方式实现,以下是使用 async
和 await
实现并发控制的示例:
async function runTasks(tasks, concurrency) {
const results = [];
const runningTasks = [];
for (const task of tasks) {
const runningTask = task().then(result => {
runningTasks.splice(runningTasks.indexOf(runningTask), 1);
results.push(result);
});
runningTasks.push(runningTask);
if (runningTasks.length >= concurrency) {
awaitPromise.race(runningTasks);
}
}
returnPromise.all(runningTasks).then(() => results);
}
// 示例任务
const tasks = [
() =>newPromise(resolve => setTimeout(() => resolve('Task 1'), 1000)),
() => newPromise(resolve => setTimeout(() => resolve('Task 2'), 500)),
() => newPromise(resolve => setTimeout(() => resolve('Task 3'), 2000)),
];
runTasks(tasks, 2).then(results => {
console.log(results);
});
在这个示例中,runTasks
函数接受一个任务数组和并发数,通过 Promise.race
控制同时运行的任务数量。
这场面试像一次全方位的技术扫描:
整体感受:小红书对候选人要求是「深度优先」 ,既要掌握技术选型背后的权衡,又能把基础知识(如事件循环/HTTPS握手)映射到真实业务场景。
最后
还没有使用过我们刷题网站(https://fe.ecool.fun/)或者刷题小程序的同学,如果近期准备或者正在找工作,千万不要错过,题库已经更新1600多道面试题,除了八股文,还有现在面试官青睐的场景题,甚至最热的AI与前端相关的面试题已经更新,努力做全网最全最新的前端刷题网站。
有会员购买、辅导咨询的小伙伴,可以通过下面的二维码,联系我们的小助手。