찾다
웹 프론트엔드JS 튜토리얼전문 개발자를 위한 npm 피어 종속성

npm Peer Dependencies for the Professional Developer

이 기사에서는 npm 피어 종속성이 무엇인지, 특히 언제 사용해야 하는지 명확히 설명합니다. 피어 종속성은 프로젝트의 package.json 파일의 PeerDependency 개체에 나열됩니다.

이 기사를 최대한 활용하려면 최소한 npm에 대한 기본 지식이 있어야 합니다.

내용물

이 기사 내용:

  1. 피어 종속성이 일반 종속성과 어떻게 작동하는지 비교할 것입니다.
  2. 피어 종속성과 종속성의 몇 가지 를 살펴보겠습니다.
  3. 그런 다음 npm이 버전 충돌을 처리하는 방법을 살펴보겠습니다.
  4. 마지막으로 기본 사항을 확고하게 파악하여 동료 종속이 적절한 시기를 결정하는 접근 방식을 제시하겠습니다.

시나리오

실제로 Angular 또는 React 구성 요소 라이브러리를 생성하거나 일부 기능을 내보내는 간단한 JavaScript 파일을 생성한다고 가정해 보겠습니다.

귀하의 프로젝트는 npm 레지스트리의 패키지에 의존합니다. 이 패키지는 프로젝트의 종속성입니다.

프로젝트에서 자신만의 npm 패키지를 만들고 싶습니다. 따라서 npm pack을 사용하여 프로젝트에서 npm 패키지를 생성합니다. npm 레지스트리에 게시하기로 결정할 수도 있습니다.

다른 팀은 npm 레지스트리에서 패키지로 구성 요소 라이브러리를 찾을 수 있습니다. npm install을 사용하여 패키지를 자신의 프로젝트에 종속성으로 추가할 수 있습니다. package.json의 종속성피어 종속성을 사용하여 구성 요소 라이브러리가 작동하려면 어떤 패키지도 추가해야 하는지 다른 프로젝트에 알려줍니다.

종속성과 피어 종속성

가장 기본적인 수준에서 종속성동료 종속성이 작동하는 방식은 다음과 같습니다.

종속성

종속성은 종속성 개체의 프로젝트 package.json 파일에 나열됩니다.

코드의 종속성에 패키지를 추가하면 다음과 같이 됩니다.

  • 내 코드를 실행하려면 이 패키지가 필요합니다.
  • 이 패키지가 내 node_modules 디렉터리에 아직 없으면 자동으로 추가하세요.
  • 또한 이 패키지의 종속성에 나열된 모든 패키지를 추가하세요. 이러한 패키지를 전이적 종속성이라고 합니다.

피어 종속성

피어 종속성은 프로젝트의 package.json 파일에 있는 PeerDependency 개체에 나열됩니다.

코드의 PeerDependency에 패키지를 추가하면 다음과 같이 됩니다.

  • 내 코드가 이 버전의 패키지와 호환됩니다.
  • 이 패키지가 node_modules에 이미 존재하는 경우 아무 작업도 수행하지 마세요.
  • 이 패키지가 node_modules 디렉터리에 아직 존재하지 않거나 잘못된 버전인 경우 추가하지 마세요. 단, 찾을 수 없다는 경고를 사용자에게 표시합니다.

종속성 추가

그래서 npm 패키지 폴더의 package.json 파일에 종속성을 추가합니다. 패키지를 종속성으로 추가하는 방법과 패키지 종속성의 몇 가지 예를 정확히 살펴보겠습니다.

종속성 추가

종속성은 코드를 실행하기 위해 의존하는 npm 패키지입니다. 종속성으로 추가할 수 있는 인기 패키지로는 lodash, D3 및 Chartjs가 있습니다.

다음과 같은 일반 종속성을 추가합니다.

npm install lodash

npm은 프로젝트의 package.json 파일에 있는 종속 항목에 패키지 이름과 버전을 추가합니다.

