← 返回目录

Webpack

第 97 / 154 卷日期:

}).then((res) => {

resolve(res.data)

}).catch(err => {

reject(err)

})

})

}

请求拦截器

在每个请求里加上token,统一处理维护方便

响应拦截器

在接收到响应后先做一层判断,比如状态码判断登录状态、授权

Webpack

再来一打Webpack面试题

Node

前端Node.js面试题

浏览器和网络

浏览器

浏览器概述

浏览器是一个多进程的架构,我们关心的是渲染进程(核心进程)。

为何使用多进程架构?

由于多个线程共享着相同的地址空间和资源,所以会存在线程之间有可能会恶意修改或者获取非授权数据等复杂的安全问题。

单进程浏览器:

1、不稳定。单进程中的插件、渲染线程崩溃导致整个浏览器崩溃。

2、不流畅。脚本(死循环)或插件会使浏览器卡顿。

3、不安全。插件和脚本可以获取到操作系统任意资源。

多进程浏览器:

2、解决不流畅。脚本阻塞当前页面渲染进程,不会影响到其他页面。

3、解决不安全。采用多进程架构使用沙箱。沙箱看成是操作系统给进程上来一把锁,沙箱的程序可以运行,但不能在硬盘上写入任何数据,也不能在敏感位置读取任何数据。

将渲染进程和OS隔离的这道墙就是安全沙箱。

作用:利用OS提供的安全技术,让渲染进程在执行过程中无法访问或修改OS中的数据,在渲染进程需要访问系统资源的时候,需通过浏览器内核实现,将访问结果通过IPC转发给渲染进程。

最小的保护单位是进程。单进程浏览器需要频繁访问或修改OS的数据,所以单进程浏览器无法被安全沙箱保护。

主要进程

浏览器是多进程的. 主要分为:

浏览器主进程

只有一个,控制页面的创建、销毁、网络资源管理、下载等, 同时提供存储等功能。

第三方插件进程

每一种类型的插件对应一个进程,仅当使用该插件时才创建。主要是负责插件的运行,因插件易崩溃,所以需要通过插件进程来隔离,以保证插件进程崩溃不会对浏览器和页面造成影响.

GPU进程

最多一个,用于3D绘制等,从浏览器进程中独立出来的。

浏览器渲染进程(浏览器内核)

每个Tab页对应一个进程,互不影响 , 核心任务是将HTML、CSS 和 JavaScript转换为可以与用户交互的网页。出于安全考虑,渲染进程都是运行在沙箱模式下。

网络进程

从浏览器进程中独立出来的, 主要负责页面的网络资源加载。

GUI 线程

负责渲染页面,解析 html、css;构建 DOM 树和渲染树;当界面需要重绘(Repaint)或由于某种操作引发回流 (reflow)时,该线程就会执行。在Javascript引擎运行脚本期间,GUI渲染线程都是处于挂起状态的,也就是说被”冻结”

了.

js 引擎线程

负责解析和执行 js 程序,我们经常听到的 chrome 的 v8 引擎就是跑在 js 引擎线程上的,其实语言没有单线程多线程之说,因为解释这个语言的是的线程是单线程;js 引擎线程与 gui 线程互斥,当浏览器执行 javaScript 程序的时

候,GUI 渲染线层会保存在一个队列当中;直到 js 程序执行完成,才会接着执行;如果 js 的执行时间过长,会影响页面的渲染不连贯,所有我们要尽量控制 js 的大小。

JS引擎线程和GUI渲染线程互斥!

为什么 setTimeout 不阻塞后面程序的运行,因为 setTimeout 不是由 js 引擎线程完成的,是由定时器触发线程完成的,所以它们可以同时进行,那么定时器触发线程在这定时任务完成之后会通知事件触发线程往任务队列里添加

事件。

事件触发线程

当一个事件被触发时该线程会把事件添加到待处理队列的队尾,等待JS引擎的处理。这些事件可以是当前执行的代码块如定时任务、也可来自浏览器内核的其他线程如鼠标点击、AJAX异步请求等,但由于JS的单线程关系所有这些

事件都得排队等待JS引擎处理。

异步 HTTP 请求线程

在XMLHttpRequest在连接后是通过浏览器新开一个线程请求,将检测到状态变更时,如果设置有回调函数,异步线程就产生状态变更事件放到 JavaScript引擎的处理队列中等待处理。

异步场景

  1. 定时器
  2. 网络请求
  3. 事件绑定
  4. ES6 Promise

定时器

执行调用栈的代码,栈中为空时去检查任务队列,这是一个循环检查的过程,等到事件触发线程往任务队列中添加了定时器事件,这时再去检查已经有了定时器的异步任务,取出放进执行栈执行。

带来问题

定时任务可能不会按时执行。

应用场景

  1. 防抖节流
  2. 倒计时
  3. 动画(丢帧问题)

内核

浏览器内核是通过取得页面内容、整理信息、计算和组合最终输出可视化图像结果(渲染引擎)

每一个tab页面可以看作是浏览器内核进程,浏览器内核是多线程的。

常见浏览器内核

Trident内核:IE,360,搜狗等浏览器

Gecko内核:Netscape6及以上版本,Firefox

Blink内核:Opera7及以上

Webkit内核:Safari,Chrome

