react-devtool 消息处理渲染 源码理解
2024-08-31 05:13:14
react-devtools 有chrome插件版,但在chrome 插件下的通信调试不够透明,且chrome 的插件特别是开发工具界面几乎无法调试。 看到了react-devtools 也提供electron 版本的调试工具。 正好学习一下。
文件结构:
react-devtools-core/standalone.js : 渲染进程js
react-devtools/app.js:主进程js
react-devtools-core/src/backend.js: 提供网页加载的client.js。(解析__REACT_DEVTOOLS_GLOBAL_HOOK__ 钩子变量, 发送消息给websocket 服务器, 这里需要手动引入,插件版通过injectscript 注入)
standalone.js 起一个 websocket 服务 和http 服务。
建立连接后, reload 渲染面板。
function reload() {
ReactDOM.unmountComponentAtNode(node);
node.innerHTML = '';
setTimeout(() => {
panel = ReactDOM.render(<Panel {...config} />, node);
}, 100);
}
知识点:
requestIdleCallback:利用帧空闲时间来触发执行的函数。而且是一个低优先级的函数,如果帧一直没有空闲时间,那就一直不执行,除非时间过了设定的Timeout。
requestIdleCallback(myNonEssentialWork, { timeout: 2000 }); let tasks = {
length: 4
} function myNonEssentialWork (deadline) {
// 当回调函数是由于超时才得以执行的话,deadline.didTimeout为true
// deadline.timeRemaining() 获取每一帧还剩余的时间
while ((deadline.timeRemaining() > 0 || deadline.didTimeout) && tasks.length > 0) {
console.log('done', tasks, deadline.timeRemaining())
tasks.length = tasks.length - 1
}
if (tasks.length > 0) {
requestIdleCallback(myNonEssentialWork);
}
}
this._bridge._listeners:
{
'root': [null],
'mount': [null],
'update': [null],
'updateProfileTimes': [null],
'unmount': [null],
'setInspectEnabled': [null],
'inspectedHooks': [null],
'select': [null],
'storeSnapshot': [null],
'clearSnapshots': [null],
'capabilities': []
}
websocket: 心跳机制
最新文章
- CSharpGL(12)用T4模板生成CSSL及其renderer代码
- .NET基础架构方法—DataTableToExcel通用方法
- a byte of python (摘01)
- HDU1853 &; 蜜汁建图+KM模板
- Hardwood Species(水)
- android测试本地服务调试流程
- mysql net连接读取结果为乱码 Incorrect string value
- 再回首,Java温故知新(八):Java基础之字符串
- libeXosip2(2) -- General purpose API.
- TRS_WCM(拓尔思信息技术有限公司)内容协作平台平台置标经验攻略
- SpringMVC @SessionAttributes注解
- python提取xml属性导入Mysql
- SharePoint 已在此服务器场中安装 ID 为 XXXXXXXXX 的功能。请使用强制属性显式地重新安装此功能。解决方法
- Java开发面试题汇总整理
- CentOS查找目录或文件
- redis和memcache的区别(总结)
- bzoj4933: 妙
- jQuery-对标签元素 文本操作-属性操作-文档的操作
- Python 矩阵与矩阵以及矩阵与向量的乘法
- java.lang.NoSuchFieldError: TRACE