Skip to main content

kuaishou

快手 1 面

  • 实现一个 div,高度屏幕一半,内容垂直水平居中

  • 浏览器渲染步骤过程,html 如何渲染出来的,具体步骤

  • 304 啥意思,http 文件修改时间具体是怎么样子的,last-modify 怎么保证各端时间一致,和 etag 有什么区别

  • px 转 rem 怎么实现,loader

  • 你在项目里做了哪些具体的性能优化

    • 通过是否支持 type="module",来判断是使用新的 js 还是兼容后的 js
    • 可视化区域渲染,减少渲染节点。
    • 通过拆包减少第一次加载速度,import,splitChunk
    • 静态资源通过 cdn,不打入 bundle,声明 external
    • 图片懒加载,http 升级 2.0。serverWork,拦截 http 请求
    • vue:
      • Object.freeze,冻结不需要改动的数据,减少劫持时间
    • react
      • hook 使用 React.memo,useMemo、useCallback 减少重复渲染
      • class 组件使用 pureComponent、shouldUpdateComponent 减少渲染
  • 你怎么实现一个 loader,把 px 转成 rem

  • 有效括号算法题

  • 函数柯里化+Object.defineProperty

快手 2 面

  • 你简单介绍一下你做过的项目

  • 有哪些做的比较好的地方

  • es6 模块,commonjs。改变内容实际运行结果

  • tree-shaking 怎么实现的

  • 你怎么带新人

  • 三个有序数组的合并,最优解

  • 实现一个类,限制接口并发

快手 3 面

  • puppeteer 怎么做优化,通过主进程创建浏览器对象,子进程获取浏览器
  • 子进程创建子页面,打开页面。
  • script、async、defer
  • 说说你觉得最有挑战的一个项目
  • 你觉得哪个项目技术挑战最大
  • 实现一个发布订阅模式
  • 打点系统怎么设计的
  • 为什么自己设计一套 cli,不使用 vue-cli
  • 浏览器详细渲染过程,渲染过程中有哪些可以优化的
function compose(...args) {
function mergeArr(arr1, arr2) {
let result = [];
let start1 = arr1.length - 1;
let start2 = arr2.length - 1;
while (start1 >= 0 && start2 >= 0) {
if (arr1[start1] >= arr2[start2]) {
result.push(arr1[start1]);
start1--;
} else {
result.push(arr2[start2]);
start2--;
}
}
if (start1 !== 0) result = result.concat(arr1);
if (start2 !== 0) result = result.concat(arr2);
return result;
}
let first = args.shift();
return args.reduce((pre, next) => {
return mergeArr(pre, next);
}, first);
}
  • 并发,加添加
class TaskManager {
constructor() {
this.stack = [];
this.task = [];
this.limit = 10;
}
addTask(promise) {
this.stack.push(promise);
return new Promise((resolve) => {
this.task.push((res) => {
resolve(res);
});
});
}

run() {
let run = (promise) => {
promise().then((res) => {
let callback = this.task.shift();
callback(res);
let nextPromise = this.stack.shift();
run(nextPromise);
});
};
this.stack.splice(0, this.limit + 1).forEach((promise) => {
run(promise);
});
}
}