"dependencies": {
  "lodash": "^4.17.11"
}

package.json의 종속성을 업데이트하기 위해 npm을 얻기 위해 --save 플래그를 사용해야 했던 옛날을 기억하시는 분들도 계실 것입니다. 다행히 더 이상 그럴 필요가 없습니다.

피어 종속성 추가

피어 종속성은 프로젝트가 특정 버전의 npm 패키지와 호환됨을 지정하는 데 사용됩니다. 좋은 예가 Angular와 React입니다.

피어 종속성을 추가하려면 실제로 package.json 파일을 수동으로 수정해야 합니다. 예를 들어, 구성 요소 라이브러리 프로젝트의 경우 사용 중인 프레임워크에 따라 angular/core 또는 react를 피어 종속성으로 추가하는 것이 좋습니다.

따라서 패키지가 React 18용으로 빌드되도록 지정하려면 다음과 같은 내용을 포함할 수 있습니다.

"peerDependencies": {
   "react": "^18.0.0",
}

또는 Angular 버전 17과 18 모두에서 구성 요소 라이브러리를 테스트했지만 아직 출시되지 않았기 때문에 19에서는 테스트하지 않았다고 말하고 싶을 수도 있습니다. 그런 다음 다음을 사용할 수 있습니다.

"peerDependencies": {
   "@angular/core": ">=17.0.0 || 



<h2>
  
  
  About Conflicts
</h2>

<p>I get a lot of questions about whether a certain npm package should go into dependencies or into peerDependencies. The key to making this decision involves understanding how npm deals with version conflicts.</p>

<p>If you have read my previous articles, you know I like you to be able to do this stuff along with me! So feel free to work along with me for this little npm experiment.</p>

<h3>
  
  
  conflict-test Project
</h3>

<p>To get started let’s create a trivial test project. I am going to name mine:<br>
conflict-test</p>

<p>I created it like this:<br>
</p>

<pre class="brush:php;toolbar:false">md conflict-test
cd conflict-test
npm init -y

I then manually edited the package.json file and added two dependencies:

"dependencies": {
    "todd-a": "^1.0.0",
    "todd-b": "^1.0.0"
}

These todd-a and todd-b packages also have their own dependencies:

todd-a

"dependencies": {
    "lodash": "^4.17.11",
    "todd-child": "^1.0.0"
}

todd-b

"dependencies": {
    "lodash": "^4.17.11",
    "todd-child": "^2.0.0"
}

The thing I want you to notice here is that todd-a and todd-b use the same version of lodash. But, they have a version conflict for todd-child:
todd-a uses todd-child version 1.0.0
todd-b uses todd-child version 2.0.0

Now I know that, like me, you are keenly interested in seeing how npm handles this version conflict. In my main project conflict-test I run npm install. As we would expect, npm magically installs the todd-a and todd-b packages in our node_modules folder. It also adds the packages that they depend on (the transitive dependencies). So after running npm install we take a look at the node_modules folder. It looks like this:

node_modules
├── lodash 4.17.11
├── todd-a 1.0.0
├── todd-b 1.0.0
│   └── node_modules
│       └── todd-child 2.0.0
└── todd-child 1.0.0

The interesting thing about this is that our project has one copy of lodash. But, it has two copies of todd-child! Notice that todd-b gets its own private copy of todd-child 2.0.0.

So here is the rule:

npm deals with version conflicts by adding duplicate private versions of the conflicted package.

An Approach to Peer Dependencies

As we saw from our experiment with npm version conflicts, if you add a package to your dependencies, there is a chance it may end up being duplicated in node_modules.

Sometimes, having two versions of the same package is fine. However, some packages will cause conflicts when there are two different versions of them in the same code base.

For example, assume our component library was created using React v15. We wouldn’t want our package adding another completely different version of react when someone adds it as a dependency to their React v18 application.

The key is:
We don’t want our library adding another version of a package to node-modules when that package could conflict with an existing version and cause problems.

peerDependencies or dependencies?

So this brings us to the main question for our dependencies:

When my package depends on another package, should I put it in dependencies or peerDependencies?

Well, as with most technical questions: It depends.

Peer Dependencies express compatibility. For example, you will want to be specific about which version of Angular or React your library is compatible with.

The Guidelines

Favor using Peer Dependencies when one of the following is true:

  • Having multiple copies of a package would cause conflicts
  • The dependency is visible in your interface
  • You want the developer to decide which version to install

Let’s take the example of angular/core. Obviously, if you are creating an Angular Library, angular/core is going to be a very visible part of your library’s interface. Hence, it belongs in your peerDependencies.

However, maybe your library uses Moment.js internally to process some time related inputs. Moment.js most likely won’t be exposed in the interface of your Angular or React components. Hence, it belongs in your dependencies.

Angular or React as a Dependency

Given that you are going to specify in your documentation that your library is a set of Angular or React Components, you may be asking the question:

Do I even need to specify angular/core as a dependency? If someone is using my library, they will already have an existing Angular project.

Good question!

Yes, we can usually assume that for our Angular or React specific library the Workspace will already have the Angular or React packages available. Hence, technically we wouldn’t need to bother adding them to our list of dependencies.

Wir möchten dem Entwickler jedoch unbedingt mitteilen, mit welchen Angular- oder React-Versionen unsere Bibliothek kompatibel ist. Daher empfehle ich folgende Vorgehensweise:

Fügen Sie mindestens das Angular/Core- oder React-Paket für die kompatible Version zu Ihren PeerDependencies hinzu.

Auf diese Weise wird Entwicklern eine Warnung angezeigt, wenn sie versuchen, Ihre React 18-Komponentenbibliothek in ihrem React 16-Projekt zu verwenden. Machen Sie sich nicht die Mühe, die anderen Angular- oder React-Pakete hinzuzufügen. Sie können davon ausgehen, dass sie, wenn sie über Angular/Core oder React verfügen, über die anderen zugehörigen Bibliotheken verfügen.

Abschließend

Im Zweifelsfall sollten Sie sich wahrscheinlich für die Verwendung von peerDependencies entscheiden. Dadurch können die Benutzer Ihres Pakets selbst entscheiden, welche Pakete sie hinzufügen möchten.

위 내용은 전문 개발자를 위한 npm 피어 종속성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
JavaScript 프레임 워크 : 현대적인 웹 개발 파워JavaScript 프레임 워크 : 현대적인 웹 개발 파워May 02, 2025 am 12:04 AM

JavaScript 프레임 워크의 힘은 개발 단순화, 사용자 경험 및 응용 프로그램 성능을 향상시키는 데 있습니다. 프레임 워크를 선택할 때 : 1. 프로젝트 규모와 복잡성, 2. 팀 경험, 3. 생태계 및 커뮤니티 지원.

JavaScript, C 및 브라우저의 관계JavaScript, C 및 브라우저의 관계May 01, 2025 am 12:06 AM

서론 나는 당신이 이상하다는 것을 알고 있습니다. JavaScript, C 및 Browser는 정확히 무엇을해야합니까? 그들은 관련이없는 것처럼 보이지만 실제로는 현대 웹 개발에서 매우 중요한 역할을합니다. 오늘 우리는이 세 가지 사이의 밀접한 관계에 대해 논의 할 것입니다. 이 기사를 통해 브라우저에서 JavaScript가 어떻게 실행되는지, 브라우저 엔진의 C 역할 및 웹 페이지의 렌더링 및 상호 작용을 유도하기 위해 함께 작동하는 방법을 알게됩니다. 우리는 모두 JavaScript와 브라우저의 관계를 알고 있습니다. JavaScript는 프론트 엔드 개발의 핵심 언어입니다. 브라우저에서 직접 실행되므로 웹 페이지를 생생하고 흥미롭게 만듭니다. 왜 Javascr

Node.js는 TypeScript가있는 스트림입니다Node.js는 TypeScript가있는 스트림입니다Apr 30, 2025 am 08:22 AM

Node.js는 크림 덕분에 효율적인 I/O에서 탁월합니다. 스트림은 메모리 오버로드를 피하고 큰 파일, 네트워크 작업 및 실시간 애플리케이션을위한 메모리 과부하를 피하기 위해 데이터를 점차적으로 처리합니다. 스트림을 TypeScript의 유형 안전과 결합하면 Powe가 생성됩니다

Python vs. JavaScript : 성능 및 효율성 고려 사항Python vs. JavaScript : 성능 및 효율성 고려 사항Apr 30, 2025 am 12:08 AM

파이썬과 자바 스크립트 간의 성능과 효율성의 차이는 주로 다음과 같이 반영됩니다. 1) 해석 된 언어로서, 파이썬은 느리게 실행되지만 개발 효율이 높고 빠른 프로토 타입 개발에 적합합니다. 2) JavaScript는 브라우저의 단일 스레드로 제한되지만 멀티 스레딩 및 비동기 I/O는 Node.js의 성능을 향상시키는 데 사용될 수 있으며 실제 프로젝트에서는 이점이 있습니다.

