当前位置: 首页 > 面试经验 >

百度前端暑期实习一二三面

优质
小牛编辑
95浏览
2023-04-20

百度前端暑期实习一二三面

已经过去半个多月啦,发现这篇文章还在草稿箱里,发出来供自己以后回顾学习

----------------分割线------------------------

三面真的是快把我打趴下了...压力太足了,全是底层原理+优化

如何防止H5中的Native通过JSBridge提供的接口被攻击者恶意调用?

这个问题在网上也找不到答案....评论区有懂哥讲讲吗

我自己的分析是本质是XSS攻击,用防御XSS攻击的方式。

vite和webpack区别?在开发模式和生产模式区别?

vite可以类比成webpack+webpack-dev-server,特点是:

  • 快速的冷启动
  • 即时的模块热更新(HMR)
  • 按需编译

vite会直接启动开发服务器,而webpack需要构建依赖图等等,将所有代码打包到一起,再放到开发服务器上运行。

主要区别在开发阶段,生产阶段的区别主要是Rollup和Webpack的区别

开发阶段

冷启动
  • Webpack:启动时执行webpack打包命令,将所有模块的依赖都打包到一起放到服务器上运行
  • Vite:快速冷启动,只启动一个开发服务器。遇到模块时作为单独的HTTP请求向开发服务器请求,开发服务器编译,加载相关依赖后返回
HMR
  • Webpack:重新编译被改动的模块的所有相关依赖模块
  • Vite:重新请求被改动的模块
生态
  • Webpack:生态更成熟,plugins更多
  • Vite:还比较年轻

生产阶段

  • Webpack:适合开发应用,对于CommonJS,AMD,ES Module语法都兼容
  • Rollup:适合开发类库,只支持ES Module

写一个禁用Object.assign()的plugin?

从来没写过webpack plugin,被问到直接蒙b。

下来自己学习了很多相关的概念和知识,从0到1写一个webpack plugin还挺有意思的,也加深了对plugin的认识。

自己写一个plugin,首先要满足一个框架:

  1. 是一个类
  2. 在apply方法下实现功能,apply方法接收第一个参数是compiler对象
class ObjectAssignPlugin {
    apply(compiler) {
        compiler.hooks.compilation.tap('ObjectAssignPlugin', (compilation) => {
            compilation.hooks.buildModule.tap('ObjectAssignPlugin', (module) => {
                // console.log(module)
                module.parser.hooks.call.for('Object.assign').tap('ObjectAssignPlugin', () => {
                    throw new Error(`Error: Object.assign is not allowed!`);
                });
            });
        });
    }
}
module.exports = ObjectAssignPlugin

其中使用compilation的buildModule钩子,以此介入编译过程,在parser遇到Object.assign方法时抛出错误。

小程序底层原理?

双线程架构

区别于传统Web的单线程模型,小程序中的渲染层和逻辑层分别由两个线程管理。渲染层-Webview,逻辑层-JSCore。所有的通信都要经过Native,包括网络请求。

逻辑层和视图层通过setData和Event通信:

逻辑层数据变更setData驱动渲染层的视图更新,渲染层交互触发事件,触发逻辑层的事件响应函数。

小程序中的JSBridge和普通的JSBridge有什么区别?

小程序中的JSBridge没有完整的浏览器环境,依赖客户端提供的环境

其他在网上真找不到答案...评论区各位大哥可以给点思路吗

首屏加载时间长如何解决?

SSR服务端渲染流程和原理?

优化题:用户在屏幕上微小的移动可能会触发click事件,不希望触发click,如何用mousemove事件替代click事件做优化?

磕磕绊绊说了,但面试官不知道为啥一直要说mousemove,再加上他之前问的问题真的很难,所以整个人都很紧张也很疲劳。

下来整理思路之后,我的做法是在mousedown触发时记录起始坐标和时间,mouseup触发时记录结束坐标和时间,并计算起始-结束距离和时间差。给距离和时间分别设定一个阈值,判断计算出的距离和时间差是否都小于对应阈值,若是则判断用户意图为点击,否则判断是拖动。(只看距离可能会出现用户拖了又回到原处,但仍会触发点击)

 类似资料: