微派社招前端一面面经

前言:工作 2 年,我写的不一定对,如有错误,望评论区大佬指正,共同成长

  1. 自我介绍
  2. 介绍完后,面试官深挖项目 5 分钟
  3. 项目中提到了性能优化,看的是哪个指标?
  4. 答:首屏耗时,业界衡量首屏性能一般有FCP(First Contenful Paint)、LCP(Largest Contentful Paint),公司内部用的是体感耗时,指的是从打开页面到 dom 不再变化的耗时。

  5. 如果让你来做,你怎么监听 dom 变化?
  6. (不知道,事后查了是 Mutation Observer)

  7. 除了首屏耗时,还有别的评价性能的指标吗?
  8. 答:FPS:帧率,每秒渲染的帧数,在简历写的 3D 项目中用的这个指标衡量性能

  9. 帧率怎么计算?
  10. 答:公司内部引擎暴露了一个生命周期函数,会在每一帧时调用,形参是当前帧的耗时,可以依据这个来算。我理解底层依赖的应该是 requestAnimationFrame。因为 requestAnimationFrame 会在浏览器渲染下一帧之前执行。

  11. 如果一个动画播放卡顿,应该如何解决?
  12. 答:用 Chrome 的 lighthouse 面板分析是哪些帧卡顿,看是不是因为在这段时间用开销巨大的 js 任务在执行。比如如果页面中有很多串行的异步请求,改成并行。

  13. 异步请求不会阻塞动画吧?
  14. 答:确实,我刚刚说错了,异步请求线程和 GUI 渲染线程是独立的,不影响,JS 线程才会阻塞 GUI 线程。如果有开销巨大的 js 任务,比如可能是遍历一个巨大的数组

  15. 如果是遍历巨大的数组,怎么样避免阻塞动画呢?
  16. 答:用 web worker 单独开一个线程执行这个任务。

  17. 如果遍历巨大的数组伴随 dom 操作,就没法用 worker 了,怎么办?
  18. 答:看这个数组里哪些项的遍历和可视区内的 dom 有关,就先执行这部分,其他部分等用户滑动页面,可视区 dom 变化了再执行其他任务。(事后看感觉这里就是在胡扯)

  19. 还有别的办法吗?想想 react ?(思考了半分钟,沉默中……)
  20. 看过源码吗?有了解过 react fiber 吗?
  21. 答:了解过,但这跟刚刚的问题好像没有关系诶

  22. 面试官:其实思想是一样的
  23. 答:react 会解析 jsx 生成 fiber 树,当需要更新时,reconciler 会构建新的 fiber 树,每个 fiber 节点保存了当前节点需要更新的 props 和更新的方式。然后将 rootFiberNode 指向这个新的 fiber 树。

  24. 你刚刚说的是 fiber 增量更新的原理,那 reconciler 在面对长任务时是怎么处理的呢?
  25. 答:reconciler 会把长任务拆分成多个子任务,每一帧作为一个时间切片,每个时间切片里默认预留 5ms 去渲染视图(这里事后复盘发现说错了,应该是预留 5ms 执行拆分出的子任务,直到所有子任务执行完)

  26. 面试官:所以刚刚说的长任务也可以分批处理,避免阻塞渲染
  27. (内心 OS: 三流前端学技术,二流前端学方法,一流前端学思想,面试官不愧是大佬)

  28. 简历上有提到缓存,那你说说 http 状态码 304 含义,什么情况下返回 304
  29. 答了协商缓存的过程

  30. Options 请求是什么
  31. 答:复杂请求(比如 PUT、DELETE 请求)跨域时会客户端先发起一个 options 预检请求,响应头里 access-control-allow-origin 如果包含请求方的域名,则表示可以跨域,接下来正式发起请求,否则直接在这一步被拦下,后续不再发起请求。

  32. WebGL渲染过程(因为简历写了解WebGL)
  33. 小程序分包加载时,各个包之间是如何避免命名冲突的?

(不知道,简历上提到了分包加载,但是没了解背后原理,是自己的问题)

以下是 ChatGPT 的回答:

