WebSocket
- 轮询的缺点:
- WebSocket的特点:全双工/侧重实时通讯
答案:面试官:说说对WebSocket的理解?应用场景? | web前端面试 - 面试官系列 (vue3js.cn)
Three.js
- 基于WebGL,而WebGL是基于OpenGL的JavaScript API /库。
- 特点:
- 在线编辑
- 易学曲线
- 大型社区
- 用作多个WebGL游戏和图形引擎的基础
答案:如何看待 Three.js / WebGL 等前端 3D 技术? - 知乎 (zhihu.com)
DNS查询过程
面试官:DNS协议 是什么?说说DNS 完整的查询过程? | web前端面试 - 面试官系列 (vue3js.cn)
Node.js
特点:
非阻塞异步:
Nodejs
采用了非阻塞型I/O
机制,在做I/O
操作的时候不会造成任何的阻塞,当完成之后,以时间的形式通知执行操作。例如在执行了访问数据库的代码之后,将立即转而执行其后面的代码,把数据库返回结果的处理代码放在回调函数中,从而提高了程序的执行效率。
事件驱动:事件驱动就是当进来一个新的请求的时,请求将会被压入一个事件队列中,然后通过一个循环来检测队列中的事件状态变化,如果检测到有状态变化的事件,那么就执行该事件对应的处理代码,一般都是回调函数
例如读取一个文件,文件读取完毕后,就会触发对应的状态,然后通过对应的回调函数来进行处理
答案:面试官:说说你对Node.js 的理解?优缺点?应用场景? | web前端面试 - 面试官系列 (vue3js.cn)
jwt鉴权机制
在目前前后端分离的开发过程中,使用token
鉴权机制用于身份验证是最常见的方案,流程如下:
- 服务器当验证用户账号和密码正确的时候,给用户颁发一个令牌,这个令牌作为后续用户访问一些接口的凭证
- 后续访问会根据这个令牌判断用户时候有权限进行访问
token被分为三部分:
- 每个JWT都会带有头部信息,这里主要声明使用的算法。声明算法的字段名为
alg
,同时还有一个typ
的字段,默认JWT
即可。 - 载荷即消息体,这里会存放实际的内容,也就是
Token
的数据声明,例如用户的id
和name
,默认情况下也会携带令牌的签发时间iat
,通过还可以设置过期时间。 - 签名是对头部和载荷内容进行签名,一般情况,设置一个
secretKey
。
一旦前面两部分数据被篡改,只要服务器加密用的密钥没有泄露,得到的签名肯定和之前的签名不一致。
- 每个JWT都会带有头部信息,这里主要声明使用的算法。声明算法的字段名为
校验token
- secret 必须和 sign 时候保持一致
- 可以通过 unless 配置接口白名单,也就是哪些 URL 可以不用经过校验,像登陆/注册都可以不用校验
- 校验的中间件需要放在需要校验的路由前面,无法对前面的 URL 进行校验
答案:面试官:如何实现jwt鉴权机制?说说你的思路 | web前端面试 - 面试官系列 (vue3js.cn)
答案:面试官:Node性能如何进行监控以及优化? | web前端面试 - 面试官系列 (vue3js.cn)
Token以及登录鉴权
答案:Node.js中的登录鉴权 | QT-7274 (qblog.top)
tailwindCSS
1. 原子化 CSS (Atomic CSS)
CSS 原子化是指定义一组表示单一用途样式单元的类。
另外还有 CSS 组件化,了解两者可参考文章 「CSS 思维」组件化 VS 原子化 。
TailwindCss
将类名拆到了最小的单位,我们只需要用到一定数量的原子类,就能完成一个复杂的页面样式。这也是为啥使用 TailwindCss
的 tree-shake 后,压缩后的 css 体积可以降低到 10kb 以下的原因。
2. 较好的语义化
使用 TailwindCss
你不用花精力来定义类名,你可以使用内置具有良好语义化的类名,实现样式效果。你也可以一定程度定义符合你自己规则的类名,例如加上统一的前缀。
TailwindCss
语义化也并不完美,默认的命名方案有一定的记忆成本。在后面最佳实践,会具体谈谈这个问题,提供一些其他解决方案。
3. 约束性
使用 TailwindCss
功能类,是从预定义的设计系统中选择样式,这使得构建统一的 UI 变得更加容易。这也是 CSS 原子化与直接使用内联样式有着明显差异,TailwindCss
具有约束性。
4. 响应式
TailwindCss
中的每个功能类都可以有条件的应用于不同的断点(breakpoints),在不同分辨率设备上,可以轻松切换属性。内联样式中,无法使用媒体查询。
答案:TailwindCSS 基本介绍与最佳实践 - 知乎 (zhihu.com)
解决了哪些问题?
CSS类命名
样式冲突
样式冲突这个问题其实起因还要归结于 CSS 类命名。为了复用,我们在一个 class 上挂一些常用的规则,比如说:
.left { float: left }
模块复用
这个实现版本,对比第一版,有以下区别:
- 我们没有自定义任何的 css class,使用的所有的 css class 都直接来源于 Tailwind CSS,这样就没有了命名的困扰问题,同时也解决了 css 膨胀的问题。当然 html 体积也变大了,但是因为 class 中使用的是有限集合内的、高度重复的 class 名称,在 Gzip、Brotli 这些压缩算法的作用下,是可以基本忽略的。
- 每一个 class 一般只对应一条 css 规则,如 p-6 对应 padding: 1.5rem,h-12对应 height: 3rem,原子性的 class 颗粒度自然更容易在其他地方复用,而且原子化的 css 规范/思想,强制开发人员在为 html 标签定义样式时,写全所有需要的 class ,大大减少了不同 html 标签的 class 之间的相互影响。
- 「Atomic/Utility-First CSS」的使用,让样式重构/整体修改变得更加容易。我们可以通过覆盖原子颗粒度的 class ,变更应用的整体样式,例如,覆盖 text-xl 为 2rem,这样所以使用到 text-xl class 的字体大小都会变成 2rem。
答案:tailwindcss 面试题-掘金 (juejin.cn)
Echarts
- ECharts使用渲染器在不同的帧之间绘制图表,通过修改图表的数据来实现动画效果
- 通过调用setOption方法传入新的配置项,可以更新图表的数据和样式
底层原理
ECharts(Enterprise Charts)是一个基于JavaScript的开源可视化库,用于创建交互式的图表和数据可视化。
其底层原理主要涉及以下几个方面:
DOM操作:ECharts使用DOM来创建和管理图表元素。它利用DOM提供的API来动态生成图表的各个组件,并通过事件处理来实现交互性。
例如:它可能会创建一个
<div>
元素来作为图表的容器,然后在这个<div>
元素内部动态生成各种SVG或Canvas元素来表示图表的各个部分(如坐标轴、图例、数据点等)。此外,ECharts还会使用DOM提供的事件API(如
addEventListener
)来监听用户的交互操作(如点击、悬停等),并根据这些操作来更新图表的状态。Canvas绘图:ECharts在底层使用HTML5 Canvas进行图形绘制。Canvas提供了一种像素级别的绘图方式,ECharts利用Canvas API来绘制图表的各种图形元素,如线条、矩形、圆弧等。
例如:它可能会使用Canvas的
fillRect
方法来绘制柱状图的每一根柱子,或者使用arc
方法来绘制饼图的每一块扇形。由于Canvas的绘图操作是直接在像素级别进行的,因此它可以提供非常高的绘图性能和精细的视觉效果。数据驱动:ECharts采用数据驱动的方式来生成图表。用户需要提供数据源,ECharts会根据数据源进行数据处理和计算,然后将数据映射到相应的图表元素上,从而生成可视化结果。
具体来说,ECharts会先对数据源进行预处理(如排序、归一化等),然后将处理后的数据映射到图表的各个元素上(如将数据值映射为柱状图的高度,或将数据类别映射为饼图的颜色)。这种数据驱动的方式使得ECharts能够灵活地适应各种不同的数据源,同时也使得图表的更新变得非常简单和高效。
布局算法:ECharts内置了多种布局算法,用于自动计算和调整图表中各个组件的位置和大小,以适应不同的数据和容器尺寸。
例如,它可能会使用一种基于力导向的布局算法来计算散点图中每个点的位置,或者使用一种基于箱型图的布局算法来计算柱状图中每根柱子的宽度和间距。这些布局算法都是为了使得图表能够在不同的数据和容器尺寸下都能呈现出良好的视觉效果。
事件处理:ECharts支持丰富的交互功能,如点击、悬停、拖拽等。它通过事件系统来处理用户的交互操作,当用户与图表进行交互时,ECharts会触发相应的事件并执行相应的处理逻辑。
svg和canvas的对比,性能,潜在优劣
SVG和Canvas都是用于在Web上创建2D图形的技术,但它们有一些重要的区别:
- 图形类型:Canvas绘制的是位图,而SVG绘制的是矢量图。这意味着SVG图像可以无限放大而不失真,而Canvas绘制的图形在放大到一定程度后会变得模糊12。
- 渲染性能:Canvas的渲染速度通常比SVG快,特别是在处理大量图像和高度动态的图像时13。然而,SVG的内存占用更低,这对移动设备尤其重要3。
- 事件处理:SVG支持事件处理器,可以为图形元素添加交互效果12。而Canvas需要通过JavaScript手动处理事件,这可能会增加开发的复杂性12。
- DOM操作:SVG图像是DOM的一部分,可以使用DOM API进行操作12。而Canvas图像是在单独的画布上绘制的,不能直接通过DOM API进行操作12。
- CSS样式:SVG图像可以通过CSS进行样式控制,而Canvas图像的样式需要通过JavaScript API设置12。