You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Monorepo外部包中Zustand Store无法正常使用问题求助

解决Lerna Monorepo中共享Zustand Store的Hook调用错误

核心问题是Monorepo环境下,共享包与主应用的React/Zustand实例不共享,导致React Hook校验机制失效(Hook必须在同一React实例的组件上下文内调用),非Hook的getState方法不受此限制,因此可以正常运行。

解决方案步骤

1. 锁定依赖版本并统一实例

在Monorepo根目录的package.json中添加版本锁定配置,强制所有包使用同一版本的React、ReactDOM和Zustand:

  • 对于npm(>=8.3),使用overrides:
{
  "overrides": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "zustand": "^4.4.7"
  }
}
  • 对于Yarn,使用resolutions:
{
  "resolutions": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "zustand": "^4.4.7"
  }
}

执行清理与重新安装命令,确保依赖被提升到根目录:

lerna clean
lerna bootstrap --hoist

2. 配置Vite强制依赖解析路径

在主应用的vite.config.ts中添加别名配置,让共享包直接引用主应用的React/Zustand实例:

import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import path from 'path';

export default defineConfig({
  plugins: [react()],
  resolve: {
    alias: {
      'react': path.resolve(__dirname, './node_modules/react'),
      'react-dom': path.resolve(__dirname, './node_modules/react-dom'),
      'zustand': path.resolve(__dirname, './node_modules/zustand'),
    },
  },
});

3. 检查共享包的依赖配置

确保共享包的package.json中,React和Zustand仅存在于peerDependencies(声明依赖要求)和devDependencies(开发时使用),不要放在dependencies中:

{
  "name": "@your-shared/store",
  "peerDependencies": {
    "react": "^18.0.0",
    "zustand": "^4.0.0"
  },
  "devDependencies": {
    "react": "^18.2.0",
    "@types/react": "^18.2.0",
    "zustand": "^4.4.7",
    "@types/node": "^20.0.0"
  }
}

4. 验证依赖实例唯一性

在主应用和共享包的代码中分别添加以下代码,验证是否引用了同一React实例:

// 主应用中
console.log('Main App React:', require('react'));
// 共享包中
console.log('Shared Package React:', require('react'));

如果输出的对象引用一致,说明问题解决;若不一致,需再次清理所有node_modules并重新执行lerna bootstrap --hoist。

内容的提问来源于stack exchange,提问作者Roma Borodov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 00:52:16