JavaScript의 기원 : 구현 언어 탐색JavaScript의 기원 : 구현 언어 탐색Apr 29, 2025 am 12:51 AM

JavaScript는 1995 년에 시작하여 Brandon Ike에 의해 만들어졌으며 언어를 C로 실현했습니다. 1.C Language는 JavaScript의 고성능 및 시스템 수준 프로그래밍 기능을 제공합니다. 2. JavaScript의 메모리 관리 및 성능 최적화는 C 언어에 의존합니다. 3. C 언어의 크로스 플랫폼 기능은 자바 스크립트가 다른 운영 체제에서 효율적으로 실행하는 데 도움이됩니다.

무대 뒤에서 : 어떤 언어의 힘이 자바 스크립트입니까?무대 뒤에서 : 어떤 언어의 힘이 자바 스크립트입니까?Apr 28, 2025 am 12:01 AM

JavaScript는 브라우저 및 Node.js 환경에서 실행되며 JavaScript 엔진을 사용하여 코드를 구문 분석하고 실행합니다. 1) 구문 분석 단계에서 초록 구문 트리 (AST)를 생성합니다. 2) 컴파일 단계에서 AST를 바이트 코드 또는 기계 코드로 변환합니다. 3) 실행 단계에서 컴파일 된 코드를 실행하십시오.

