排查记录
近日遇见一个很奇怪的问题,某个第三方功能模块调起时,会导致整个页面卡顿。
观察其火焰图:
现象非常奇怪,调用栈也没有script在执行,纯idle时间。
经过后续观察,发现有个耗时很长的请求,请求时间和卡顿时间基本一致:
那请求为什么会阻塞整个进程呢?而且火焰图基本都是空闲时间...
后续又经过一番排查,发现了罪魁祸首-同步请求
因为默认是异步请求,所以平时还没注意到。而第三方的sdk开启了同步请求功能,至此导致请求的时候整个页面被卡顿。
反思
虽然问题定位解决了,但是又有新的问题:同步请求有啥用呢?看起来没有收益还会阻塞整个进程 = =。
根据MDN的说明,可以在worker中使用:
self.onmessage = function (oEvent) {
if (oEvent.data === "Hello") {
var oReq = new XMLHttpRequest();
oReq.open("GET", "myFile.txt", false); // 同步请求
oReq.send(null);
self.postMessage(oReq.responseText);
}
};
因为worker本身就是异步的,所以不会阻塞主进程。