前端面试核心知识点梳理
React Fiber 架构原理
在 16.x 版本中,React 将其最为核心的 Diff 算法整个重写,使其以'Fiber Reconciler'的全新面貌示人。
Stack Reconciler 的局限性
Stack Reconciler 是一个同步的递归过程。这意味着一旦更新开始,就像吃了炫迈一样,根本停不下来。当处理结构相对复杂、体量相对庞大的虚拟 DOM 树时,需要的调和时间会很长,导致 JavaScript 线程长时间霸占主线程,进而引发渲染卡顿或交互无响应等问题。
在 React 15 及之前的版本中,虚拟 DOM 树的数据结构载体是计算机科学中的'树',其 Diff 算法的遍历思路沿袭了传统计算机科学中'对比两棵树'的算法。从本质上来说,栈调和机制下的 Diff 算法是树的深度优先遍历的过程。
拿这棵树来举例,若 A 组件发生了更新,那么栈调和的工作过程是这样的:对比第 1 层的两个 A,确认节点可复用,继续 Diff 其子组件。当 Diff 到 B 的时候,对比前后的两个 B 节点,发现可复用,于是继续 Diff 其子节点 D、E。待 B 树最深层的 Diff 完成、逐层回溯后,再进入 C 节点的 Diff 逻辑。调和器会重复'父组件调用子组件'的过程,直到最深的一层节点更新完毕,才慢慢向上返回。
这个过程的致命性在于它是同步的,不可以被打断。当处理结构相对复杂、体量相对庞大的虚拟 DOM 树时,Stack Reconciler 需要的调和时间会很长,这就意味着 JavaScript 线程将长时间地霸占主线程,进而导致我们上文中所描述的渲染卡顿/卡死、交互长时间无响应等问题。
Fiber 架构设计思想
什么是 Fiber?从字面上来理解,Fiber 这个单词翻译过来是'丝、纤维'的意思,是比线还要细的东西。在计算机科学里,我们有进程、线程之分,而 Fiber 就是比线程还要纤细的一个过程,也就是所谓的'纤程'。纤程的出现,意在对渲染过程实现更加精细的控制。
Fiber 是一个多义词。从架构角度来看,Fiber 是对 React 核心算法(即调和过程)的重写;从编码角度来看,Fiber 是 React 内部所定义的一种数据结构,它是 Fiber 树结构的节点单位,也就是 React 16 新架构下的'虚拟 DOM';从工作流的角度来看,Fiber 节点保存了组件需要更新的状态和副作用,一个 Fiber 同时也对应着一个工作单元。
Fiber 架构的应用目的,按照 React 官方的说法,是实现'增量渲染'。所谓'增量渲染',通俗来说就是把一个渲染任务分解为多个渲染任务,而后将其分散到多个帧里面。不过严格来说,增量渲染其实也只是一种手段,实现增量渲染的目的,是为了实现任务的可中断、可恢复,并给不同的任务赋予不同的优先级,最终达成更加顺滑的用户体验。
Fiber 架构核心:可中断、可恢复与优先级
在 React 16 之前,React 的渲染和更新阶段依赖的是两层架构:
![图片]
正如上文所分析的那样,Reconciler 这一层负责对比出新老虚拟 DOM 之间的变化,Renderer 这一层负责将变化的部分应用到视图上,从 Reconciler 到 Renderer 这个过程是严格同步的。
而在 React 16 中,为了实现'可中断'和'优先级',两层架构变成了三层架构:
![图片]
多出来的这层架构,叫作'Scheduler(调度器)',调度器的作用是调度更新的优先级。
在这套架构模式下,更新的处理工作流变成了这样:首先,每个更新任务都会被赋予一个优先级。当更新任务抵达调度器时,高优先级的更新任务(记为 A)会更快地被调度进 Reconciler 层;此时若有新的更新任务(记为 B)抵达调度器,调度器会检查它的优先级,若发现 B 的优先级高于当前任务 A,那么当前处于 Reconciler 层的 A 任务就会被中断,调度器会将 B 任务推入 Reconciler 层。当 B 任务完成渲染后,新一轮的调度开始,之前被中断的 A 任务将会被重新推入 Reconciler 层,继续它的渲染之旅,这便是所谓'可恢复'。
以上,便是架构层面对'可中断''可恢复'与'优先级'三个核心概念的处理。
八股文档(含答案)
1. JavaScript
- 相比于 npm 和 Yarn,pnpm 的优势是什么?
- 如果使用 Math.random() 计算中奖概率会有什么问题吗?
- 怎么使用 JS 实现拖拽功能?
- 举例说明你对尾递归的理解,以及有哪些应用场景。
- 说说你对 Iterator, Generator 和 Async/Await 的理解。
- 说说你对模块化方案的理解,比如 CommonJS, AMD, CMD, ES Module。
- 前端跨页面通信,你知道哪些方法?
- JavaScript 脚本延迟加载的方式有哪些?
- 怎么理解 ES6 中 Generator 的?使用场景有哪些?
- 导致页面加载白屏时间长的原因有哪些,怎么进行优化?
- 微前端中的应用隔离是什么,一般是怎么实现的?
- JavaScript 对象的底层数据结构是什么?
- 浏览器和 Node 中的事件循环有什么区别?
- 版本号排序。
- 哪些原因会导致 JS 里 this 指向混乱?
- 怎么实现大型文件上传?
- 说说你的 ES6-ES12 的了解。
- Promise 的 finally 怎么实现的?
- 怎么使用 JS 动态生成海报?
- 异步编程有哪些实现方式?
- AST 语法树是什么?
- JS 内存泄露的问题该如何排查?
- 实现 mergePromise 函数。
- async、await 实现原理。
- 使用 Promise 实现:限制异步操作的并发个数,并尽可能快的完成全部。
2. React
- Fiber 架构的工作原理?
- React Reconciler 为何要采用 Fiber 架构?
- useState 是如何实现的?
- React Fiber 是什么?
- 简单介绍下 React 中的 diff 算法。
- 如何让 useEffect 支持 async/await?
- React 中怎么实现状态自动保存 (KeepAlive)?
- React Fiber 是如何实现更新过程可控?
- React 中懒加载的实现原理是什么?
- React 有哪些性能优化的方法?
- 不同版本的 React 都做过哪些优化?
- React 18 新特性。
- 说说你对 React Hook 的闭包陷阱的理解,有哪些解决方案?
- React 中,怎么给 children 添加额外的属性?
- Fiber 为什么是 React 性能的一个飞跃?
- React 是否支持给标签设置自定义的属性,比如给 video 标签设置 webkit-playsinline?
- 说说 React render 阶段的执行过程。
- React 中,fiber 是如何实现时间切片的?
- React 中为什么不直接使用 requestIdleCallback?
- 说说 React commit 阶段的执行过程。
- React 中的路由懒加载是什么?原理是什么?
- 为什么 useState 返回的是数组而不是对象?
3. Vue
- Vue 模板是如何编译的。
- Vue3 相比较于 Vue2,在编译阶段有哪些改进?
- 说说 Vue 页面渲染流程。
- Vue 项目中,你做过哪些性能优化?
- 如果使用 Vue3.0 实现一个 Modal,你会怎么进行设计?
- Vue3.0 里为什么要用 Proxy API 替代 defineProperty API?
- Vue 有了数据响应式,为何还要 diff?
- 说说 Vue3 中的响应式设计原理。
- 说说 Vue 中 CSS scoped 的原理。
- Vue3 的响应式库是独立出来的,如果单独使用是什么样的效果?
- 手写 Vue 的双向绑定。
- 什么是虚拟 DOM?如何实现一个虚拟 DOM?说说你的思路。
- SSR 是什么?Vue 中怎么实现?
- 说下 Vite 的原理。
4. CSS
- CSS 中的 animation, transition, transform 有什么区别?
- 怎么做移动端的样式适配?
- 相邻的两个 inline-block 节点为什么会出现间隔,该如何解决?
- Grid 网格布局是什么?
- CSS3 新增了哪些特性?
- 怎么使用 CSS3 实现动画?
- 怎么理解回流跟重绘?什么场景下会触发?
- 什么是响应式设计?响应式设计的基本原理是什么?如何进行实现?
- 如果使用 CSS 提高页面性能?
- 如何实现单行/多行文本溢出的首略样式?
- 如何使用 CSS 完成视差滚动效果?
- 怎么使用 CSS 如何画一个三角形?
- 说说对 CSS 工程化的理解。
- 怎么触发 BFC,BFC 有什么应用场景?
- 单行文本怎么实现两端对齐?
- 说说你对 CSS 模块化的理解。
- CSS 模块化的实现方式。
- 怎么让 Chrome 支持小于 12px 的文字?
- Flexbox(弹性盒布局模型) 是什么,适用什么场景?
- 如何实现两栏布局,右侧自适应?三栏布局中间自适应呢?
- 设备像素、CSS 像素、设备独立像素、dpr、ppi 之间有什么区别?
- 说说你对盒子模型的理解。
- 怎么实现样式隔离?
- Flex 布局下,怎么改变元素的顺序?
- "flex:auto;"是什么意思?
- object-fit 用法。
- 行内元素和块级元素有什么区别。
- em/px/rem/vh/vw 这些单位有什么区别?
- HTML 和 CSS 中的图片加载与渲染规则是什么样的?
- CSS 中,有哪些方式可以隐藏页面元素?有什么区别?
- CSS3 中 transition 和 animation 的属性分别有哪些?
- 说说对 CSS 预编语言的理解,以及它们之间的区别。
5. HTML
- 什么是 DOM 和 BOM?
- 简单描述从输入网址到页面显示的过程。
- 一台设备的 dpr,是否是可变的?
- 前端该如何选择图片的格式?
- 前端跨页面通信,你知道哪些方法?
- 说说你对 Dom 树的理解。
- 行内元素有哪些?块级元素有哪些?空 (void) 元素有那些?
- HTML 和 CSS 中的图片加载与渲染规则是什么样的?
- title 与 h1 的区别、b 与 strong 的区别、i 与 em 的区别?
- script 标签为什么建议放在 body 标签的底部 (defer、async)?
- 说说你对 SSG 的理解。
- 什么是 HTML5,以及和 HTML 的区别是什么?
- 什么是渐进增强和优雅降级?
- Node 和 Element 是什么关系?
- 导致页面加载白屏时间长的原因有哪些,怎么进行优化?
- 如何控制 input 输入框的输入字数?
- 渐进式 jpg 有了解过吗?
- 假设我要上传图片,怎么在选择图片后,通过浏览器预览待上传的图片?
- 怎么实现'点击回到顶部'的功能?
- SPA 应用怎么进行 SEO?
- 如何实现 SEO 优化。
- SEO 是什么?
- SEO 的原理是什么?
- DNS 预解析是什么?怎么实现?
- HTML5 有哪些 drag 相关的 API?
- 浏览器乱码的原因是什么?如何解决?
- Canvas 和 SVG 有什么区别?
- 浏览器是如何对 HTML5 的离线储存资源进行管理和加载?
- HTML5 的离线储存怎么使用,它的工作原理是什么?
- img 的 srcset 属性的作用?
- label 标签有什么用?
- JS 和 CSS 是如何影响 DOM 树构建的?
- CSSOM 树和 DOM 树是同时解析的吗?
6. Node.js
- CommonJS 和 ES6 中模块引入的区别?
- 为什么 Node 在使用 ES Module 时必须加上文件扩展名?
- 浏览器和 Node 中的事件循环有什么区别?
- Node 性能如何进行监控以及优化?
- 如果让你来设计一个分页功能,你会怎么设计?前后端如何交互?
- 如何实现文件上传?说说你的思路。
- 如何实现 JWT 鉴权机制?说说你的思路。
- 说说对中间件概念的理解,如何封装 Node 中间件?
- 说说 Node 文件查找的优先级以及 Require 方法的文件查找策略?
- 说说对 Nodejs 中的事件循环机制理解?
- 说说 Node 中的 EventEmitter?如何实现一个 EventEmitter?
- 说说对 Node 中的 Stream 的理解?应用场景?
- 说说对 Node 中的 Buffer 的理解?应用场景?
- 说说对 Node 中的 fs 模块的理解?有哪些常用方法?
- 说说对 Node 中的 process 的理解?有哪些常用方法?
- Node.js 有哪些全局对象?
- 说说你对 Node.js 的理解?优缺点?应用场景?
- body-parser 这个中间件是做什么用的?
- Koa 中,如果一个中间件没有调用 await next(),后续的中间件还会执行吗?
- 在没有 async await 的时候,Koa 是怎么实现的洋葱模型?
- Koa 框架中,该怎么处理中间件的异常?
- Node.js 如何调试?
- 说说你对 Koa 洋葱模型的理解。
- PM2 守护进程的原理是什么?
- Koa 和 Express 有哪些不同?
- 两个 Node.js 进程如何通信?
- NPM 是什么?
7. TypeScript
- 说说对 TypeScript 中命名空间与模块的理解?区别?
- 说说你对 TypeScript 的理解?与 JavaScript 的区别?
- TypeScript 中泛型是什么?
- TypeScript 中有哪些声明变量的方式?
- 什么是 TypeScript 的方法重载?
- 请实现下面的 sleep 方法。
- TypeScript 中的 is 关键字有什么用?
- TypeScript 支持的访问修饰符有哪些?
- 请实现下面的 myMap 方法。
- 请实现下面的 treePath 方法。
- 请实现下面的 product 方法。
- 请实现下面的 myAll 方法。
- 请实现下面的 sum 方法。
- 请实现下面的 mergeArray 方法。
- 实现下面的 firstSingleChar 方法。
- 实现下面的 reverseWord 方法。
- 如何定义一个数组,它的元素可能是字符串类型,也可能是数值类型?
- 请补充 objToArray 函数。
- 使用 TS 实现一个判断传入参数是否是数组类型的方法。
- TypeScript 的内置数据类型有哪些?
- TS 中 any 和 unknown 有什么区别?
- 如何将 unknown 类型指定为一个更具体的类型?
- 使用 ts 实现一个判断入参是否是数组类型的方法?
- tsconfig.json 文件有什么用?
- TypeScript 中的 Declare 关键字有什么用?
- 解释一下 TypeScript 中的枚举。
- TypeScript 的主要特点是什么?
- TypeScript 中的方法重写是什么?
- 什么是 TypeScript 映射文件?
- TypeScript 中的类型有哪些?
- 如何检查 TypeScript 中的 null 和 undefined?
- 如何在 TypeScript 中实现继承?
- 什么是 TypeScript Declare 关键字?
- TypeScript 和 JavaScript 的区别是什么?
8. 性能优化
- Script 标签放在 header 里和放在 body 底部里有什么区别?
- 前端性能优化指标有哪些?怎么进行性能检测?
- SPA(单页应用) 首屏加载速度慢怎么解决?
- 如果使用 CSS 提高页面性能?
- 怎么进行站点内的图片性能优化?
- 虚拟 DOM 一定更快吗?
- 有些框架不用虚拟 dom,但是他们的性能也不错是为什么?
- 如果某个页面有几百个函数需要执行,可以怎么优化页面的性能?
- 讲一下 png8、png16、png32 的区别,并简单讲讲 png 的压缩原理。
- 页面加载的过程中,JS 文件是不是一定会阻塞 DOM 和 CSSOM 的构建?
- React.memo 和 useMemo 的用法是什么,有哪些区别?
- 导致页面加载白屏时间长的原因有哪些,怎么进行优化?
- 如果一个列表有 100000 个数据,这个该怎么进行展示?
- DNS 预解析是什么?怎么实现?
- 在 React 中可以做哪些性能优化?
- 浏览器为什么要请求并发数限制?
- 如何确定页面的可用性时间,什么是 Performance API?
- 谈谈对 window.requestAnimationFrame 的理解。
- CSS 加载会造成阻塞吗?
- 什么是内存泄漏?什么原因会导致呢?
- 如何用 Webpack 来优化前端性能?
- 说说常规的前端性能优化手段。
- 什么是 CSS Sprites?
- CSS 优化、提高性能的方法有哪些?
- Script 标签中,async 和 defer 两个属性有什么用途和区别?
9. 编程题
- 使用 Promise 实现红绿灯交替重复亮。
- bind、call、apply 有什么区别?如何实现一个 bind?
- 利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串 aabcccccaaa 会变为...
- 说说 new 操作符具体干了什么?
- 如何实现上拉加载,下拉刷新?
- 大文件怎么实现断点续传?
- 什么是防抖和节流,以及如何编码实现?
- 说说 Ajax 的原理,以及如何实现?
- 深拷贝浅拷贝有什么区别?怎么实现深拷贝?
- 用 JS 实现二叉树的定义和基本操作。
- 如何实现一个轮播图组件?
- 写出一个函数 trans,将数字转换成汉语的输出,输入为不超过 10000 亿的数字。
- 将下面的数组转成树状结构。
- 编写一个 Vue 组件,组件内部使用插槽接收外部内容,v-model 双向绑定,实现折叠展开的功能。
- 实现 lodash 的 set 和 get 方法。
- 去除字符串中出现次数最少的字符,不改变原字符串的顺序。
- 实现一个批量请求函数,要求能够限制并发量。
- 树转数组。
- 数组转树。
- 删除链表的一个节点。
- 请实现一个函数,要求能在页面请求很多时,尽可能快地按照顺序输出返回的结果。
- 实现一个请求函数:fetchWithRetry,要求会最多自动重试 3 次,任意一次成功就直接返回。
- 链表中,环的入口节点。
- 多叉树指定层节点的个数。
- 请手写'快速排序'。
- 使用 JS 实现有序数组原地去重。
- 计算出下面数组中的平均时间。
- 实现 compose 函数,类似于 Koa 的中间件洋葱模型。
- 请按以下要求实现方法 fn:遇到退格字符就删除前面的字符,遇到两个退格就删除两个字符。
- Promise 的 finally 怎么实现的?
- 实现一个函数,可以间隔输出。
- 不定长二维数组的全排列。
- 两个字符串对比,得出结论都做了什么操作,比如插入或者删除。
- 实现一个方法,从某个数值数组中,获取最小正数 (非零非负数) 的索引值。
10. 工程化
- 使用 Promise 实现红绿灯交替重复亮。
- bind、call、apply 有什么区别?如何实现一个 bind?
- 利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串 aabcccccaaa 会变为..
- 说说 new 操作符具体干了什么?
- 如何实现上拉加载,下拉刷新?
- 大文件怎么实现断点续传?
- 什么是防抖和节流,以及如何编码实现?
- 说说 Ajax 的原理,以及如何实现?
- 深拷贝浅拷贝有什么区别?怎么实现深拷贝?
- 用 JS 实现二叉树的定义和基本操作。
- 如何实现一个轮播图组件?
- 写出一个函数 trans,将数字转换成汉语的输出,输入为不超过 10000 亿的数字。
- 将下面的数组转成树状结构。
- 编写一个 Vue 组件,组件内部使用插槽接收外部内容,v-model 双向绑定,实现折叠展开的功能。
- 实现 lodash 的 set 和 get 方法。
- 去除字符串中出现次数最少的字符,不改变原字符串的顺序。
- 实现一个批量请求函数,要求能够限制并发量。
- 树转数组。
- 数组转树。
- 删除链表的一个节点。
- 请实现一个函数,要求能在页面请求很多时,尽可能快地按照顺序输出返回的结果。
- 实现一个请求函数:fetchWithRetry,要求会最多自动重试 3 次,任意一次成功就直接返回。
- 链表中,环的入口节点。
- 多叉树指定层节点的个数。
- 请手写'快速排序'。
- 使用 JS 实现有序数组原地去重。
- 计算出下面数组中的平均时间。
- 实现 compose 函数,类似于 Koa 的中间件洋葱模型。
- 请按以下要求实现方法 fn:遇到退格字符就删除前面的字符,遇到两个退格就删除两个字符。
- Promise 的 finally 怎么实现的?
- 实现一个函数,可以间隔输出。
- 不定长二维数组的全排列。
- 两个字符串对比,得出结论都做了什么操作,比如插入或者删除。
- 实现一个方法,从某个数值数组中,获取最小正数 (非零非负数) 的索引值。
11. 场景题
- 怎么在前端页面中添加水印?
- 如何封装一个请求,让其多次调用的时候实际只发起一个请求的时候,返回同一份结果。
- Web 网页如何禁止别人移除水印。
- React 中怎么实现下拉菜单场景,要求点击区域外能关闭下拉组件。
- 如何搭建一套灰度系统?
- React 如何实现 Vue 中 KeepAlive 的功能?
- 如何监控前端页面的崩溃?
- 如何在前端团队快速落地代码规范。
- 前端如何实现即时通讯?
- 用户访问页面白屏了,原因是啥,如何排查。
- 如何给自己团队的大型前端项目设计单元测试?
- 如何做一个前端项目工程的自动化部署,有哪些规范和流程设计?
- 你参与过哪些前端基建方面的建设?
- 假如让你负责一个商城系统的开发,现在需要统计商品的点击量,你有什么样设计与...
- 前端怎么做错误监控?
- 如何判断用户设备。
- 将多次提交压缩成一次提交。
- 介绍下 navigator.sendBeacon 方法。
- 混动跟随导航(电梯导航)该如何实现。
- 退出浏览器之前,发送积压的埋点数据请求,该如何做?
- 如何统计页面的 Long Task(长任务)。
- PerformanceObserver 如何测量页面性能。
- 移动端如何实现下拉滚动加载(顶部加载)。
- 判断页签是否为活跃状态。
- 在网络带宽一定的情况下,切片上传感觉和整体上传消费的时间应该是差不多的这种说法正确吗?
- 大文件切片上传的时候,确定切片数量的时候,有那些考量因素。
- 页面关闭时执行方法,该如何做。
- 如何统计用户 PV 访问的发起请求数量。
- 长文本溢出,展开/收起如何实现。
- 如何实现鼠标拖拽。
- 统计全站每一个静态资源加载耗时,该如何做。
- 防止前端页面重复请求。
- ResizeObserver 作用是什么。
- 要实时统计用户浏览器窗口大小,该如何做。
- 当项目报错,你想定位是哪个 Commit 引入的错误的时,该怎么做。
- 如何移除一个指定的 Commit。
- 如何还原用户操作流程。
- 可有办法将请求的调用源码地址包括代码行数也上报上去?
- 请求失败会弹出一个 Toast,如何保证批量请求失败,只弹出一个 Toast。
- 如何减少项目里面 if-else。
- Babel-runtime 作用是啥。
- 如何实现预览 PDF 文件。
- 如何在划词选择的文本上添加右键菜单(划词:标滑动选择一组字符,对组字符进行操作)。
- 富文本里面,是如何做到划词的(鼠标滑动选择一组字符,对组字符进行操作)?
- 如何做好前端监控方案。
- 如何标准化处理线上用户反馈的问题。
- PX 如何转为 REM。
- 浏览器有同源策略,但是为何 CDN 请求资源的时候不会有跨域限制。
- Cookie 可以实现不同域共享吗。
- Axios 是否可以取消请求。
- 前端如何实现折叠面板效果?
- DOM 里面,如何判定 a 元素是否是 b 元素的子元素。
- 判断一个对象是否为空,包含了其原型链上是否有自定义数据或者方法。该如何判定?
- Is 如何判空?「空」包含了:空数组、空对象、空字符串、0、undefined、null、空 Map、空 Set 都属于为空的数据。
- CSS 实现翻牌效果。
- Flex:1 代表什么。
- 一般是怎么做代码重构的。
- 如何清理源码里面没有被应用的代码,主要是 JS、TS.CSS 代码。
- 前端应用如何做国际化?
- 应用如何做应用灰度发布。
- 微前端为何通常在微前端应用隔离,不选择 iframe 方案。
- Qiankun 是如何做 JS 隔离的。
- 微前端架构一般是如何做 JavaScript 隔离。
- 循环渲染中为什么推荐不用 index 做 key。
- 如何避免使用 context 的时候,引起整个挂载节点树的重新渲染。
- 前端如何实现截图?
- 当 QPS 达到峰值时,该如何处理?
- JS 超过 Number 最大值的数怎么处理?
- 使用同一个链接,如何实现 PC 打开是 Web 应用、手机打开是一个 H5 应用?
- 如何保证用户的使用体验。
- 如何解决页面请求接口大规模并发问题。
- 设计一套全站请求耗时统计工具。
- 大文件上传了解多少。
- H5 如何解决移动端适配问题。
- 站点一键换肤的实现方式有哪些?
- 如何实现网页加载进度条?
- 常见图片懒加载方式有哪些?
- Cookie 构成部分有哪些。
- 扫码登录实现方式。
- DNS 协议了解多少。
- 函数式编程了解多少?
- 前端水印了解多少?
- 什么是领域模型。
- 一直在 Window 上面挂东西是否有什么风险。
- 深度 SEO 优化的方式有哪些,从技术层面来说。
- 小程序为什么会有两个线程。
- Web 应用中如何对静态资源加载失败的场景做降级处理。
- HTML 中前缀为 data-开头的元素属性是什么?
- 移动端如何实现上拉加载,下拉刷新?
- 如何判断 DOM 元素是否在可视区域。
- 前端如何用 Canvas 来做电影院选票功能。
- 如何通过设置失效时间清除本地存储的数据?
- 如果不使用脚手架,如果用 Webpack 构建一个自己的 React 应用。
- 用 Node.js 实现一个命令行工具,统计输入目录下面指定代码的行数。
- Packagejson 里面 sideEffects 属性的作用是啥。
- Script 标签上有那些属性,分别作用是啥?
- 为什么 SPA 应用都会提供一个 Hash 路由,好处是什么?
- 如何进行路由变化监听。
- 单点登录是是什么,具体流程是什么。
- Web 网页如何禁止别人移除水印。
- 用户访问页面白屏了,原因是啥,如何排查?
- 代码实现 s 中如何实现大对象深度对比。
- 如何理解数据驱动视图,有哪些核心要素?
- Vue-cli 都做了哪些事儿,有哪些功能?
- JS 执行 100 万个任务,如何保证浏览器不卡顿?
- JS 放在 head 里和放在 body 里有什么区别?
- ESLint 代码检查的过程是啥?
- 虚拟混动加载原理是什么,用 JS 代码简单实现一个虚拟滚动加载。
- React-router 和原生路由区别。
- HTML 的行内元素和块级元素的区别。
- 介绍一下 requestIdleCallback API。
- DocumentFragment API 是什么,有哪些使用场景?
- Git pull 和 git fetch 有啥区别?
- 前端如何做页面主题色切换。
- 前端视角 - 如何保证系统稳定性。
- 如何统计长任务时间、长任务执行次数。
- V8 里面的 JIT 是什么?
- 用 JS 写一个 Cookies 解析函数,输出结果为一个对象。
- Vue 中 Scoped Styles 是如何实现样式隔离的,原理是啥。
- 样式隔离方式有哪些。
- 在 JS 中,如何解决递归导致栈溢出问题?
- 站点如何防止爬虫?
- TS 项目中,如何使用 node_modules 里面定义的全局类型包到自己项目 src 下面使用?
- 不同标签页或窗口间的【主动推送消息机制】的方式有哪些?(不借助服务端)
- 在 React 项目开发过程中,是否可以不用 react-router 使用浏览器原生 history 路由来组织页面路由?
- 在表单校验场景中,如何实现页面视口滚动到报错的位置。
- 如何一次性渲染十万条数据还能保证页面不卡顿。
- Webpack 打包时 hash 码是如何生成的。
- 如何从 0 到 1 搭建前端基建。
- 你在开发过程中,使用过哪些 TS 的特性或者能力?
- JS 的加载会阻塞浏览器渲染吗?
- 浏览器对队头阻塞有什么优化?
- Webpack 项目中通过 script 标签引入资源,在项目中如何处理?
- 应用上线后,怎么通知用户刷新当前页面?
- ESLint 代码检查的过程是啥?
- HTTP 是一个无状态的协议,那么 Web 应用要怎么保持用户的登录态呢?
- 如何检测网页空闲状态(一定时间内无操作)。
- 为什么 Vite 速度比 Webpack 快?
- 列表分页,快速翻页下的竞态问题。
- JS 执行 100 万个任务,如何保证浏览器不卡顿?
- Git 仓库迁移应该怎么操作。
- 如何禁止别人调试自己的前端页面代码?
- Web 系统里面,如何对图片进行优化?
- OAuth2.0 是什么登录方式。
- 单点登录是如何实现的?
- 常见的登录鉴权方式有哪些?
- 需要在跨域请求中携带另外一个域名下的 Cookie 该如何操作?
- Vite 和 Webpack 在热更新上有啥区别?
- 封装一个请求超时,发起重试的代码。
- 前端如何设置请求超时时间 timeout。
- Node.js 如何充分利用多核 CPU?
- 后端一次性返回树形结构数据,数据量非常大前端该如何处理?
- 你认为组件封装的一些基本准则是什么?
- 页面加载速度提升 (性能优化) 应该从哪些反向来思考?
- 前端日志埋点 SDK 设计思路。
- Token 进行身份验证了解多少?
- 在前端应用如何进行权限设计?
- 低代码平台一般消染是如何设计的?
- 低代码平台一般底层协议是怎么设计的。
- Webpack 有哪些优化项目的手段?
- IndexedDB 存储空间大小是如何约束的?
- 浏览器的存储有哪些。
- Webpack 如何打包运行时 chunk,且在项自工程中如何去加载这个运行时 chunk?
- 为何现在市面上做表格泊染可视化技术的,大多数都是 Canvas,而很少用 SVG 的?
- 在你的项目中,使用过哪些 Webpack Plugin,说一下他们的作用。
- 在你的项目中,使用过哪些 Webpack Loader,说一下他们的作用。
- React 如何避免不必要的渲染?
- 全局样式命名冲突和样式盖问题怎么解决?
- React 如何实现专场动画?
- React 从 React 层面上,能做的性能优化有哪些?
- Vue 中为何不要把 v-if 和 v-for 同时用在同一个元素上,原理是什么?
- 将静态资源缓存在本地的方式有哪些?
- SPA 首屏加载速度慢的怎么解:决。
- Axios 是如何区分是 Node.js 环境还是浏览器环境的?
- 如何拦截 Web 应用的请求。
- 前端有哪些跨页面通信方式?
- H5 下拉刷新如何实现?
- 如何修改第三方 NPM 包?
12. 项目细节难点
- 测试和调试。
- 跨域请求问题。
- 数据安全和隐私保护。
- 移动端触摸事件处理。
- 性能优化。
- 响应式布局的挑战。
- 浏览器兼容性问题。
- 获取首页链接里面的参数问题。
- 更新文件缓存的坑。
- 解析后端返回的 Map 格式数据的坑。
- Vue 组件动态加载的坑。
- 页面缓存的坑。
- 路由传参的功能的坑。
- Axios 请求中 Post 请求的坑。
- 为什么需要二次封装组件库?
- 请结合一个组件库设计的过程,谈谈前端工程化的思想。
- 如何对一个组件库进行测试?
- 在使用 Qiankun 时,你如何处理多个子项目的调试问题?
- 你能解释一下 Qiankun 如何实现 KeepAlive 的需求吗?
- 在使用 Qiankun 时,你如何处理 JS 沙箱不能解决的 JS 污染问题?
- 在项目中有没有单独封装组件。
- 在项目中发送请求怎么携带 Token。
- 工作中有用到 Git 吗。
- Git 版本发生冲突你怎么解决的。
- 如何快速让一个盒子水平垂直居中。
- 首屏加载白屏怎么进行优化。
- 路由传参 Query 与 Params 区别。
- 项目基础优化。
- 对 $nextTick 异步渲染的理解。
- 你是怎么对 Axios 进行二次封装的,有什么作用。
- 用户 Token 失效你是怎么处理的。
- 说一下项目的流程。
- 商品和增删改查。
- Element-UI 的 Form 表单验证你是怎么使用的。
- 项目中的商品详情页你是怎么实现的。
- 什么是数组扁平化。
- 你这个项目登陆是怎么实现的。
- 项目中的权限管理怎么实现的。
- Vue 的 $nextTick 方法有用到过吗。
- 深拷贝与浅拷贝。
- 在 Vue 是项目中如何打开新的页面。
- 请解释一下微前端的概念以及它的主要优点和挑战?
- 你能详细描述一下 Qiankun 微前端框架的工作原理吗?
- 在使用 Qiankun 时,如果子应用是基于 jQuery 的多页应用,你会如何处理静态资源的加载问题?
- 在使用 Qiankun 时,如果子应用动态插入了一些标签,你会如何处理?
- 在使用 Qiankun 时,你如何处理老项目的资源加载问题?你能给出一些具体的解决方案吗?
- 你能解释一下 Qiankun 的 start 函数的作用和参数吗?如果只有一个子项目,你会如何启用预加载?
- Axios 请求中 Post 请求的坑。
- 路由传参的功能的坑。
- 页面缓存的坑。
- Vue 组件动态加载的坑。
- 解析后端返回的 Map 格式数据的坑。
- 更新文件缓存的坑。
- H5 页面打开调试日志。
- 获取首页链接里面的参数问题。
- H5 里面的搜索。
- 登录接口 Bug。
- 封装的请求方法不需要在传入相同的参数。
- 进来不在 index.html 文件里面引入公共的文件。
- 你做的项目中都使用过那些中间件呢?
- 你在开发过程中有什么困难点(或者使用了什么技术)。
- 会写接口吗?项目你负责什么?
- 你之前做过小程序吗?主要包括哪些功能?
- 这个小程序的具体设计逻辑是怎么样的?有几个人开发?周期多长?在你离职时,这个小程序项目是否还在开发?或者你离职时,你们公司在开发什么?
- 你说你负责支付环节,那么微信支付的流程是否可以简单说一下?
- 那好,既然流程说完了,那么,我问你,你这个项目涉及到了 MB,它在用户点击支付之后的逻辑关系和表关系你是怎么理解的?有多少张表?表关系?
- 你觉得这个小程序项目的细节之处有哪些?
- 如何自定义 Tabbar?
- 你刚才提到了异步,在这个项目中你是否被异步坑过,最后又是如何解决的?
- 你能描述一下渐进增强和优雅降级之间的不同吗?
- 为什么利用多个域名来存储网站资源会更有效?
- 一个页面上有大量的图片(大型电商网站),加载很慢,你有哪些方法优化这些图片的加载,给用户更好的体验。
- 一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?
- 前端如何进行登录身份的判断。
- 电商项目跟其它项目有什么不同?
- 实践题。
- 项目开发中有遇到什么挑战没?
- 项目研发流程中作为前端开发一般扮演的啥角色?
- 现在有的项目中觉得哪些项目可以继续优化,为啥没有优化?
- 平时写项目总结么,一般总结哪些东西?
- 请简单绘制登录场景的业务流程图,如不熟悉登录业务,也可以选择自己之前项目的业务简单说明。
- 项目上线后,会将 index.html 给后端,在地址栏上输入 www.abc.com,当在地址后面缀上/layout 回车后,页面会报 404,是否遇见过这个问题,又该如何去解决?
- 项目中由谁定接口,公司文档如何管理,由谁负责上传代码,怎么上传代码的,项目发布都是怎么做的?
- 请你说说高级前端工程师和初级以及中级有什么区别?
- 用过 ECharts 与 Highcharts 么,你遇到哪些问题及如何解决的。
- 项目开发中是用什么工具来管理代码的:说一下你是用过的工具用法(Git、SVN)。
- 讲一下最近的这个项目中都负责什么。
- 怎么判断是开发环境生产环境。
- Vue 如何在用户没登陆的时候重定向登录界面?
- Vue 项目常见优化点。
- 异步解决方案有哪些?
- 移动端点击事件 300ms 延迟如何去掉?原因是什么?
- 如何实现函数的柯里化?比如 add(1)(2)(3)。
- 什么是反柯里化。
- 如何避免回调地狱?
- 开发过程中遇到内存泄漏的问题都有哪些?
- 浏览器有哪些兼容问题,你封装过什么插件。
- 假如 A 页面我定义了一个定时器,然后跳到 B 页面如果让 A 页面的定时器暂停。
- 深拷贝是什么?项目哪里是用到了深拷贝?
- Swiper 插件从后台获取数据没问题,CSS 代码啥的也没问题,但是图片不动,应该怎么解决?
- 常见内存泄漏。
- 插入几万个 DOM,如何实现页面不卡顿?

