모듈 내에서 FormattedMessage를 사용할 때 오류가 발생합니다. 오류 : [React Intl] 필요한`intl` 개체를 찾을 수 없습니다.

차 카즈

React TypeScript 프로젝트에서 사용하고 사용하는 TypeScript 모듈을 노출하는 monorepo가 ​​있습니다.

모듈이 임의의 React 요소를 가상 DOM에 삽입하면 React Router를 사용하려고 할 때를 포함하여 모든 것이 예상대로 작동합니다 (처음에는 문제가 있었지만 수정할 수있었습니다).

그러나을 통해 react-intl을 사용하려고 FormattedMessage하면 오류가 발생합니다.

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찾을 수없는 요소를 사용합니다 IntlProvider).

나는 이것이 어떻게 든 버전 관리와 관련이 있다고 생각하거나 React / React DOM / IntlProvider의 2 개의 인스턴스를 가지고 있다고 생각하지만 어떻게 해결하는지 모르겠고 생각할 수있는 모든 것을 시도하는 데 많은 시간을 보냈습니다.

그만한 가치는 다음과 같습니다.

  • 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

누구나 아이디어가 있습니까? 미리 감사드립니다!

tmhao2005

위의 방법으로 작동하려면 디렉토리 node_modules에서 삭제 repro-lib해야 두 디렉토리에 종속성이 설치됩니다.

따라서의 문제를 해결하기 위해 https://classic.yarnpkg.com/en/docs/workspaces/에 자세히 설명 된대로의 작업 공간 기능 monorepo을 사용하는 것이 좋습니다 yarn.

요약하면 yarn install한 번만 여러 작업 영역에서 작업하는 데 도움이되는 훌륭한 기능 입니다.

저장소를 작동시키는 몇 가지 단계는 다음과 같습니다.

  • 넣어 package.json다음과 같은 내용으로 프로젝트의 루트 레벨에 :
{
  "private": true,
  "workspaces": ["project", "repro-lib"]
}
  • projectdir로 이동하여 다음 줄 바꿉니다 package.json.
"pf-common": "file:../repro-lib"

...에

"pf-common": "1.0.0" 
  • 마지막으로 루트 최상위 수준 설치 deps로 다시 돌아가십시오.
yarn install

그게 다야! 이제 애플리케이션을 다시 실행하여 작동 방식을 확인할 수 있습니다.

참고 : monorepo에 관심이 있다는 점 lerna에서도 훌륭한 CLI를 제공하여 도움이되는 훌륭한 도구입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관