javascript - 在多模块项目中使用自定义 React Hook 进行 Jest 测试时出错
问题描述
我有一个包含多个 Webpack 模块的项目。在我的子模块中,我想创建一个自定义的 React 钩子,我可以在父模块的 React 组件中使用它。
我的示例钩子非常简单:
export function useTitle(title: string): void {
useEffect(() => {
document.title = title
}, [title]);
}
但是,当在模块外部的 React 组件中使用我的自定义钩子时,我收到一个错误:
错误:无效的挂钩调用。钩子只能在函数组件的主体内部调用。这可能由于以下原因之一而发生:
- 你可能有不匹配的 React 版本和渲染器(例如 React DOM)
- 您可能违反了 Hooks 规则
- 你可能在同一个应用程序中拥有多个 React 副本
我假设原因是为每个 Webpack 模块创建了一个 React 实例。比较子模块的 React 实例和父模块的一个 Jest 测试也显示了这一点。
import {react} from "child-module";
test("react instance", () => {
expect(react).toBe(React); // serializes to the same string, but unequal
});
有没有办法在另一个 Webpack 模块中使用自定义 React 钩子而不会出错?
我已经尝试过的没有任何成功
在我的 Webpack 配置文件中,我为 React 设置了外部声明,以避免 React 包含在输出的 Webpack 包中。
在子模块的 package.json 中,我将 React 声明为对等依赖项。
在父模块的 package.json 中,我已经链接到子模块的 React 安装:
"react": "../child-module/node_modules/react"
以确保两个模块使用相同的 React 副本。在运行时,我让它从 CDN 而非任何 Webpack 模块交付 React。但是,如果我无法测试我的 React 组件,这对我没有多大帮助。
解决方案
我终于可以通过将 React 存储在子模块和父模块的公共根文件夹的 node_modules 文件夹中来解决这个问题。
我的项目结构:
project
|
+--- node_modules <-- React is here
|
+--+ child-module
| |
| +--- node_modules <-- Does NOT contain React
|
+--+ parent-module
|
+--- node_modules <-- Does NOT contain React
推荐阅读
- javascript - 为什么 draft-js / react-rte 不会在文本编辑器中加载 iframe?
- sql-server - 在 SQL 中将一个长字符串拆分为一组较短的字符串
- netlogo - 如何更新用于在循环中选择海龟的比例?
- angular - Angular - 身份验证标头
- java - static 关键字在这里做什么?
- android - DiffUtil 违反 areContentTheSame 的合同 [下一个版本中的修复]
- c# - Xamarin 使用 AudioManager 形成 AdMob 问题
- visual-studio - 如何修复“命名空间microsoft.visualstudio中不存在类型或命名空间名称'xmleditor'(您是否缺少程序集引用?)”
- javascript - 关闭命令上下文时如何解决错误
- javascript - Javascript / Php 如何在文件中应用“\n”和“\r”进行下载