# 中等

# 1、webpack优化手段

# 时间

  • 缩减范围
  • 缓存副本
  • 定向搜索
  • 提前构建
  • 并行构建
  • 可视结构

# 体积

  • 分割代码
  • 摇树优化
  • 动态垫片
  • 按需加载
  • 作用提升
  • 资源压缩

# 2、CSS怎么开启硬件加速

  • transform:translateZ(0)/translate3d(0,0,0)
  • will-change: opacity、transform、top、left、bottom、right;

# 渲染引擎为哪些特定节点创建新的图层呢?

  • 第一点:拥有层叠上下文属性的元素会被提升为单独的一层。
  • 第二点:需要裁剪(clip)的地方也会被创建为图层。

# 3、常见的设计模式

  • 工厂模式
  • 单例模式
  • 发布订阅/观察者模式
  • 装饰器模式

# 4、缓存策略

存储图像、网页等资源主要缓存在disk cache,操作系统缓存文件大部分都放在memory cache中。 具体浏览器会自动分配,看谁的资源利用率不高就分配给谁。

查找顺序

service-worker -> memory-cache ->Disk cache -> Push cache;

# 强缓存

  • max-age
  • expires

# 协商缓存

  • Etag/if-none-Match
  • last-modified/if-modified-since

cache-control:

  • no-store
  • no-cache
  • public/private
  • s-max-age

# 刷新对缓存影响

  • ctrl+F5 强制刷新,直接从服务器加载,跳过强缓存和协商缓存
  • f5刷新,会跳过强缓存,但是会检查协商缓存
  • 浏览器地址中写入url,回车,会依次强缓存-协商缓存去查。

# 5、https加密过程

# 客户端怎么验证数字证书

  1. 首先浏览器读取证书中的证书所有者、有效期等信息进行一一校验。
  2. 浏览器开始查找操作系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的颁发者CA比对,用于校验证书是否 为合法机构颁发
  3. 如果找不到,浏览器就会报错,说明服务器发来的证书是不可信任的,如果找到,那么浏览器就会从操作系统中取出颁发者CA的 公钥,然后对服务器发来的证书里面的签名进行揭秘。
  4. 浏览器使用相同的hash算法根据证书内容计算出信息摘要,将这个计算的值与证书解密的值做对比
  5. 对比结果一致,则证明服务器发来的证书的合法,没有被冒充。此时浏览器就可以读取证书中的公钥,用于后续加密。

# 6、flex:1由哪些属性组成

由flex-grow、flex-shrink、flex-basis三个属性的所写。

# flex-grow: 定义项目放大的比例

默认为0,即使存在剩余空间,也不会放大;

所有项目的flex-grow为1:等分剩余空间(自动放大占位);

flex-grow为n的项目,占据的空间(放大的比例)是flex-grow为1的n位。

# flex-shrink: 定义项目缩小的比例/

默认为1;即:如果空间不足,该项目则缩小;

所有项目的flex-shrink为1:当空间不足时,缩小的比例相同。

flex-shrink为0:空间不足时,该项目不会缩小。

flex-shrink为n的项目,空间不足时缩小的比例是flex-shrink为1的n倍。

# flex-basis:定义再分配多余空间之前,项目占据的主轴空间(main size),浏览器根据此属性计算主轴是否有多余空间。

默认值为auto,即项目原本大小。

设置后项目将占据固定空间。

# 7、304是什么意思,一般什么场景出现,命中强缓存返回什么状态码

304表示命中协商缓存。

  • 请求头last-modified的日期与响应头的last-modified一致
  • 请求头if-none-match的hash与响应头的etag一致 这两种情况会返回Status Code: 304

强缓存命中,状态码为200

# 8、pushState、replaceState可以触发popState嘛。

答案是:不能。

仅改变网址,页面不会真的跳转,也不会获取新的内容,本质上网页还停留在原页面上。

history.go()、back()、forWard()会触发popState

# 9、tree-shaking是什么,原理是什么?

tree-shaking是删除重复代码和未引用的代码一种手段。

原理:利用ESModule引入的静态分析,故而编译的时候正确判断到底加载了哪些模块。

静态分析程序流,判断哪些模块和变量未被使用或者引用,进而删除对应代码。

# commonJS和ES Module的区别

  • commonJS是值的一个拷贝,ES Module是值的一个引用
  • CommonJS是运行是加载,ES Module是编译时输出接口
  • commonJS是单个值的导出(一个对象),ES Module可以导出多个
  • commonJS是动态语法可以写在判断中,ES Module只能写在顶层模块。
  • CommonJs的this是当前模块,ES Module的this是undefined。

# 10、babel是什么

babel,是一个JS编译器,它可以让开发者在开发过程中使用各类方言(jsx、flow、ts)而无需担心它的运行环境,因为它可以 按需转换为低版本兼容的代码。

@babel/core

@babel/parser

@babel/traverse

@babel/generator

# 11、原型链判断

Object.prototype.__proto__; // null
Function.prototype.__proto__; // Object.protoType
Object.__proto__; // Funtion.protoType
Object instanceof Function; // true
Function instanceof Object; // true
Function.prototype === Function.__proto__; // true

# 12、 RAF、RIC

requestAnimationFrame: 告诉浏览器在下次重绘之前执行传入的回调函数(通常是操纵 dom,更新动画的函数); 由于是每帧执行一次,那结果就是每秒的执行次数与浏览器屏幕刷新次数一样,通常是每秒 60 次。

requestIdleCallback:会在浏览器空闲时间执行回调,也就是允许开发人员在主时间循环中执行低优先级任务,而不影响一些 延迟关键事件。如果有多个回调,会按照先进先出原则执行,但是当传入了timeout,为了避免超时,有可能会打乱这个顺序。

Last Updated: 5/22/2022, 4:58:55 PM