feat: add react-scan integration for performance monitoring

This commit is contained in:
suyao 2026-01-05 22:36:30 +08:00
parent 64213aad6d
commit bf2cfb5780
No known key found for this signature in database
8 changed files with 286 additions and 26 deletions

View File

@ -27,6 +27,7 @@
"scripts": {
"start": "electron-vite preview",
"dev": "dotenv electron-vite dev",
"dev:react-scan": "dotenv -- cross-env RENDERER_VITE_REACT_SCAN=true electron-vite dev",
"dev:watch": "dotenv electron-vite dev -- -w",
"debug": "electron-vite -- --inspect --sourcemap --remote-debugging-port=9222",
"build": "npm run typecheck && electron-vite build",
@ -337,6 +338,7 @@
"react-redux": "^9.1.2",
"react-router": "6",
"react-router-dom": "6",
"react-scan": "^0.4.3",
"react-spinners": "^0.14.1",
"react-transition-group": "^4.4.5",
"redux": "^5.0.1",

View File

@ -0,0 +1,18 @@
import type { Options } from 'react-scan'
/**
* React-Scan configuration for development performance monitoring
* Enable via: yarn dev:react-scan
* @see https://react-scan.million.dev/
*/
export const reactScanConfig: Options = {
enabled: true,
log: false,
showToolbar: true,
animationSpeed: 'fast',
trackUnnecessaryRenders: true,
showFPS: true,
showNotificationCount: true,
allowInIframe: false,
_debug: false
}

View File

@ -1,3 +1,10 @@
import { reactScanConfig } from '@renderer/config/reactScan.config'
import { scan } from 'react-scan'
if (import.meta.env.RENDERER_VITE_REACT_SCAN === 'true') {
scan(reactScanConfig)
}
import './assets/styles/index.css'
import './assets/styles/tailwind.css'
import '@ant-design/v5-patch-for-react-19'

View File

@ -1,3 +1,11 @@
// Initialize react-scan for performance monitoring (enable via: yarn dev:react-scan)
import { reactScanConfig } from '@renderer/config/reactScan.config'
import { scan } from 'react-scan'
if (import.meta.env.RENDERER_VITE_REACT_SCAN === 'true') {
scan(reactScanConfig)
}
import i18n from '@renderer/i18n'
import { useEffect, useState } from 'react'
import { createRoot } from 'react-dom/client'

View File

@ -1,3 +1,10 @@
import { reactScanConfig } from '@renderer/config/reactScan.config'
import { scan } from 'react-scan'
if (import.meta.env.RENDERER_VITE_REACT_SCAN === 'true') {
scan(reactScanConfig)
}
import '@renderer/assets/styles/index.css'
import '@renderer/assets/styles/tailwind.css'
import '@ant-design/v5-patch-for-react-19'

View File

@ -1,3 +1,11 @@
// Initialize react-scan for performance monitoring (enable via: yarn dev:react-scan)
import { reactScanConfig } from '@renderer/config/reactScan.config'
import { scan } from 'react-scan'
if (import.meta.env.RENDERER_VITE_REACT_SCAN === 'true') {
scan(reactScanConfig)
}
import '@renderer/assets/styles/index.css'
import '@renderer/assets/styles/tailwind.css'
import '@ant-design/v5-patch-for-react-19'

View File

@ -1,3 +1,10 @@
import { reactScanConfig } from '@renderer/config/reactScan.config'
import { scan } from 'react-scan'
if (import.meta.env.RENDERER_VITE_REACT_SCAN === 'true') {
scan(reactScanConfig)
}
import '@ant-design/v5-patch-for-react-19'
import { loggerService } from '@logger'

255
yarn.lock
View File

@ -1524,7 +1524,7 @@ __metadata:
languageName: node
linkType: hard
"@babel/core@npm:^7.28.4":
"@babel/core@npm:^7.26.0, @babel/core@npm:^7.28.4":
version: 7.28.5
resolution: "@babel/core@npm:7.28.5"
dependencies:
@ -1547,6 +1547,19 @@ __metadata:
languageName: node
linkType: hard
"@babel/generator@npm:^7.26.2, @babel/generator@npm:^7.28.5":
version: 7.28.5
resolution: "@babel/generator@npm:7.28.5"
dependencies:
"@babel/parser": "npm:^7.28.5"
"@babel/types": "npm:^7.28.5"
"@jridgewell/gen-mapping": "npm:^0.3.12"
"@jridgewell/trace-mapping": "npm:^0.3.28"
jsesc: "npm:^3.0.2"
checksum: 10c0/9f219fe1d5431b6919f1a5c60db8d5d34fe546c0d8f5a8511b32f847569234ffc8032beb9e7404649a143f54e15224ecb53a3d11b6bb85c3203e573d91fca752
languageName: node
linkType: hard
"@babel/generator@npm:^7.28.0":
version: 7.28.0
resolution: "@babel/generator@npm:7.28.0"
@ -1560,19 +1573,6 @@ __metadata:
languageName: node
linkType: hard
"@babel/generator@npm:^7.28.5":
version: 7.28.5
resolution: "@babel/generator@npm:7.28.5"
dependencies:
"@babel/parser": "npm:^7.28.5"
"@babel/types": "npm:^7.28.5"
"@jridgewell/gen-mapping": "npm:^0.3.12"
"@jridgewell/trace-mapping": "npm:^0.3.28"
jsesc: "npm:^3.0.2"
checksum: 10c0/9f219fe1d5431b6919f1a5c60db8d5d34fe546c0d8f5a8511b32f847569234ffc8032beb9e7404649a143f54e15224ecb53a3d11b6bb85c3203e573d91fca752
languageName: node
linkType: hard
"@babel/helper-compilation-targets@npm:^7.27.2":
version: 7.27.2
resolution: "@babel/helper-compilation-targets@npm:7.27.2"
@ -1766,6 +1766,16 @@ __metadata:
languageName: node
linkType: hard
"@babel/types@npm:^7.26.0, @babel/types@npm:^7.28.4, @babel/types@npm:^7.28.5":
version: 7.28.5
resolution: "@babel/types@npm:7.28.5"
dependencies:
"@babel/helper-string-parser": "npm:^7.27.1"
"@babel/helper-validator-identifier": "npm:^7.28.5"
checksum: 10c0/a5a483d2100befbf125793640dec26b90b95fd233a94c19573325898a5ce1e52cdfa96e495c7dcc31b5eca5b66ce3e6d4a0f5a4a62daec271455959f208ab08a
languageName: node
linkType: hard
"@babel/types@npm:^7.28.1, @babel/types@npm:^7.28.2":
version: 7.28.2
resolution: "@babel/types@npm:7.28.2"
@ -1776,16 +1786,6 @@ __metadata:
languageName: node
linkType: hard
"@babel/types@npm:^7.28.4, @babel/types@npm:^7.28.5":
version: 7.28.5
resolution: "@babel/types@npm:7.28.5"
dependencies:
"@babel/helper-string-parser": "npm:^7.27.1"
"@babel/helper-validator-identifier": "npm:^7.28.5"
checksum: 10c0/a5a483d2100befbf125793640dec26b90b95fd233a94c19573325898a5ce1e52cdfa96e495c7dcc31b5eca5b66ce3e6d4a0f5a4a62daec271455959f208ab08a
languageName: node
linkType: hard
"@bcoe/v8-coverage@npm:^1.0.2":
version: 1.0.2
resolution: "@bcoe/v8-coverage@npm:1.0.2"
@ -2238,6 +2238,27 @@ __metadata:
languageName: node
linkType: hard
"@clack/core@npm:0.3.5, @clack/core@npm:^0.3.5":
version: 0.3.5
resolution: "@clack/core@npm:0.3.5"
dependencies:
picocolors: "npm:^1.0.0"
sisteransi: "npm:^1.0.5"
checksum: 10c0/b1037226b38696bd95e09beef789ff4e23abb282505ac233c0316c2410c8afb68cf91b67812c883f05ffa6943d6f0593f1ebc17beb94f4a42c13e4657f598c0b
languageName: node
linkType: hard
"@clack/prompts@npm:^0.8.2":
version: 0.8.2
resolution: "@clack/prompts@npm:0.8.2"
dependencies:
"@clack/core": "npm:0.3.5"
picocolors: "npm:^1.0.0"
sisteransi: "npm:^1.0.5"
checksum: 10c0/7ac6e7e0fba1c958847e6e3ef9415d9c2184fb424b31691aaef64fd06042d243e859c157b941ca1c9f73e9cb649413fab487a602b981e300acfbec4a111d7562
languageName: node
linkType: hard
"@codemirror/autocomplete@npm:^6.0.0, @codemirror/autocomplete@npm:^6.3.2, @codemirror/autocomplete@npm:^6.7.1":
version: 6.18.6
resolution: "@codemirror/autocomplete@npm:6.18.6"
@ -5559,6 +5580,16 @@ __metadata:
languageName: node
linkType: hard
"@pivanov/utils@npm:0.0.2":
version: 0.0.2
resolution: "@pivanov/utils@npm:0.0.2"
peerDependencies:
react: ">=18"
react-dom: ">=18"
checksum: 10c0/3baeb1496c49d96d94e9744c456f0de0dd42958342d87376722d60c37ca3da71e786d3c96540b9a33bc2a9dc2cf6407b06b43f47e460fb7fa575ec4a628077fd
languageName: node
linkType: hard
"@pkgjs/parseargs@npm:^0.11.0":
version: 0.11.0
resolution: "@pkgjs/parseargs@npm:0.11.0"
@ -5584,6 +5615,24 @@ __metadata:
languageName: node
linkType: hard
"@preact/signals-core@npm:^1.7.0":
version: 1.12.1
resolution: "@preact/signals-core@npm:1.12.1"
checksum: 10c0/06e73a9b6b90ef5967687eb64003cc7c1abae1950ade55941c3eefeca5d4f642010bce3f267f00663703d7f1509c51ced4751733b7ef5dcba29707fe38d375a1
languageName: node
linkType: hard
"@preact/signals@npm:^1.3.1":
version: 1.3.2
resolution: "@preact/signals@npm:1.3.2"
dependencies:
"@preact/signals-core": "npm:^1.7.0"
peerDependencies:
preact: 10.x
checksum: 10c0/a438e80dc6ef1c3801c988d1e3516056293fc07920d81326f5e1a399c998b16bd2d41cdd053cda4edc402da5c5ea91d95671766f5d864b6ebbd7c8fac3502050
languageName: node
linkType: hard
"@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2":
version: 1.1.2
resolution: "@protobufjs/aspromise@npm:1.1.2"
@ -6540,6 +6589,22 @@ __metadata:
languageName: node
linkType: hard
"@rollup/pluginutils@npm:^5.1.3":
version: 5.3.0
resolution: "@rollup/pluginutils@npm:5.3.0"
dependencies:
"@types/estree": "npm:^1.0.0"
estree-walker: "npm:^2.0.2"
picomatch: "npm:^4.0.2"
peerDependencies:
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
checksum: 10c0/001834bf62d7cf5bac424d2617c113f7f7d3b2bf3c1778cbcccb72cdc957b68989f8e7747c782c2b911f1dde8257f56f8ac1e779e29e74e638e3f1e2cac2bcd0
languageName: node
linkType: hard
"@rollup/rollup-linux-x64-gnu@npm:4.45.1":
version: 4.45.1
resolution: "@rollup/rollup-linux-x64-gnu@npm:4.45.1"
@ -8910,6 +8975,15 @@ __metadata:
languageName: node
linkType: hard
"@types/node@npm:^20.17.9":
version: 20.19.27
resolution: "@types/node@npm:20.19.27"
dependencies:
undici-types: "npm:~6.21.0"
checksum: 10c0/7599c24d80465c1aa6e29b53581fc20ad8862ff33e6eef31d05c1c706868476ee57319c89b802ea972dd4d64ce86d18020aa5344f851fb59b730ea509a63300f
languageName: node
linkType: hard
"@types/node@npm:^22.17.1":
version: 22.17.2
resolution: "@types/node@npm:22.17.2"
@ -8968,6 +9042,15 @@ __metadata:
languageName: node
linkType: hard
"@types/react-reconciler@npm:^0.28.9":
version: 0.28.9
resolution: "@types/react-reconciler@npm:0.28.9"
peerDependencies:
"@types/react": "*"
checksum: 10c0/9fe71fa856aab2cd4742fe0416bdd4f5c82ecc05ef6451ee7fcb65a5efdf5fa588f5820fbe2a665b15371b0da3bfc4097f28bb6d450b9a834af2d0fc00f403bd
languageName: node
linkType: hard
"@types/react-transition-group@npm:^4.4.12":
version: 4.4.12
resolution: "@types/react-transition-group@npm:4.4.12"
@ -10359,6 +10442,7 @@ __metadata:
react-redux: "npm:^9.1.2"
react-router: "npm:6"
react-router-dom: "npm:6"
react-scan: "npm:^0.4.3"
react-spinners: "npm:^0.14.1"
react-transition-group: "npm:^4.4.5"
redux: "npm:^5.0.1"
@ -11127,6 +11211,17 @@ __metadata:
languageName: node
linkType: hard
"bippy@npm:^0.3.8":
version: 0.3.34
resolution: "bippy@npm:0.3.34"
dependencies:
"@types/react-reconciler": "npm:^0.28.9"
peerDependencies:
react: ">=17.0.1"
checksum: 10c0/da51c85b21d8e9684df98583f3fe2520e9b224dfa804d333484e918ea8cb746d1a46a7ca54a3406c020679200d244b12799992d54b2dafef470be50974c1a34f
languageName: node
linkType: hard
"birecord@npm:^0.1.1":
version: 0.1.1
resolution: "birecord@npm:0.1.1"
@ -17332,6 +17427,13 @@ __metadata:
languageName: node
linkType: hard
"kleur@npm:^4.1.5":
version: 4.1.5
resolution: "kleur@npm:4.1.5"
checksum: 10c0/e9de6cb49657b6fa70ba2d1448fd3d691a5c4370d8f7bbf1c2f64c24d461270f2117e1b0afe8cb3114f13bbd8e51de158c2a224953960331904e636a5e4c0f2a
languageName: node
linkType: hard
"kolorist@npm:^1.8.0":
version: 1.8.0
resolution: "kolorist@npm:1.8.0"
@ -19705,6 +19807,13 @@ __metadata:
languageName: node
linkType: hard
"mri@npm:^1.2.0":
version: 1.2.0
resolution: "mri@npm:1.2.0"
checksum: 10c0/a3d32379c2554cf7351db6237ddc18dc9e54e4214953f3da105b97dc3babe0deb3ffe99cf409b38ea47cc29f9430561ba6b53b24ab8f9ce97a4b50409e4a50e7
languageName: node
linkType: hard
"mrmime@npm:^2.0.0":
version: 2.0.1
resolution: "mrmime@npm:2.0.1"
@ -20909,7 +21018,7 @@ __metadata:
languageName: node
linkType: hard
"picocolors@npm:^1.1.1":
"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1":
version: 1.1.1
resolution: "picocolors@npm:1.1.1"
checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58
@ -21032,7 +21141,7 @@ __metadata:
languageName: node
linkType: hard
"playwright@npm:1.57.0":
"playwright@npm:1.57.0, playwright@npm:^1.49.0":
version: 1.57.0
resolution: "playwright@npm:1.57.0"
dependencies:
@ -21114,6 +21223,13 @@ __metadata:
languageName: node
linkType: hard
"preact@npm:^10.25.1":
version: 10.28.1
resolution: "preact@npm:10.28.1"
checksum: 10c0/864aa7550f0a4b9f4f944a1e59f46f788b987d24bf5a532afefdb41e437c15fe80e933b7e8561980b8abe16565e39a224ec4b743382792bee0e1854d12e5771c
languageName: node
linkType: hard
"prebuild-install@npm:^5.3.5":
version: 5.3.6
resolution: "prebuild-install@npm:5.3.6"
@ -22419,6 +22535,53 @@ __metadata:
languageName: node
linkType: hard
"react-scan@npm:^0.4.3":
version: 0.4.3
resolution: "react-scan@npm:0.4.3"
dependencies:
"@babel/core": "npm:^7.26.0"
"@babel/generator": "npm:^7.26.2"
"@babel/types": "npm:^7.26.0"
"@clack/core": "npm:^0.3.5"
"@clack/prompts": "npm:^0.8.2"
"@pivanov/utils": "npm:0.0.2"
"@preact/signals": "npm:^1.3.1"
"@rollup/pluginutils": "npm:^5.1.3"
"@types/node": "npm:^20.17.9"
bippy: "npm:^0.3.8"
esbuild: "npm:^0.25.0"
estree-walker: "npm:^3.0.3"
kleur: "npm:^4.1.5"
mri: "npm:^1.2.0"
playwright: "npm:^1.49.0"
preact: "npm:^10.25.1"
tsx: "npm:^4.19.3"
unplugin: "npm:2.1.0"
peerDependencies:
"@remix-run/react": ">=1.0.0"
next: ">=13.0.0"
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-router: ^5.0.0 || ^6.0.0 || ^7.0.0
react-router-dom: ^5.0.0 || ^6.0.0 || ^7.0.0
dependenciesMeta:
unplugin:
optional: true
peerDependenciesMeta:
"@remix-run/react":
optional: true
next:
optional: true
react-router:
optional: true
react-router-dom:
optional: true
bin:
react-scan: bin/cli.js
checksum: 10c0/d721c67bb149df8af9f7cdcf22906a9f0e3a2f6a2ad4d2d5c4b25af6fb91ea36d888d10701ad23481b5c649d799d06d9c75bf5f9c1f98ee28ed9b022aba2c2aa
languageName: node
linkType: hard
"react-spinners@npm:^0.14.1":
version: 0.14.1
resolution: "react-spinners@npm:0.14.1"
@ -23757,6 +23920,13 @@ __metadata:
languageName: node
linkType: hard
"sisteransi@npm:^1.0.5":
version: 1.0.5
resolution: "sisteransi@npm:1.0.5"
checksum: 10c0/230ac975cca485b7f6fe2b96a711aa62a6a26ead3e6fb8ba17c5a00d61b8bed0d7adc21f5626b70d7c33c62ff4e63933017a6462942c719d1980bb0b1207ad46
languageName: node
linkType: hard
"sitemapper@npm:^3.2.20":
version: 3.2.20
resolution: "sitemapper@npm:3.2.20"
@ -25052,6 +25222,22 @@ __metadata:
languageName: node
linkType: hard
"tsx@npm:^4.19.3":
version: 4.21.0
resolution: "tsx@npm:4.21.0"
dependencies:
esbuild: "npm:~0.27.0"
fsevents: "npm:~2.3.3"
get-tsconfig: "npm:^4.7.5"
dependenciesMeta:
fsevents:
optional: true
bin:
tsx: dist/cli.mjs
checksum: 10c0/f5072923cd8459a1f9a26df87823a2ab5754641739d69df2a20b415f61814322b751fa6be85db7c6ec73cf68ba8fac2fd1cfc76bdb0aa86ded984d84d5d2126b
languageName: node
linkType: hard
"tsx@npm:^4.20.3":
version: 4.20.3
resolution: "tsx@npm:4.20.3"
@ -25491,6 +25677,16 @@ __metadata:
languageName: node
linkType: hard
"unplugin@npm:2.1.0":
version: 2.1.0
resolution: "unplugin@npm:2.1.0"
dependencies:
acorn: "npm:^8.14.0"
webpack-virtual-modules: "npm:^0.6.2"
checksum: 10c0/f41d4ee1ccc3d8478afdfb4d5f52ddd34bcd3157ebe5ac804b9c5d0afe1e3d6fad5ef44f7bbf030e8a1c671e145fcc8547be46e21d080bd9729f6e97d86f9fd3
languageName: node
linkType: hard
"until-async@npm:^3.0.2":
version: 3.0.2
resolution: "until-async@npm:3.0.2"
@ -26074,6 +26270,13 @@ __metadata:
languageName: node
linkType: hard
"webpack-virtual-modules@npm:^0.6.2":
version: 0.6.2
resolution: "webpack-virtual-modules@npm:0.6.2"
checksum: 10c0/5ffbddf0e84bf1562ff86cf6fcf039c74edf09d78358a6904a09bbd4484e8bb6812dc385fe14330b715031892dcd8423f7a88278b57c9f5002c84c2860179add
languageName: node
linkType: hard
"whatwg-encoding@npm:^3.1.1":
version: 3.1.1
resolution: "whatwg-encoding@npm:3.1.1"