星哥の面试题Day16
面试题系列均来自鱼皮的知识星球——编程导航
什么是箭头函数?能使用 new 来创建箭头函数么?
箭头函数是 ES6 中新增的一种函数定义方式,可以用来简化函数的定义和书写。箭头函数的特点是:简洁的语法、绑定 this 关键字、不能用作构造函数。
箭头函数使用箭头(=>)来定义,基本语法如下:
1 | (parameters) => { statements } |
其中,parameters 是函数的参数列表,可以是一个或多个参数,多个参数之间用逗号分隔;statements 是函数的执行语句,可以是一个或多个语句,多个语句之间用花括号包裹起来。
在箭头函数中,this 关键字指向的是函数定义时所在的对象,而不是执行时所在的对象。这个特性有助于避免 this 的指向问题,使得代码更加简洁易读。
需要注意的是,箭头函数不能用作构造函数,也就是不能通过 new 关键字来创建实例。因为箭头函数没有自己的 this,而是继承了外层作用域的 this。如果用 new 来创建实例,就会出现意料之外的结果。
什么是 webpack 的热更新?它的实现原理是什么?
webpack 的热更新(Hot Module Replacement,简称 HMR)是一种开发时提高开发效率的技术,可以实现无需刷新页面即可看到代码修改后的效果。在使用 HMR 后,当修改了代码后,webpack 只会重新编译修改的代码,并将新的模块发送到客户端,替换掉旧的模块,从而达到实时更新页面的目的。
实现 HMR 的关键是在客户端和服务器端之间建立一个 WebSocket 连接,当代码发生变化时,服务器端会将新的模块发送给客户端,客户端接收到新的模块后会用新模块替换旧模块,从而实现实时更新。
具体来说,webpack HMR 主要分为以下几个步骤:
- 启动 webpack-dev-server,配置 HMR 插件
- 当代码变化时,webpack-dev-server 会编译出新的模块
- HMR runtime(客户端运行时)会通过 WebSocket 与服务器通信,获取最新的模块
- 当 HMR runtime 接收到新模块时,会将新模块加载到浏览器中,并通过模块热替换算法将新模块与旧模块进行比较,只替换有变化的模块部分
- 页面更新完成,无需刷新页面即可看到最新的效果。
总之,HMR 可以大大提高开发效率,同时也能够减少代码变更时的刷新操作,提高开发体验。
说说常规的前端性能优化手段
常见的前端性能优化手段有以下几种:
- DNS 优化:避免浏览器并发数限制,将HTML/CSS/JS,jpg/png,api 接口等不同资源放在不同域名下,从而减少DNS的请求次数;DNS 预解析。
- CDN 回源:回源指浏览器访问CDN集群上静态文件时,文件缓存过期,直接穿透 CDN 集群而访问源站机器的行为。
- 浏览器缓存优化:IndexDB、cookie、localStorage、sessionstorage。
- HTML5 离线化:通过选用不同的离线包类型
- 全局离线包:包含公共的资源,可供多个应用共同使用
- 私有离线包:只可以被某个应用单独使用
- 接口优化:
- 接口合并:减少http请求
- 接口上 CDN:把不需要实时更新的接口同步到CDN,如果接口数据更新再重新同步 CDN
- 接口域名上 CDN:增强可用性,稳定性
- 合理使用缓存:异步接口数据优先使用本地 localstorage 中的缓存数据,通过 md5 判断是否需要数据更新
- 页面加载策略优化:
- 网络请求优化:减少网络资源的请求和加载耗时
- 预加载
- 开启GZIP
- 预渲染:可以让浏览器提前加载指定页面的所有资源。
- 使用 HTTP/2、HTTP/3提升资源请求速度
- 资源请求合并,减少http请求
- 合理使用defer,async
- 首屏加载优化
- 对页面内容进行分片/分屏加载
- 懒加载:监听scroll事件;使用IntersectionObserver
- 首屏只加载需要的资源,对于不需要的资源不加载。
- 客户端离线包方案
- 客户端进行预请求和预加载
- 渲染过程优化:减少用户操作等待时间
- 按需加载
- 减少回流和重绘
- 减少/合并dom操作,减少浏览器的计算损耗
- 浏览器运算逻辑优化
- 拆解长任务,避免出现长时间计算导致页面卡顿
- 提前将计算结果缓存
- 关键渲染路径优化:关键渲染路径是指浏览器将HTML,CSS,JavaScript转换为屏幕上所呈现的实际像素这期间所经历的一系列步骤。
- CSS 的
<link>
标签放在<head></head>
之间 <script>
标签放在</body>
之前
- CSS 的
- 网络请求优化:减少网络资源的请求和加载耗时
- 页面静态化(SSR)
- 图片优化:选择合适的图片格式。
- HTML代码优化:
- 精简HTML代码:减少HTML的嵌套;减少DOM节点数;减少无语义代码;删除多余的空格、换行符、缩进等等
- 文件放在合适位置:CSS 样式文件链接尽量放在页面头部;JS 放在HTML底部
- CSS 代码优化:
- 提升文件加载性能:使用外链的 CSS;尽量避免使用 @import,@import影响css文件的加载速度
- 精简 CSS 代码:利用CSS继承减少代码量;避免使用复杂的选择器,层级越少越好
- 字体文件优化:
- 使用cdn加载字体文件
- 开启gzip压缩字体文件
- 通过font-display来调整加载顺序
- 字体裁剪,剔除不需要使用到的字体
- 内联字体
- JS 代码优化:
- 提升 JS 文件加载性能:JS 文件放在body 底部;合并js文件;合理使用defer和async
- JS 变量和函数优化:尽量使用 id 选择器;尽量避免使用 eval;js 函数尽可能保持整洁;使用节流、防抖函数;使用事件委托
- JS 动画优化:避免添加大量 js 动画;尽量使用 css3 动画;尽量使用 Canvas 动画;使用
requestAnimationFrame
代替settimeout
和setinterval
。
- webpack 打包优化
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 星Blog!