У меня есть проект с несколькими модулями Webpack. В моем дочернем модуле я хочу создать пользовательский хук React, который я могу использовать в компонентах React в родительском модуле.
Мой пример хука довольно прост:
export function useTitle(title: string): void {
useEffect(() => {
document.title = title
}, [title]);
}
Однако, при использовании моего пользовательского перехвата в компоненте React вне модуля я получаю ошибку:
Ошибка: недопустимый вызов перехвата. Хуки могут быть вызваны только внутри тела функционального компонента. Это может произойти по одной из следующих причин:
- У вас могут быть несовпадающие версии React и средства визуализации (например, React DOM)
- Возможно, вы нарушаете правила хуков
- Возможно, в одном приложении может быть несколько копий React
Я предполагаю, что причина в том, что экземпляр React создается для каждого модуля Webpack. Jest-тест, сравнивающий экземпляр React дочернего модуля с экземпляром родительского модуля, также показывает это.
import {react} from "child-module";
test("react instance", () => {
expect(react).toBe(React); // serializes to the same string, but unequal
});
В любом случае можно ли использовать настраиваемый обработчик React из одного модуля Webpack в другом без получения ошибки ?
То, что я уже пытался безуспешно
В моих файлах конфигурации Webpack я установил внешние объявления для React, чтобы избежать того, что React будет быть включенным в выходные пакеты Webpack.
В пакете. json дочернего модуля я объявил React зависимостью равноправного узла.
В пакете. json родительского модуля я связался с установкой React дочернего модуля: "react": "../child-module/node_modules/react"
, чтобы оба модуля использовали одну и ту же копию React.
Во время выполнения я заставляю его работать с доставкой React из CDN, а не из любого модуля Webpack. Однако мне не очень помогает, если я не могу протестировать свои компоненты React.