
在完成 Zustand Store 迁移后,web 与 desktop(electron renderer) 先后出现 React 渲染错误,主要表现为:
Invalid hook callCannot read properties of null (reading 'useRef' / 'useState')Incompatible React versions这些错误会导致页面无法渲染,属于高优先级阻塞问题。
关键报错:
Invalid hook call. Hooks can only be called inside of the body of a function component.<BrowserRouter>(main.tsx:9)Cannot read properties of null (reading 'useRef')关键报错:
Incompatible React versionsreact: 19.1.0react-dom: 19.2.5说明渲染时拿到的 react 与 react-dom 不是同一版本。
关键报错:
Invalid hook callCannot read properties of null (reading 'useState')Versions.tsx在 workspace 场景下,不同 app 的 react、react-dom 解析路径可能不同,导致:
reactreact-dom / router)使用了另一份 react从而触发 Invalid hook call。
为修复 Web 端 Invalid hook call,曾尝试在 Vite 中把 react alias 到 workspace 根。随后发现根目录实际版本为:
root react = 19.1.0root react-dom = 19.2.5这会直接触发 Incompatible React versions。
apps/desktop 初始将 react、react-dom 放在 devDependencies,配合 monorepo hoist 后,渲染进程更容易解析到非预期位置的包。
apps/web/src/main.tsx 的 <BrowserRouter>apps/desktop/src/renderer/src/components/Versions.tsxpnpm --filter @aitodos/web why reactpnpm --filter @aitodos/store why reactpnpm --filter desktop why reactrequire.resolve('react')require.resolve('react-dom')apps/web、apps/admin、apps/desktop 目录执行node_modules/react/package.jsonnode_modules/react-dom/package.json文件:
apps/web/vite.config.tsapps/admin/vite.config.ts动作:
resolve.dedupe: ['react', 'react-dom']作用:
动作:
react/react-dom alias 到 workspace 根结果:
root react=19.1.0 与 react-dom=19.2.5 的版本错配Incompatible React versions处理:
dedupe文件:
apps/desktop/electron.vite.config.tsapps/desktop/package.json动作 1(解析一致化):
renderer.resolve 中保留 dedupe: ['react', 'react-dom']react: resolve('node_modules/react')动作 2(依赖归类修正):
react、react-dom 从 devDependencies 移到 dependencies目的:
执行:
pnpm install --filter desktop
pnpm --filter desktop dev结果:
Invalid hook call 链路已完成定向修复当再次出现 Invalid hook call 时,建议按以下顺序:
react 与 react-dom 必须完全同版本require.resolve('react') 与 require.resolve('react-dom')resolve.dedupe: ['react', 'react-dom']dependencies 而非仅 devDependenciesapps/desktop 的 pnpm.onlyBuiltDependencies 配置警告属于配置位置提示,不是本次渲染错误根因。现象:
关联报错(阶段性):
[plugin:vite:import-analysis] Failed to resolve import "@web/index.css"根因:
main.tsx 直接从 @web/index.css 引入时,CSS alias 在 Electron + Vite 场景下解析不稳定。apps/desktop 原模板样式文件未显式扫描 apps/web/src,导致 Tailwind 未生成 Web 页面实际使用的 utility class。修复:
apps/desktop/src/renderer/src/main.tsx
import './assets/main.css'apps/desktop/src/renderer/src/assets/main.css
@import "tailwindcss";@source "../../../../../web/src/**/*.{ts,tsx}";@source "../**/*.{ts,tsx}";html/body/#root)。验证:
pnpm --filter desktop build 通过。unsafe-eval关键报错:
Uncaught EvalError: Evaluating a string as JavaScript violates CSP ... 'unsafe-eval'packages/shared/src/storage.ts根因:
new Function(...) 进行动态导入;unsafe-eval,因此直接报错。修复:
packages/shared/src/storage.ts
new Function(...) 改为 CSP 安全写法:
import(/* @vite-ignore */ modulePath)验证:
pnpm --filter @aitodos/shared type-check 通过。pnpm --filter desktop typecheck 通过。unsafe-eval 相关异常。@source 扫描 Web 源码;eval/new Function,否则容易被 CSP 拦截。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。