拓冰建站拓冰建站
首页 / 资讯中心 / 正文

chrome-react-perf自定义Redux中间件深度剖析:如何向被测页面注入Perf.start()命令

chrome-react-perf自定义Redux中间件深度剖析如何向被测页面注入Perf.start()命令【免费下载链接】chrome-react-perfAn Operation Interface for react-addons-perf Package项目地址: https://gitcode.com/gh_mirrors/ch/chrome-react-perfchrome-react-perf 是一款 React 性能剖析 Chrome 扩展它的核心是一套自定义 Redux 中间件在 DevTools 面板点击 Start中间件就会向被测页面注入Perf.start()命令开始录制点击 Stop 后自动生成渲染性能报告。本文带你剖析这套中间件的实现原理与消息回传链路。chrome-react-perf 是什么React 性能剖析小助手普通开发者排查 React 性能问题时通常要手动在控制台执行Perf.start()、Perf.stop()再调用getWasted()等方法看数据过程繁琐且容易遗漏。chrome-react-perf 把这些操作封装进了 Chrome DevTools 的一个独立面板Perf 面板⚡ 一键 Start / Stop 录制停止时自动展示性能报告✅ 关闭 Perf 面板时自动停止录制不会污染页面 数据维度覆盖 wasted浪费的渲染、DOM、inclusive含子组件、exclusive独占四类指标它对被测页面只有一个前提页面必须把react-addons-perf暴露为全局变量window.Perf用 webpack 的 expose loader 或直接window.Perf Perf即可。一条 Action 如何驱动整个插件Redux 中间件设计传统 Redux 中间件拦截的是异步请求类action而这里拦截的是跨环境执行类action。中间件位于 app/middleware/perf-action/index.js它用一个 Symbol 作为标记export const PERF_ACTION Symbol(PERF_ACTION);所有特殊 action定义在 app/actions/index.js都不带常规的type而是携带一个[PERF_ACTION]载荷内含三种类型{ types: [XXX_REQUEST, XXX_SUCCESS, XXX_FAILURE] }中间件的处理流程非常清晰检查 action 是否带PERF_ACTION标记没有就原样放行next(action)判断类型属于injectedActions即 Start / Stop 录制走直接注入分支否则走消息中继分支先派发XXX_REQUEST更新 UI 状态比如按钮变成 Stop执行结果以 Promise 返回成功则派发XXX_SUCCESS并携带 response 数据失败则派发XXX_FAILURE这套REQUEST / SUCCESS / FAILURE 三段式 Promise的写法让异步的跨窗口执行被无缝纳入了 Redux 状态流。核心揭秘如何用 inspectedWindow.eval 注入 Perf.start()注入逻辑在 app/middleware/perf-action/inject.js 中核心就是一张命令映射表[ActionTypes.START_RECORD_REQUEST]: Perf.start(), [ActionTypes.STOP_RECORD_REQUEST]: Perf.stop(),真正的注入由 Chrome DevTools API 完成chrome.devtools.inspectedWindow.eval(command, callback)inspectedWindow.eval相当于在被测页面的 JS 环境里直接执行一段代码——中间件把Perf.start()这个字符串送进去页面里的window.Perf就开始收集渲染指标了。回调结果被包装成 PromiseisException为真则 reject页面没暴露 Perf 时就会走到这里否则 resolve。这就是如何向被测页面注入Perf.start()命令的答案Redux action → 中间件映射成命令字符串 → DevTools API 在页面上下文执行。数据回传链路从页面脚本到 DevTools 面板Stop 之后要读取getWasted()等数据就不能只用eval了跨窗口传大数据不可靠插件走了一条完整的消息中继链路DevTools 面板中间件passMessageapp/middleware/perf-action/message.js通过chrome.runtime.connect建立 Port向后台发送消息并用actionsRecorder队列暂存 Promise 的 resolve/reject等待响应后台 Event Pagechrome/extension/background/eventPage.js收到消息后根据 Port 找到对应 tabId用chrome.tabs.sendMessage转发到页面Content Scriptchrome/extension/content/contentScript.js在扩展与页面之间翻译消息——chrome.runtime.onMessage收到后window.postMessage给页面页面回复再chrome.runtime.sendMessage送回页面脚本chrome/extension/page/pageScript.js在页面上下文执行shapeMeasurements的getWasted() / getDOM() / getInclusive() / getExclusive()把结果postMessage回来数据原路返回后actionsRecorder中的 Promise 被 resolve中间件派发GET_PERF_DATA_SUCCESS面板就能渲染出报告了。整条链路用source: chrome-react-perf和sender字段做消息过滤避免无限循环派发——细节见 chrome/extension/content/contentLoader.js 的初始化握手。两个体验细节启动检测与自动清理Perf 就绪检测内容脚本被动态注入后chrome/extension/background/injectContent.js页面脚本会每 500ms 轮询一次window.Perf是否存在找到后通过detect-perf消息上报中间件再派发detectPerfaction 更新 UI。页面是懒加载 Perf 的场景也不会出错。关闭面板自动 Stop后台监听 Port 的onDisconnect事件检测到面板关闭且 Perf 曾就绪时向页面发送clean-up消息页面脚本随即调用window.Perf.stop()避免遗留的录制状态干扰页面。上手指南3 步让插件跑起来安装扩展从 Chrome 应用商店安装或在本仓库执行npm install后npm run build构建开发调试用npm run dev开启热重载暴露 Perf在 React 应用入口加入import expose?Perf!react-addons-perf或import Perf from react-addons-perf后赋值给window.Perf开始剖析打开 DevTools 的 Perf 面板点击 Start → 操作页面触发渲染 → 点击 Stop性能报告自动呈现小结chrome-react-perf 用一个精巧的自定义 Redux 中间件把向被测页面注入Perf.start()/Perf.stop()命令这件跨窗口、跨环境的脏活变成了纯粹的 action 派发简单命令走inspectedWindow.eval直接注入复杂数据走 Port 消息中继回传三段式 action 类型保证状态与 UI 始终一致。想研究 Chrome 扩展如何与 Redux 状态管理深度协作这套perf-action中间件app/middleware/perf-action/值得逐行阅读。【免费下载链接】chrome-react-perfAn Operation Interface for react-addons-perf Package项目地址: https://gitcode.com/gh_mirrors/ch/chrome-react-perf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门