前端常考面试题目详解
Vue
Vue.js 是一款用于构建用户界面的渐进式 JavaScript 框架,其核心设计理念是数据驱动和组件化开发。以下将从 Vue 的核心特性及其代码渲染机制两方面展开介绍:
一、Vue 的核心特性
-
响应式数据绑定
Vue 通过数据劫持(Vue 2 使用Object.defineProperty
,Vue 3 升级为Proxy
)实现数据的动态追踪。当数据变化时,视图自动更新,开发者无需手动操作 DOM。 -
组件化开发
组件是 Vue 的基本构建单元,每个组件包含模板、逻辑和样式,支持复用和嵌套,例如通过.vue
单文件组件封装功能模块。 -
虚拟 DOM
Vue 通过虚拟 DOM(轻量级 JavaScript 对象)优化渲染性能。虚拟 DOM 对比新旧状态差异(Diff 算法),仅更新必要的真实 DOM 节点。 -
渐进式框架
Vue 可逐步集成到项目中,既适用于简单的静态页面增强,也能构建复杂的单页应用(SPA)或全栈应用。
二、Vue 代码如何渲染到浏览器
Vue 的代码渲染流程可分为以下步骤:
-
初始化 Vue 实例
创建 Vue 实例时,通过data()
定义响应式数据,并绑定到 HTML 模板中的占位符(如{ { message }}
)。 -
模板编译
• 解析模板:将 HTML 模板解析为抽象语法树(AST),识别指令(如v-if
、v-for
)和插值表达式。
• 生成渲染函数:将 AST 转换为可执行的 JavaScript 函数(render
函数),用于生成虚拟 DOM。// 示例:模板 { { message }} 编译后的渲染函数 render() { return h('div', this.message); }
-
生成虚拟 DOM
执行渲染函数生成虚拟 DOM 树,描述真实的 DOM 结构。例如,一个包含动态文本的<div>
元素会被转换为虚拟节点对象。 -
虚拟 DOM 对比与更新
• Diff 算法:当数据变化时,重新生成虚拟 DOM 树,与旧树对比差异,标记需要更新的节点。
• Patch 操作:将差异应用到真实 DOM,例如更新文本内容或增删节点。 -
响应式系统驱动更新
• 依赖收集:在初次渲染时,Vue 会追踪数据属性的依赖关系(通过getter
)。
• 触发更新:数据变化时,通知关联的观察者(Watcher),重新运行渲染函数并触发虚拟 DOM 更新流程。 -
批量异步更新
Vue 通过异步队列(如Promise
或setTimeout
)合并多次数据变更,避免频繁重渲染,提升性能。
三、关键优化技术
-
静态节点标记
在模板编译阶段标记静态节点(无动态绑定的元素),后续 Diff 时直接跳过,减少对比开销。 -
组件级更新
每个组件独立维护虚拟 DOM 树,仅在该组件的数据变化时触发局部更新。 -
服务端渲染(SSR)
Vue 支持在服务端生成 HTML 字符串,加速首屏加载并改善 SEO。
总结
Vue 通过响应式数据绑定和虚拟 DOM 机制,实现了高效的视图更新。其代码渲染流程从模板编译到虚拟 DOM 对比,最终精准更新真实 DOM,兼顾性能与开发体验。开发者只需关注数据逻辑,无需手动操作 DOM,显著提升了前端开发效率。
浏览器原理
一、线程与进程的基本概念及浏览器原理
1. 进程与线程的定义
• 进程:操作系统中资源分配的最小单位,每个进程拥有独立的内存空间和系统资源(如文件句柄、网络连接等)。浏览器中,每个标签页通常对应一个独立的渲染进程。
• 线程:CPU调度的最小单位,隶属于进程。一个进程可包含多个线程,线程共享进程的内存和资源。例如,浏览器渲染进程中的GUI渲染线程、JS引擎线程等。
2. 浏览器中的进程与线程
现代浏览器(如Chrome)采用多进程架构,主要包含以下进程:
• 浏览器主进程:管理界面、子进程及存储功能。
• 渲染进程:负责页面渲染,包含GUI渲染线程(解析HTML/CSS)、JS引擎线程(执行JavaScript,单线程)、事件触发线程等。
• GPU进程:处理3D渲染和图形加速。
• 网络进程:处理网络请求。
• 插件进程:运行插件,避免崩溃影响浏览器。
线程协作示例:
当页面需要加载资源时,网络进程通过IPC(进程间通信)向渲染进程传递数据;JS引擎线程执行代码时,若触发异步请求,会由网络进程的独立线程处理,避免阻塞主线程。
二、进程间通信方式及效率对比
1. 常见进程间通信(IPC)方式
• 管道(Pipe):单向通信&#