在模块内使用 FormattedMessage 时出错:错误:[React Intl] 找不到所需的 `intl` 对象

cha*_*kaz 6 typescript reactjs tsconfig webpack react-intl

我有一个 monorepo,它公开了一个 TypeScript 模块,它被 React TypeScript 项目消耗和使用。

当模块将任意 React 元素插入到虚拟 DOM 时 - 一切都按预期工作,包括当我尝试使用 React Router 时(最初是有问题的,但我能够修复它)。

但是,当我尝试使用 react-intl, via 时FormattedMessage,出现错误:

Error: [React Intl] Could not find required `intl` object. <IntlProvider> needs to exist in the component ancestry.
Run Code Online (Sandbox Code Playgroud)

当我在控制台日志中看到这一点时,这尤其令人讨厌:

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)
Run Code Online (Sandbox Code Playgroud)

(注意IntlProvider包装Loading- 这是使用FormattedMessagewhich 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
Run Code Online (Sandbox Code Playgroud)

任何人有任何想法?提前致谢!

tmh*_*005 4

使用上述方法才能使其工作,您必须在目录node_modules中删除repro-lib,因为它将在两个目录中安装依赖项。

因此,为了解决 的问题monorepo,我建议您使用yarn此处仔细描述的工作区功能: https: //classic.yarnpkg.com/en/docs/workspaces/

总而言之,这是一个非常有用的功能,可以帮助您一次处理多个工作区yarn install

以下是使您的存储库正常运行的几个步骤:

  • package.json以下内容放在项目的根级别:
{
  "private": true,
  "workspaces": ["project", "repro-lib"]
}
Run Code Online (Sandbox Code Playgroud)
  • 转到project目录并替换以下行package.json
"pf-common": "file:../repro-lib"
Run Code Online (Sandbox Code Playgroud)

"pf-common": "1.0.0" 
Run Code Online (Sandbox Code Playgroud)
  • 最后,再次返回根顶层安装 deps:
yarn install
Run Code Online (Sandbox Code Playgroud)

就是这样!现在您可以重新运行您的应用程序以查看其工作原理。

注意:就对 monorepo 感兴趣而言,lerna通过提供出色的 CLI 也是一个很好的工具来提供帮助。