米哈游
Questions
参考链接: 米哈游校招前端一面|牛客
自我介绍
面试官您好,我叫 XXX。
用过哪些 LESS/SCSS 特性?
- 变量
- 嵌套(Nesting)+
&
连接父级选择器/命名 - 混合 (Mixins)(撰写 Element Plus 公共样式)
- 函数 @function(撰写 Element Plus 公共函数,生成固定命名空间及 BFC 格式的变量名等)
- 默认提供的通用函数(如颜色函数等)
- 运算
- 导入(譬如 SCSS 官方推荐使用
@use
替代@import
实现模块功能和避免重复引入等问题)
SCSS
我在个人项目中和 Element Plus 中大量使用 SCSS 及其相关特性。
- 在 packages/theme-chalk | Element Plus 中使用 SCSS 负责维护并修复组件样式,并使用 SCSS 变量与 CSS 变量重构变量系统实现了暗黑主题切换的功能。
- 在 element-theme-ink 项目中使用 SCSS 重写过几乎所有的 Element UI SCSS 样式。
LESS
在工作中我们统一使用 LESS。 我使用其开发过蚂蚁森林五周年(千万UV)、蚂蚁庄园及其相关活动(五周年),对使用 LESS 进行适配兼容也有一定经验。
譬如利用 LESS 变量计算比例,适配 iPhone X 刘海屏等。
此外,我还习惯使用 TailwindCSS/UnoCSS 来快速添加原子化 CSS。
移动端的响应式方案有哪些(说了媒体查询),rem是什么意思?
介绍一下盒模型 垂直居中有哪些方法? BFC有什么用?BFC化有哪一些方法?
JS有哪些类型? JS中哪些是浅拷贝,那些是深拷贝?(答错了orz) typeof和instanceof有哪些区别(typeof又说错了一些东西) 原型链是什么?除了原型链继承还有什么样的继承方案? TS用过哪些特性? 如何合并多个异步请求错误?(回答的是Promise.all) 事件循环是什么?宏任务和微任务是什么?
事件循环是什么?宏任务和微任务是什么?
虚拟DOM有什么样的作用? Vue的响应式原理 Vue和React Component都有哪些生命周期? Vue slot父子组件如何传值? React有哪些hooks,分别有什么作用?
webpack有什么样的作用?还有什么其他的打包工具吗? webpack有哪些特性(答了babel, loader, plugin等等) 跨域通信有什么样的解决办法?说一下CORS的具体原理 浏览器从输入地址到生成页面是一个什么样的过程?什么时候会使用缓存? 介绍一下OAuth和token 如何实现一个上传图片的功能
介绍一下自己做过的一个项目及其难点
说说浏览器缓存,如果命中强缓存返回的状态码是多少
浏览器缓存(Brower Caching)是浏览器对之前请求过的文件进行缓存,以便下一次访问时重复使用,节省带宽,提高访问速度,降低服务器压力。
请求标头 根据HTTP 1.1 协议,请求头名称不区分大小写。 例如,
Content-Type
和content-type
是一样的。
浏览器缓存
通常浏览器缓存策略分为两种:强缓存和协商缓存
- 强缓存:浏览器不会向服务器发送请求,从本地缓存中读取文件并返回 「Status Code: 200 OK」。
- 协商缓存:向服务器发送请求,服务器根据该请求 Request Header 参数判断是否命中协商缓存,若命中,则返回 304 状态码与新的 Response Header 告知浏览器从缓存中读取资源。
基本原理
- 浏览器在加载资源时,根据请求头的
Expires
和Cache-Control
判断是否命中强缓存,是则直接从缓存读取资源,不会发请求到服务器。 - 如果没有命中强缓存,浏览器一定会发送一个请求到服务器,通过
Last-Modified
和ETag
验证资源是否命中协商缓存,如果命中,服务器会将这个请求返回,但是不会返回这个资源的数据,依然是从缓存中读取资源 - 如果前面两者都没有命中,直接从服务器加载资源
2、相同点 如果命中,都是从客户端缓存中加载资源,而不是从服务器加载资源数据;
3、不同点 强缓存不发请求到服务器,协商缓存会发请求到服务器。
Cache-Control
—— 请求服务器之前Expires
—— 请求服务器之前If-None-Match
(Etag) —— 请求服务器If-Modified-Since
(Last-Modified) —— 请求服务器
Expires
Expires
是 HTTP1.0 提出的一个表示资源过期时间的 Header,它描述的是一个绝对时间,由服务器返回。 Expires
受限于本地时间,如果修改了本地时间,可能会造成缓存失效。
Cache-Control
Cache-Control
出现于 HTTP / 1.1,优先级高于 Expires
,表示的是相对时间。
no-cache
在发布缓存副本之前,强制要求缓存把请求提交给原始服务器进行验证 (协商缓存验证)。no-store
缓存不应存储有关客户端请求或服务器响应的任何内容,即不使用任何缓存。public
表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存,即使是通常不可缓存的内容。(例如:1.该响应没有max-age
指令或Expires
消息头;2. 该响应对应的请求方法是POST
。)private
表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)。私有缓存可以缓存响应内容,比如:对应用户的本地浏览器。
max-age=<seconds>
设置缓存存储的最大周期,超过这个时间缓存被认为过期 (单位秒)。与Expires相反,时间是相对于请求的时间。
ETag/If-None-Match
Last-Modified
表示本地文件最后修改日期,浏览器会在 Request Header 中加上If-Modified-Since
(上次返回的 Last-Modified 值),询问服务器在该日期后资源是否有更新,有则将新资源发送回来。
ETag
响应标头的值是服务器生成的任意值。服务器对于生成值没有任何限制,因此服务器可以根据他们选择的任何方式自由设置值——例如主体内容的哈希或版本号。
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1024
Date: Tue, 22 Feb 2022 22:22:22 GMT
ETag: "deadbeef"
Cache-Control: max-age=3600
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1024
Date: Tue, 22 Feb 2022 22:22:22 GMT
ETag: "deadbeef"
Cache-Control: max-age=3600
如果该响应是陈旧的,则客户端获取缓存响应的 ETag
响应标头的值,并将其放入 If-None-Match
请求标头中,以询问服务器资源是否已被修改:
GET /index.html HTTP/1.1
Host: example.com
Accept: text/html
If-None-Match: "deadbeef"
GET /index.html HTTP/1.1
Host: example.com
Accept: text/html
If-None-Match: "deadbeef"
如果服务器为请求的资源确定的 ETag
标头的值与请求中的 If-None-Match
值相同,则服务器将返回 304 Not Modified
。
但是,如果服务器确定请求的资源现在应该具有不同的 ETag
值,则服务器将其改为 200 OK
和资源的最新版本进行响应。
TIP
备注: 在评估如何使用 ETag
和 Last-Modified
时,请考虑以下几点:在缓存重新验证期间,如果 ETag
和 Last-Modified
都存在,则 ETag
优先。因此,如果你只考虑缓存,你可能会认为 Last-Modified
是不必要的。然而,Last-Modified
不仅仅对缓存有用;相反,它是一个标准的 HTTP 标头,内容管理 (CMS) 系统也使用它来显示上次修改时间,由爬虫调整爬取频率,以及用于其他各种目的。所以考虑到整个 HTTP 生态系统,最好同时提供 ETag
和 Last-Modified
。
200
强缓存Expires
/Cache-Control
失效时,返回新的资源。200 (from cache)
强缓存Expires
/Cache-Control
有效时,Cache-Control
优先于Expires
时,返回本地缓存的资源。200 (from disk cache)
200 (from memory cache)
304 (Not Modified)
: 协商缓存Last-modified
/ETag
没有过期时,服务端返回状态码304
。
3、静态资源能判断CDN缓存么? 4、css相关:如果父元素有with,heigh,position为相对定位,子元素为绝对定位(没with,height),此时子元素的with,height为多少,如果子元素有top和left,那子元素的with,height又是多少 5、Flex: 1 代表什么意思 6、JS判断类型的方式,挨个说原理 7、Object.prototype.toString.call()判断 Class A返回的是什么?我能改变他的返回类型么?(涉及到Object.prototype.toString.call的判断原理) 8、说下EnventLoop,微任务全部是异步的么? async是微任务么,你怎么理解的? 微任务都是异步的么你怎么理解的 9、React父子组件通信 10、说下发布订阅的实现,如果我要取消我的订阅怎么取消呢? 11、说下什么情况下使用context这种通信方式 12、说下React原理你理解多少,讲讲Diff算法,React调度机制的优先级是怎么样的? 13、Hook你知道多少,useMemo和useCallBack说说呢? 14、如果我在条件语句后面使用useState会有问题么,比如这个条件语句会进行return? 15、Flutter中的final和const的区别是什么,Flutter实现一个有宽高的自适应布局 16、防抖节流说说呢 17、说说内存泄漏有哪几种情况 18、反问