reactjs - 在模块内使用 FormattedMessage 时出错:错误:[React Intl] 找不到所需的 `intl` 对象
问题描述
我有一个 monorepo,它公开了一个 TypeScript 模块,该模块由 React TypeScript 项目使用和使用。
当模块将任意 React 元素插入到虚拟 DOM 中时 - 一切都按预期工作,包括当我尝试使用 React Router 时(最初是有问题的,但我能够修复它)。
但是,当我尝试使用 react-intl, viaFormattedMessage
时,出现错误:
Error: [React Intl] Could not find required `intl` object. <IntlProvider> needs to exist in the component ancestry.
当我在控制台日志中看到此打印时,这尤其令人讨厌:
The above error occurred in the <Context.Consumer> component:
in FormattedMessage
in h2
in div
in Loading (at App.tsx:11)
in IntlProvider (at App.tsx:8)
in App (at src/index.tsx:9)
in StrictMode (at src/index.tsx:8)
(注意IntlProvider
包装Loading
- 这是使用FormattedMessage
which can't find的元素IntlProvider
)。
我想这与版本控制有关,或者有 2 个 React / React DOM / IntlProvider 实例,但我不知道如何解决这个问题,我花了很多时间尝试我能想到的一切。
对于它的价值,这就是我使用的:
- TypeScript - 适用于模块和项目
- Webpack 打包模块,我在其中声明 React、ReactDOM 和 react-intl
externals
并将它们添加为peerDependencies
而不是直接依赖项 create-react-app
为项目
我能够创建一个最小的重现存储库,这是重现我的问题的方法:
<cd somewhere>
git clone https://github.com/chakaz/repro-repo .
cd repro-lib
npm install
npm run build:dev
cd ../project
npm install
npm run start
有人有什么想法吗?提前致谢!
解决方案
使用上述方式以使其工作,您必须node_modules
在您的repro-lib
目录中删除,因为它将在两个目录中安装依赖项。
因此,为了解决 的问题monorepo
,我建议您使用yarn
此处仔细描述的工作区功能:https ://classic.yarnpkg.com/en/docs/workspaces/
总而言之,只需yarn install
一次即可帮助处理多个工作区,这是一项很棒的功能。
以下是使您的回购工作的几个步骤:
- 将
package.json
以下内容放在项目的根级别:
{
"private": true,
"workspaces": ["project", "repro-lib"]
}
- 转到
project
目录并替换以下行package.json
:
"pf-common": "file:../repro-lib"
至
"pf-common": "1.0.0"
- 最后,再次回到 root 顶层安装 deps:
yarn install
而已!现在您可以重新运行您的应用程序以查看它是如何工作的。
注意:就对 monorepo 感兴趣而言,lerna
它也是一个很好的工具,可以通过提供出色的 CLI 来提供帮助。
推荐阅读
- android - ArrayIndexOutOfBoundException 删除单条记录
- python - 在索引之前查找子字符串的第一次出现
- json - 努力将 JSON 数据转换为 Django 模型对象实例
- docusignapi - 如何在 SOAPUI 工具中测试 DocuSign Rest API
- .net - 验证是否允许重命名目录和文件
- python - Python 中的 DAT 文件操作
- vba - 有一个 Excel 自动滚动宏;有没有办法在上面放一个计时器?
- c# - 在 ASP.NET 中使用 EF 存储字符串集合
- go - 用于单元测试的模拟 bufio 外部包
- python - 使用 Python 和 BeautifulSoup 抓取 Ajax.requests - 看似随机的页码返回空白