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);
});
}
}