全站分卷索引 · 154 卷
  1. 1代码随想录知识星球精华(最强八股文)第五版(前端篇))
  2. 2html语义化
  3. 3src 和 href 的区别
  4. 4link 与 @import 的区别
  5. 5iframe
  6. 6CSS
  7. 7伪元素和伪类
  8. 8block,inline,inline-block
  9. 9重排、重绘和合成
  10. 10盒子模型
  11. 11margin 合并
  12. 12margin和padding 的值为百分比时
  13. 13浮动
  14. 14定位
  15. 15CSS选择器
  16. 16CSS选择器优先级
  17. 17选择器权重Specificity
  18. 18CSS属性继承
  19. 19不可/可继承属性
  20. 20display: none与 visibility: hidden的区别
  21. 21background-size
  22. 22client、offset&scroll
  23. 23CSS3新特性
  24. 24flex布局
  25. 25常见布局
  26. 26三栏布局
  27. 27垂直居中
  28. 28水平垂直居中
  29. 29CSS画三角形
  30. 30使chrome支持12px以下文字
  31. 31响应式布局
  32. 32媒体查询
  33. 33过渡与动画
  34. 34JavaScript 动画 和 CSS动画
  35. 35SCSS
  36. 36CSS性能优化
  37. 37有哪些数据类型
  38. 38判断数据类型
  39. 39类型转换
  40. 40parseInt&parseFloat
  41. 41浮点数求和步骤
  42. 42十进制小数转二进制
  43. 430.1+0.2 为什么不等于 0.3
  44. 44undefined 和 undeclared 的区别
  45. 45JavaScript NaN 属性
  46. 46isFinite()&isNaN()
  47. 47数组
  48. 48对原数组有影响
  49. 49对原数组无影响
  50. 50数组去重
  51. 51数组拍平
  52. 52ES6新增的数组方法
  53. 53判断是否存在某个值
  54. 54arguments为啥不是数组
  55. 55对象
  56. 56遍历对象的方法
  57. 57判断对象是否具有属性
  58. 58for in 和 for of 的区别
  59. 59继承方式
  60. 60instanceof
  61. 61深浅拷贝
  62. 62freeze属性
  63. 63函数
  64. 64函数柯里化
  65. 65函数的 length
  66. 66箭头函数和普通函数区别
  67. 67构造函数
  68. 68执行上下文
  69. 69作用域
  70. 70作用域和作用域链
  71. 71闭包和内存泄漏
  72. 72this
  73. 73关于 this 的指向问题
  74. 74改变this指向的方法(bind / call / apply)
  75. 75字符串
  76. 76DOM和事件
  77. 77哪些事件支持冒泡
  78. 78阻止冒泡
  79. 79HTMLCollection、NodeList
  80. 80dom.onclick 和 dom.addEventListener的区别
  81. 81e.target和e.currentTarget
  82. 82页面生命周期
  83. 83异步
  84. 84内存管理GC
  85. 85其它
  86. 86JavaScript 中日期时间格式转换
  87. 87input和object实现双向绑定
  88. 88JSON.stringify()
  89. 89escape、encodeURI&encodeURIComponent
  90. 90移动端滚动穿透和溢出
  91. 91ES6
  92. 92Map字典
  93. 93... 与rest
  94. 94proxy
  95. 95模块化
  96. 96Ajax、Fetch和Axios
  97. 97Webpack
  98. 98浏览器:事件循环
  99. 99浏览器内核
  100. 100浏览器同源策略
  101. 101输入URL回车后发生了什么
  102. 102HTTP
  103. 103HTTP 2.0
  104. 104浏览器存储
  105. 105鉴权
  106. 106Webstorage
  107. 107浏览器执行机制
  108. 108AST 抽象语法树
  109. 109性能优化
  110. 110CSS
  111. 111网络相关
  112. 112使用HTTP2.0
  113. 113图片
  114. 114CDN图片
  115. 115其他文件优化
  116. 116降低APP首页开屏渲染时间
  117. 117页面白屏
  118. 118HTTPS中间人攻击
  119. 119Web Worker
  120. 120Service Worker
  121. 121微前端
  122. 122Vue
  123. 123v-show 和 v-if 的区别
  124. 124双向数据绑定的原理
  125. 125Vue中的插槽使用
  126. 126Vue中的key
  127. 127Vue过滤器
  128. 128Vue中Scoped原理
  129. 129Vue中$nextTick的使用
  130. 130Vue中实现组件通信的方式
  131. 131Vue-router
  132. 132Vue路由传参
  133. 133前端路由
  134. 134Vuex
  135. 135虚拟DOM
  136. 136DIFF 算法
  137. 137Vue3和Vue2有哪些区别
  138. 138说一说你对React的理解
  139. 139React事件机制
  140. 140说一说你对react refs的理解
  141. 141react中key的作用
  142. 142组件开发
  143. 143有状态组件和无状态组件
  144. 144函数式组件和类组件的区别
  145. 145PureComponent&Component
  146. 146常见 Hooks
  147. 147状态管理
  148. 148redux toolkit
  149. 149React18新特性
  150. 150client中的createRoot取代以前的ReactDOM.render
  151. 151Suspense
  152. 152新的Hooks
  153. 153VDom一定更快吗
  154. 154Fiber