파이썬과 자바 스크립트의 미래 : 트렌드와 예측파이썬과 자바 스크립트의 미래 : 트렌드와 예측Apr 27, 2025 am 12:21 AM

Python 및 JavaScript의 미래 추세에는 다음이 포함됩니다. 1. Python은 과학 컴퓨팅 분야에서의 위치를 ​​통합하고 AI, 2. JavaScript는 웹 기술의 개발을 촉진하고, 3. 교차 플랫폼 개발이 핫한 주제가되고 4. 성능 최적화가 중점을 둘 것입니다. 둘 다 해당 분야에서 응용 프로그램 시나리오를 계속 확장하고 성능이 더 많은 혁신을 일으킬 것입니다.

Python vs. JavaScript : 개발 환경 및 도구Python vs. JavaScript : 개발 환경 및 도구Apr 26, 2025 am 12:09 AM

개발 환경에서 Python과 JavaScript의 선택이 모두 중요합니다. 1) Python의 개발 환경에는 Pycharm, Jupyternotebook 및 Anaconda가 포함되어 있으며 데이터 과학 및 빠른 프로토 타이핑에 적합합니다. 2) JavaScript의 개발 환경에는 Node.js, VScode 및 Webpack이 포함되어 있으며 프론트 엔드 및 백엔드 개발에 적합합니다. 프로젝트 요구에 따라 올바른 도구를 선택하면 개발 효율성과 프로젝트 성공률이 향상 될 수 있습니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기