小程序分包加载机制设计时,为了避免不同包之间的变量命名冲突,主要依靠以下几种策略:

  1. 模块化封装:每个分包内的代码应当遵循模块化编程的原则,使用ES6的import/export或者CommonJS的require/module.exports(取决于使用的开发环境和规范),将功能封装在模块内部。这样,只有通过明确的导入语句才能访问到其他模块或包中的变量,减少了全局作用域污染的风险。
  2. 命名空间或包名前缀:为每个分包内部的全局变量添加特定的前缀或使用命名空间(Namespace)模式,这样即便两个分包中有相同名字的变量,由于前缀或命名空间的不同,它们也是唯一的。
  3. 严格模式:在开发环境中启用严格模式(use strict),这有助于检测潜在的变量作用域问题,鼓励开发者遵循更安全的编码习惯。
  4. 编译时静态检查:使用TypeScript等静态类型检查工具,可以在编译阶段发现潜在的命名冲突问题。TypeScript通过定义模块和接口,可以在编译时就强制实施命名规则,减少运行时冲突的可能性。
  5. 分包隔离:小程序的分包机制本身设计为相对独立的空间。每个分包有自己的全局作用域,主包和分包之间、分包与分包之间不共享全局变量。因此,只要不在全局作用域定义变量,而是通过模块导入导出,就能有效避免冲突。
  6. 配置明确的依赖关系:在小程序的配置文件(如uni-app的pages.json)中明确指定各分包的依赖关系和入口,通过清晰的配置管理各个包的加载顺序和范围,进一步减少冲突可能。

最后:两个 easy 数组题

反问环节:问了面试官组内负责的业务

#前端面经#
全部评论
事后复盘:我理解小程序分包加载就类似于 webpack 的代码分割,按需加载
点赞 回复 分享
发布于 06-26 20:33 河南
过了吗,大佬
点赞 回复 分享
发布于 06-27 23:00 广东
好吉尔难,不过在公司在武汉工资很高
点赞 回复 分享
发布于 06-28 13:49 上海
微派有些岗位挂着刷绩效的,别去
点赞 回复 分享
发布于 06-30 19:57 广东

相关推荐

9.25问了一下HR,已挂。---------------9.19面的,又泡着了,发面经攒人品。八股盛宴,面试官的水平还是挺高的,而且有回应,体验很好。1. 个人项目现在有多少用户?2. 进程和线程区别3. 遇到死锁怎么解决?4. Java中实现多线程有哪些方式?5. 有哪几种线程池?6. 线程池比自己创建多线程有什么优势?7. 使用线程池就不会销毁线程了吗?8. 多进程通信有哪些通信方式?9. 安卓进程间的通信方式(Binder)10. Binder相比于Linux的进程通信方式有什么优势11. 线程之间的同步方式。12. synchronized的不同用法,锁的是类名.class和锁的是对象有什么区别。13. 垃圾回收算法。14. Java有垃圾回收机制,为什么还会出现内存泄漏?15. 安卓发生内存泄漏的情况(没答上来,面试官举了个例:把一个Activity的匿名内部类传递给其他Activity,匿名内部类是会引用到外部类的,之前的Activity销毁后,其引用还存在于内存中)。16. 看代码说输出(一个类,普通代码块、静态代码块、构造函数、静态成员方法、普通成员方法都有输出语句,分别调用静态成员方法和普通成员方法会输出什么)。17. 类加载流程、顺序。18. 看代码说输出:Integer a = 10;Integer b = 10;System.out.println(a==b);  // 输出trueInteger c = 1000;Integer d = 1000;System.out.println(c==d);  // 输出false(-127~128区间的数,Integer包装类不会生成新的对象,而是会从缓存取)19. 用到过哪些数据结构(ArrayList和HashMap)20. HashMap底层结构。21. HashMap的扩容过程(我忘记有个装填因子了,没提到,答的不好)。22. HashMap是线程安全的吗?23. 为什么ConcurrentHashMap不直接在添加元素的方法上加锁。24. ArrayList和LinkList插入元素的时间复杂度。25. LinkList插入的时间复杂度一定是O(1)吗?26. HTTP和HTTPS的主要区别。27. HTTP1.0和HTTP1.1的区别。28. TCP和UDP区别。29. IPv4和IPv6的区别。30. 做项目的过程会用到网络相关的东西吗?31. Activity启动模式。32. Activity启动流程。33. Handler原理。34. 消息队列阻塞之后又来了一个消息,它怎么知道这个消息来了呢?(不会,面试官说我可以看看nativePollOnce和nativeWake)。35. Jni中JavaVM 和 JNIEnv的关系。36. WPS热更新具体是怎么做的?(Json描述页面)37. 除了这种方式,还有其他的热更新方式你们有考虑过吗?38. 如果一个页面只改动一个TextView的一个属性,那还是会请求整个页面的Json吗?(会)39. 你觉得还有没有可优化的地方?40. Android默认的ImageView是一个方形的,如何实现一个自定义的圆角ImageView?41. 了解过音频的编解码吗?(自己的项目写了音频相关的,但是忘了)42. 音频为什么要编码?43. 平时如何学习的?44. 实习过程中遇到的最有挑战的问题?45. 算法:二维数组每行每列都按非严格递增排列,找target是否在里面。两个二分查找。
点赞 评论 收藏
分享
7 28 评论
分享
牛客网
牛客企业服务