前端学习30 相关面试题4

1.浏览器渲染过程(输入 URL 到页面展示)

  • 地址解析与网络请求用户在浏览器地址栏输入 URL,浏览器开始进行 DNS 解析(域名转 IP),建立 TCP 连接(三次握手),发送 HTTP 请求到服务器。
  • 服务器响应与资源下载服务器返回 HTML 文档,浏览器开始解析 HTML 流,遇到 CSS、JS、图片等资源时,继续发起请求下载。
  • HTML 解析生成 DOM 树浏览器解析 HTML,构建出DOM 树(Document Object Model),这是页面的节点树,代表页面结构。
  • CSS 解析生成 CSSOM 树浏览器解析 CSS,生成CSSOM(CSS Object Model),表示样式信息。
  • 生成渲染树(Render Tree)浏览器结合 DOM 树和 CSSOM 树,生成渲染树,它只包含可见节点和对应样式信息。
  • 布局(Layout 或 Reflow)浏览器根据渲染树计算每个节点的几何信息(大小、位置)。
  • 绘制(Paint)浏览器根据布局结果,把每个节点绘制成屏幕像素。
  • 2.Vue 3 中的 VNode 渲染流程

    VNode是构成虚拟DOM树的节点对象,虚拟DOM树是由VNode组成的树结构

    在 Vue 3 应用中,模板被编译为 VNode(虚拟 DOM)树,由 JavaScript 构建并维护,初次渲染时将 VNode 转为真实 DOM,响应式数据变化时通过高效的 diff 算法对比新旧 VNode,实现最小化 DOM 更新。这个虚拟 DOM 渲染机制是 Vue 提升页面渲染性能和响应速度的关键所在。

    Vue 的 SPA 应用中:

    1. Vue 先基于响应式数据生成虚拟 DOM 树(VNode)。
    2. Vue 通过 diff 算法更新虚拟 DOM 树的差异。
    3. Vue 最终把这些变化应用到真实 DOM。
    4. 浏览器根据真实 DOM 和 CSS,构建渲染树,进行布局(Layout)和绘制(Paint)

    3.JavaScript 的下载与运行过程

    1.下载阶段:

    浏览器解析 HTML 文档时,遇到 <script> 标签(外部脚本或内联脚本)对于外部脚本(带 src 属性的 <script src="xxx.js">),浏览器会向服务器发起额外的 HTTP 请求下载这个 JS 文件下载 JS 文件是网络 I/O 过程,浏览器会同时进行解析 HTML、下载其他资源,但一般脚本下载会阻塞后续 HTML 的解析(除非使用 defer 或 async 属性)。

    2.解析与编译阶段:

    浏览器下载完 JavaScript 文件后,会将脚本文本传给 JavaScript 引擎(比如 Chrome 的 V8)JS 引擎先进行词法分析和语法分析,生成抽象语法树(AST)随后将 AST 编译为字节码或机器码,准备执行。

    3.执行阶段:

    JS 引擎执行编译后的代码,进行变量声明、函数定义、表达式计算等在浏览器环境中,JS 运行时会访问 DOM API、BOM API(浏览器对象模型),可以操作页面内容和浏览器行为如果是 Vue 等框架,JS 代码会创建 VNode,管理响应式数据,触发组件渲染。

    异步任务与事件循环JS 单线程执行同步代码异步任务(如网络请求、定时器、DOM 事件)通过事件循环机制处理,保证 UI 不阻塞。

    全部评论

    相关推荐

    05-18 07:43
    已编辑
    东华大学 前端工程师
    一面(2025/02/13)1.&nbsp;自我介绍2.&nbsp;你如何学习前端的3.&nbsp;为什么没有继续深入大数据相关行业4.&nbsp;项目介绍&nbsp;&nbsp;&nbsp;&nbsp;1.&nbsp;项目功能&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;如何处理学生考试时提交结果的高并发的问题&nbsp;&nbsp;&nbsp;&nbsp;3.&nbsp;为何选择&nbsp;Pinia&nbsp;而不是更加主流的&nbsp;Vuex,出于什么考虑&nbsp;&nbsp;&nbsp;&nbsp;4.&nbsp;项目打包过程,产物是什么样的,浏览器能运行什么文件,能运行&nbsp;ts&nbsp;文件吗,为什么只有一个&nbsp;index.html&nbsp;却能显示不同页面,Vue&nbsp;中的&nbsp;template&nbsp;代码是如何在浏览器中被看到的(这里一开始没有回答上来,所以在引导我)(单页应用&nbsp;SPA)5.&nbsp;工程化&nbsp;&nbsp;&nbsp;&nbsp;1.&nbsp;Vite&nbsp;打包过程&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;Webpack&nbsp;与&nbsp;Vite&nbsp;的区别&nbsp;&nbsp;&nbsp;&nbsp;3.&nbsp;Webpack&nbsp;中的&nbsp;loader&nbsp;是做什么的&nbsp;&nbsp;&nbsp;&nbsp;4.&nbsp;es6&nbsp;转&nbsp;es5&nbsp;是怎么实现的,听说过&nbsp;Babel&nbsp;吗&nbsp;&nbsp;&nbsp;&nbsp;5.&nbsp;npm、pnpm、yarn&nbsp;的区别,lock&nbsp;文件是做什么的6.&nbsp;Vue&nbsp;&nbsp;&nbsp;&nbsp;1.&nbsp;组合式&nbsp;API&nbsp;与选项式&nbsp;API&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;Vue3&nbsp;与&nbsp;Vue2&nbsp;的区别&nbsp;&nbsp;&nbsp;&nbsp;3.&nbsp;组件通信方式7.&nbsp;CSS&nbsp;&nbsp;&nbsp;&nbsp;1.&nbsp;有哪些布局,讲一讲&nbsp;Flex&nbsp;布局,常用属性&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;定位方式&nbsp;&nbsp;&nbsp;&nbsp;3.&nbsp;选择器优先级,important&nbsp;的优先级是多少8.&nbsp;JS&nbsp;&nbsp;&nbsp;&nbsp;1.&nbsp;实现异步的方式(回调、Promise、async/await)&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;Promise&nbsp;的&nbsp;API,Promise&nbsp;的参数是什么&nbsp;&nbsp;&nbsp;&nbsp;3.&nbsp;事件循环,JS&nbsp;引擎为什么是单线程&nbsp;&nbsp;&nbsp;&nbsp;4.&nbsp;浏览器缓存(强缓存、协商缓存)9.&nbsp;Git&nbsp;&nbsp;&nbsp;&nbsp;1.&nbsp;常用命令&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;rebase&nbsp;与&nbsp;merge&nbsp;的区别10.&nbsp;Linux&nbsp;常用命令11.&nbsp;数据结构与算法&nbsp;&nbsp;&nbsp;&nbsp;1.&nbsp;数组和链表&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;有哪些排序算法,冒泡排序与快速排序的时间复杂度&nbsp;&nbsp;&nbsp;&nbsp;3.&nbsp;图的表示方式&nbsp;&nbsp;&nbsp;&nbsp;4.&nbsp;DFS&nbsp;和&nbsp;BFS,层序遍历属于哪个12.&nbsp;反问:什么是大前端如何学习前端的回答没有让面试官满意;项目细节不太了解,没有去尝试理解更深层次的部分;对前端打包细节了解不多;基础知识仍然需要再完善提高。美团的面试官让我对面试有了新的认知,跟京东的面试体验差距好大。二面(2025/02/20)1.&nbsp;面试官自我介绍,自我介绍2.&nbsp;能实习多久,什么时候能来3.&nbsp;你熟悉的技术栈4.&nbsp;盒模型5.&nbsp;居中方式6.&nbsp;事件循环7.&nbsp;防抖和节流8.&nbsp;HTTP&nbsp;状态码9.&nbsp;OSI&nbsp;七层模型10.&nbsp;UDP&nbsp;和&nbsp;TCP,TCP&nbsp;为什么更可靠11.&nbsp;GET&nbsp;和&nbsp;POST,POST&nbsp;为啥要两次请求12.&nbsp;JS&nbsp;与&nbsp;TS&nbsp;的区别13.&nbsp;TS&nbsp;类型14.&nbsp;v-model&nbsp;原理15.&nbsp;computed&nbsp;和&nbsp;watch&nbsp;的区别与使用场景16.&nbsp;nextTick&nbsp;使用场景和实现17.&nbsp;事件总线18.&nbsp;项目相关&nbsp;&nbsp;&nbsp;&nbsp;1.&nbsp;介绍&nbsp;OJ&nbsp;重构项目、人员规模、开发周期、你负责的内容&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;为什么要重构&nbsp;&nbsp;&nbsp;&nbsp;3.&nbsp;重构时如何保证系统功能稳定性&nbsp;&nbsp;&nbsp;&nbsp;4.&nbsp;为什么选择&nbsp;Pinia&nbsp;而不是&nbsp;Vuex&nbsp;&nbsp;&nbsp;&nbsp;5.&nbsp;组件库的选择考量&nbsp;&nbsp;&nbsp;&nbsp;6.&nbsp;介绍大模型对话组件,背景、出发点、开发周期&nbsp;&nbsp;&nbsp;&nbsp;7.&nbsp;流式传输协议怎么实现的&nbsp;&nbsp;&nbsp;&nbsp;8.&nbsp;虚拟滚动技术怎么实现的,开始与结束的索引怎么计算的19.&nbsp;算法:最长递增子序列隔了一周挂了,有些没答上来,有些说的不够广不够深,算法看错题了(ಥ_ಥ)
    点赞 评论 收藏
    分享
    模块泄露(module&nbsp;leaks)通常指的是在应用程序或库中,某个模块的资源(变量、函数、类等)在不恰当的情况下被暴露或泄露给了其他模块或作用域,导致数据的不受控制的共享或污染。以下是一些可能导致模块泄露的情况:https://www.nowcoder.com/issue/tutorial?zhuanlanId=Mg58Em&amp;uuid=ba06d8fbb87f45f7bf340c85dc4f0cc1全局变量污染:如果在模块中将变量或函数定义在全局作用域中,其他模块就可以直接访问和修改这些变量,从而导致不受控制的共享和污染。意外的导出:当一个模块中的变量、函数或类被意外地导出给了其他模块使用,而不是作为内部实现的一部分,就可能导致模块泄露。这可能是由于代码编写错误、导入导出配置问题或误操作导致的。循环引用:循环引用是指两个或多个模块相互之间存在着相互依赖的关系。如果循环引用的处理不当,可能导致模块无法正确加载或导致模块之间的依赖关系混乱,从而导致模块泄露。模块泄露的后果可能包括代码的不稳定性、变量冲突、内存泄露等。为了避免模块泄露,可以采取以下措施:封装和隐藏内部实现:在设计模块时,合理使用作用域和闭包,仅暴露必要的接口给其他模块使用,将内部实现状态和方法进行封装和隐藏,减少模块间的直接依赖和冲突。使用模块化的开发方式:使用模块化的开发方式,如CommonJS、ES&nbsp;Modules等,可以通过明确的导入和导出规范来管理模块之间的依赖关系,避免意外的导出和导入问题。严格限制全局变量的使用:尽量避免使用全局变量,将变量的作用域限制在模块内部,避免变量的污染和共享。检查循环引用:在使用模块间的相互依赖时,保持谨慎,并检查循环引用问题。可以通过工具、插件或规范来检查和处理循环引用的情况。通过以上的措施,可以有效地减少模块泄露的发生,并提高代码的健壮性和可维护性。
    点赞 评论 收藏
    分享
    评论
    点赞
    1
    分享

    创作者周榜

    更多
    牛客网
    牛客网在线编程
    牛客网题解
    牛客企业服务