React、Vue、Ember 及其他前端开发者,请暂缓更新到 Chrome 59 浏览器
昨天下午休息的时候,发现我工作用的 Mac Mini 在疯狂地散热中,打开 Activity Manger 发现是 Chrome 浏览器导致的,再打开 Chrome 的 Task Manager 发现是 Developer Tools,如下图所示:
Chrome Task Manager
内存正常,但是这个 CPU,有点夸张。
于是,我:
- 新起了一个用户进程,发现没有这个问题
- 把自用的浏览器插件都禁掉,发现正常
- 关了 Developer Tool,也发现不会出现这个情况
便怀疑是插件的问题,然后就手动地一个个开启,发现是 React Dev Tools 的问题。整理了一下触发这个问题的条件:
- Chrome 浏览器里安装了 React Dev Tool 插件
- 在 Tab 1 中打开了 Chrome 的 Developer tool
- 切换到 Tab 2,让 Tab 1 与 Dev Tool 在后台运行
随后,在 React Dev Tool 的 GitHub 上发现了相应的 issue:High CPU when tab is in background #739
而触发 Issue 的代码则是:
var loadCheckInterval = setInterval(function() { createPanelIfReactLoaded();}, 1000);
但是,这个文件从 2015 年后,就没有修改过了:
React DevTool main.js 修改时间
那么,问题就出现在 setInterva
方法里。
于是,自己我便提取了相关的插件:chrome-59-show-setinterval-issue-code
而在这个方法里,关键点是:
chrome.devtools.inspectedWindow.eval(`jQuery.fn.jquery`, function(pageHasReact, err) {});
后来,发现有相当多的插件会使用这样的方式,来对检测是否含相应的环境,如:
- Vue DevTools
- React Dev Tools
- Ember Inspector
- 等等
因为我没有 Windows 电脑,所以没有试过。在他们的代码里都有相似的 setInterval,如 const checkVueInterval =setInterval(createPanelIfHasVue,
1000)
然后 CPU 就~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
已向 Chrome 报 Bug 了。
因此
如果你最近用的 Chrome 59 也异常,请禁用 React、Vue、Ember 等开发者工具。
如果你最近用的 Chrome 59 也异常,请禁用 React、Vue、Ember 等开发者工具。
你呢,中招没?
- O API - REST APIs的替代品
- 【专业技术】从4行代码看右值引用
- 【专业技术】8大你不得不知的Android调试工具
- 数据刷新中的并行改进(二) (r5笔记第76天)
- Spring【AOP模块】就这么简单
- 【专业技术】如何写出优美的C 代码?
- StringUtils工具类常用方法
- 数据刷新中的并行改进(三) (r5笔记第79天)
- SSH【史上最详细整合】
- Github 项目推荐 | TensorFlow 项目模板架构最佳实践
- 两个死锁的实例 (r5笔记第90天)
- SSM【史上最详细整合】
- 终结 finalize()和垃圾回收(garbage collection)
- 代码+实战:TensorFlow Estimator of Deep CTR —— DeepFM/NFM/AFM/FNN/PNN
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 收割腾讯等十几个Offer后,揭秘进大厂的秘诀和Android技术面试题汇总!
- Flutter BLoC 异步通信、BlocBuilder的基本使用、BlocProvider的初探
- Android设备获取扫码枪扫描的内容与可能遇到的问题解决
- 3分钟短文:胆儿真肥!Laravel在命令行问用户要数据!
- 实战矿马:数据异常牵出的挖矿木马(.systemd-service.sh)
- leetcode之两个相同字符之间的最长子字符串
- 面试阿里被P8质问:ConcurrentHashMap真的线程安全吗?
- 腾讯云TKE-搭建prometheus监控(二)
- Qt音视频开发41-人脸识别嵌入式
- 浅析Android Studio 3.0 升级各种坑(推荐)
- Android EasyPermissions官方库高效处理权限相关教程
- 关于Android 6.0权限的动态适配详解
- 详解android 人脸检测你一定会遇到的坑
- Android实战RecyclerView头部尾部添加方法示例
- android实现多线程断点续传功能