百度健康春招前端一面

请教下,百度健康春招前端一面
最新回答
可爱的偏执狂

2026-08-04 12:58:35

答案

以下是针对百度健康春招前端一面可能涉及问题的详细解答:

1. 介绍一下项目
  • 项目概述:简要说明项目类型(如电商、社交、管理后台等)、目标用户群体及核心功能。例如:“我参与的是一个电商类项目,面向年轻消费者,核心功能包括商品展示、购物车管理及订单支付。”
  • 技术栈:列举项目中使用的前端技术(如React/Vue、TypeScript、CSS预处理器等)及工具链(如Webpack、Vite)。例如:“技术栈采用Vue 3 + TypeScript,使用Vite构建,UI框架为Element Plus。”
  • 个人职责:说明在项目中的具体角色(如模块开发、性能优化、代码审查等)及成果。例如:“我负责商品详情页开发,通过懒加载优化首屏加载速度,使LCP指标提升20%。”
  • 难点与解决方案:描述遇到的技术挑战(如兼容性问题、性能瓶颈)及解决方法。例如:“移动端适配时遇到不同屏幕尺寸布局错乱,通过CSS媒体查询和rem单位实现响应式设计。”
2. 移动端适配
  • 常见方案:

    视口设置:通过<meta name="viewport" content="width=device-width, initial-scale=1.0">确保页面宽度与设备宽度一致。

    单位选择:使用rem或vw/vh替代固定像素(px),结合JavaScript动态计算根字体大小。

    媒体查询:针对不同屏幕尺寸编写CSS规则,例如:

    @media (max-width: 768px) { .container { padding: 10px; }}

    弹性布局:采用Flexbox或Grid实现灵活的布局结构。

  • 注意事项:避免使用固定宽高、图片需设置max-width: 100%防止溢出。
3. CSS选择器优先级
  • 优先级规则:从高到低依次为:

    !important(强制最高优先级)

    内联样式(如<div style="color: red;">)

    ID选择器(如#header)

    类/属性/伪类选择器(如.nav、[type="text"]、:hover)

    元素/伪元素选择器(如div、::before)

  • 计算方式:优先级按(a, b, c, d)形式比较,其中:

    a:!important数量(通常为0或1)

    b:ID选择器数量

    c:类/属性/伪类选择器数量

    d:元素/伪元素选择器数量

    例如:#nav .item:hover的优先级为(0, 1, 2, 0)。

4. 有没有做过性能优化
  • 常见优化方向:

    加载优化:代码分割(Code Splitting)、资源压缩(如Terser压缩JS)、CDN加速。

    渲染优化:减少重绘/回流(如避免频繁操作DOM)、使用requestAnimationFrame优化动画。

    缓存策略:利用浏览器缓存(强缓存/协商缓存)、Service Worker缓存静态资源。

    监控工具:使用Lighthouse、Performance API分析性能瓶颈。

  • 示例:“通过Webpack的SplitChunksPlugin拆分公共依赖,使首屏加载时间减少30%。”
5. 路由懒加载如何实现的
  • 原理:按需加载路由组件,减少初始包体积。
  • 实现方式:

    React:使用React.lazy + Suspense:

    const Home = React.lazy(() => import('./Home'));function App() { return ( <Suspense fallback={<div>Loading...</div>}> <Route path="/" component={Home} /> </Suspense> );}

    Vue:动态导入(import()) + 路由配置:

    { path: '/about', component: () => import('./About.vue')}
6. Vite和Webpack如何选型
  • Vite优势:

    开发体验:基于ES Module原生支持,冷启动快(无需打包)。

    生产构建:使用Rollup,输出优化更好(如自动代码分割)。

    适用场景:现代浏览器项目、追求开发效率的团队。

  • Webpack优势:

    生态丰富:插件系统成熟,兼容旧浏览器(如通过Babel转译)。

    灵活性:可高度定制化构建流程。

    适用场景:复杂项目、需要兼容低版本浏览器的场景。

  • 选型建议:新项目优先Vite,旧项目迁移或需兼容性时选Webpack。
7. 输入URL到页面渲染过程
  • 关键步骤:

    DNS解析:将域名转换为IP地址。

    TCP连接:建立与服务器的TCP三次握手。

    HTTP请求:发送请求(可能包含重定向,如301/302)。

    服务器响应:返回HTML文件及资源链接。

    解析HTML:构建DOM树。

    解析CSS:构建CSSOM树。

    渲染树合成:合并DOM和CSSOM生成渲染树。

    布局(Layout):计算元素位置和尺寸。

    绘制(Paint):将像素渲染到屏幕。

    复合(Composite):合并图层(如涉及动画或透明度)。

8. 强缓存和协商缓存(301和302状态码是什么)
  • 强缓存:

    机制:浏览器直接从本地缓存读取资源,不发送请求。

    相关字段:Expires(绝对时间)或Cache-Control: max-age=3600(相对时间)。

  • 协商缓存:

    机制:浏览器发送请求,服务器通过Last-Modified/ETag判断是否返回304(未修改)。

    相关字段:If-Modified-Since、If-None-Match。

  • 301 vs 302:

    301 Moved Permanently:永久重定向,浏览器会缓存跳转关系。

    302 Found:临时重定向,每次请求均需访问原URL。

9. 性能指标与兼容小数计算
  • 性能指标:

    LCP(Largest Contentful Paint):最大内容元素渲染时间,反映首屏加载速度。

    优化方法:压缩图片、预加载关键资源、减少阻塞渲染的CSS/JS。

  • 兼容小数计算:

    问题:浮点数精度丢失(如0.1 + 0.2 !== 0.3)。

    解决方案:

    转换为整数计算后还原:

    function add(a, b) { const scale = 10 Math.max(String(a).split('.')[1]?.length || 0, String(b).split('.')[1]?.length || 0); return (a * scale + b * scale) / scale;}

    使用库如decimal.js或big.js。

10. 实现一个EventEmitter类class EventEmitter { constructor() { this.events = {}; } on(event, listener) { if (!this.events[event]) this.events[event] = []; this.events[event].push(listener); } emit(event, ...args) { if (this.events[event]) { this.events[event].forEach(listener => listener(...args)); } } off(event, listener) { if (this.events[event]) { this.events[event] = this.events[event].filter(l => l !== listener); } } once(event, listener) { const onceListener = (...args) => { listener(...args); this.off(event, onceListener); }; this.on(event, onceListener); }}