>  기사  >  웹 프론트엔드  >  npm의 모듈 설치 메커니즘에 대한 자세한 소개

npm의 모듈 설치 메커니즘에 대한 자세한 소개

零下一度
零下一度원래의
2017-06-26 10:54:071202검색
종속성 트리 표면의 논리적 구조와 종속성 트리의 실제 물리적 구조
종속성 트리 표면의 논리적 구조와 종속성 트리의 실제 물리적 구조는 다음과 같습니다. 반드시 같지는 않습니다!
두 가지 명령을 먼저 언급해야 합니다: tree -d(linux) 및 npm ls(npm)
npm 프로젝트에서:
tree -d 명령트리 다이어그램 사용 물리적 구조 나열 프로젝트 아래의 모든 종속성
npm ls 명령공식 문서의 트리 다이어그램
에서 프로젝트 아래의 모든 종속성의 논리적 구조를 나열합니다. 예:
프로젝트 example1에는 두 개의 종속 모듈이 있습니다: mod-a 모듈과 mod-c 모듈
mod-a 모듈에는 종속 모듈 mod-b@1.0.0 모듈이 있습니다.
mod -c 모듈에는 종속 모듈 mod가 있습니다. -b@2.0.0 module
tree -d 및 npm ls 실행 결과는 다음과 같습니다. (npm 버전은 npm2가 아닌 npm3입니다.)
먼저 아래 빨간색 상자의 결과를 살펴보세요. 이는 "우리가 이해한 것과 가장 일치하는" 종속성 트리입니다. 먼저, 첫 번째 수준 종속성은 프로젝트(mod-a 모듈 및 mod-b 모듈) 아래에 형성됩니다. 그런 다음 이 두 모듈을 상위 모듈로 사용하고 보조 종속성 모듈 mod-b@1.0.0 및 mod-b@2.0.0
을 추가하세요! 물리적으로 형성된 종속성 트리는 위의 빨간색 상자와 다릅니다. mod-a, mod-c 및 mod-b는 실제로 동일한 수준의 종속성입니다.
왜 이런 종속성 트리가 형성되나요? 아래에 설명하겠습니다
【참고】: 다음 다이어그램은 모두 종속성 트리의 물리적 구조이지 논리적 구조가 아닙니다
npm 모듈 설치 메커니즘 정보 약간의 추측 en 모듈을 설치할 때는 두 가지 가능한 방법이 있습니다. 우리는 완전 수평 설치 방식을 채택하고 있습니까? ——못해
위와 유사한 예를 들어보겠습니다. 프로젝트 APP에는 두 개의 종속 모듈 A와 B가 있습니다. A에는 종속 모듈 Cv1.0이 있고 B에도 종속 모듈 Cv2.0이 있습니다. 분명히 동일한 node_modules 아래에 동시에 존재할 수는 없습니다. 설치 시 npm 메커니즘으로 인해 종속 모듈의 한 버전만 설치할 수 있으며, 그 중 하나가 다른 버전을 덮어씁니다. 그러나 하나의 C 의존 모듈 버전을 설치하면 모듈 A와 모듈 B가 위의 이유로 npm2는 중첩 설치 방법을 선택했습니다. -

npm2
npm2의 모듈 설치 메커니즘은 중첩 설치 방법을 사용하여 다중 레벨 종속 모듈을 설치합니다.
장점과 단점
장점: 단일 버전 사용 시 발생하는 비호환 문제 해결,
다중 버전 호환성 확보
단점: 다음과 같이 동일한 모듈의
대규모 중복성
이 발생할 수 있습니다.
위의 예를 예로 들면 다음과 같은 상황도 타당합니다.
느낌으로 압니다. 이는 좋은 현상이 아닙니다. 그렇다면 종속성 간의 다중 버전 호환성을 달성하면서 이 모듈 중복성을 어떻게 줄일 수 있습니까? 그래서 npm3은 몇 가지 개선을 했습니다
npm3의 모듈 설치 메커니즘:
npm3과 npm2의 차이점은 주로 보조 모듈 설치에 반영됩니다.
npm3 will
"Try to"
모든 모듈을 논리적, 물리적으로 프로젝트의 첫 번째 레벨에 넣으세요. 구체적으로 다음 세 가지 상황으로 요약할 수 있습니다.
1. 특정 2차 레벨 모듈, 첫 번째 레벨 에 아직 동일한 이름의 모듈
이 없는 것으로 확인되면 2차 레벨 모듈을 첫 번째 레벨
에 배치합니다. 2. 특정 두 번째 수준 모듈을 설치할 때 첫 번째 수준 의 이름과 버전이 동일한 모듈을 발견하면 해당 모듈을 직접 재사용합니다
3. 특정 두 번째 수준 모듈이 발견되었을 때 첫 번째
수준 의 이름은 같지만 모듈 의 다른 버전이 발견된 경우 는 자체 상위 모듈 에만 중첩될 수 있습니다.
처음에는 조금 이해하기 어려울 수 있으니 사진을 보면서 이야기 나눠보세요!
1부터 시작하겠습니다. 두 번째 수준 모듈을 설치할 때 첫 번째 수준에 같은 이름의 모듈이 없으면 첫 번째 수준에 두 번째 수준 모듈을 놓습니다. level
먼저 위의 예를 단순화해 보겠습니다. 이제 프로젝트 APP 아래에는 단 하나의 첫 번째 수준 종속성 모듈 A가 있고 그 아래에는 두 번째 수준 종속성 모듈 C가 있지만 npm을 설치하면 종속성이

프로젝트 하위에 설치됩니다.

npm3의 2단계 모듈(C v1.0), 프로젝트의 1단계 디렉터리(node_modules)에 같은 이름의 모듈이 없는 경우, 첫 번째 레벨 디렉토리에 설치되므로 상위 모듈 A와 동일한 레벨을 따릅니다. 이 글의 시작 부분에 있는 종속성 트리의 논리적 구조와 물리적 구조가 다른 이유는 바로 이것입니다.
즉,
npm2에서 종속성 트리의 논리적 구조는 물리적 구조와 동일합니다
npm3에서 논리적 구조는 의 물리적 구조와 다를 수 있습니다
2에 대해 이야기합시다. 두 번째 수준 모듈을 설치할 때 동일한 이름과 동일한 버전의 모듈을 찾은 경우 첫 번째 수준에서는 해당 모듈을 직접 재사용할 수 있습니다.
1을 기반으로 1의 예를 이전의 더 복잡한 시나리오로 복원합니다. 프로젝트 아래에 두 개의 종속 모듈 A와 B가 있습니다. APP에는 또 다른 종속 모듈 Cv1.0이 있고 B에는 종속 모듈 C v1.0도 있습니다(두 C 모듈 버전은 동일함)

두 개의 C 패키지 동일하므로 모듈 중복성이 발생합니다
npm3에서는 모듈 A 아래의 C 모듈이 첫 번째 수준에 설치되므로 모듈 B를 동일한 수준에서 재사용하고 C 모듈을 동일한 이름으로 사용할 수 있습니다. 버전
npm3이 사용됩니다. 이 접근 방식은 npm2
[1, 2에서 3으로 전환] 이 섹션의 시작 부분에서 말했습니다. 논리적으로 특정 레벨의 "모든" 모듈은 프로젝트의 첫 번째 레벨에 배치됩니다. 1과 2를 읽으신 후에 어느 정도 이해하셔야 할 것 같습니다. "시도"의 의미 최선을 다해", 하지만 저는 "최선을 다하세요"라고 말했습니다. 이는 또한 npm3이 첫 번째 수준에 두 번째 수준 종속성을 넣을 수 없다는 의미이기도 합니다. 이에 대해서는 3:
을 참조하세요. 마지막으로 3: 보조 모듈을 설치할 때 첫 번째 수준에서 이름은 같지만 버전이 다른 모듈을 찾으면 아래에만 중첩될 수 있습니다. 자체 상위 모듈
2에서 A와 B가 의존하는 두 개의 C 모듈은 동일하지만, 그런데 두 C 모듈의 버전이 다르다면 어떨까요? 프로젝트 npm 설치 상황은 다음과 같습니다.

npm3에서는 B와 A에 필요한 종속 모듈이 다르기 때문에(B에 대한 요구 사항은 C v1.0이고, A에 대한 요구 사항은 C v2.0입니다. 따라서 B는 2
에서와 같이 A에서 C v1.0 모듈을 재사용할 수 없습니다. , 이 예와 저 예는 거의 똑같습니다)
이를 보면 npm2 및 npm3의 모듈 작동 메커니즘과 npm2에 대한 npm3의 최적화에 대한 일반적인 이해가 있습니다. 하지만 다음 질문에 대해 생각해 보십시오. npm3은 npm2의 모듈 중복성 결함을 극도로 최적화했습니까? ———답은 No입니다. 아래를 살펴보세요.
실제로: npm3에는 여전히 모듈 중복성이 있을 수 있습니다. 첫 번째 수준 디렉터리에 이미 v1이 있으므로 v1이 있습니다. .0 C 모듈, 따라서 모든 v2.0은 보조 종속성 모듈 으로만 설치할 수 있으므로 다음 상황을 볼 수 있습니다

그리고 다음과 같은 특별한 경우에 표시됩니다. 위 사진을 보면 npm3과 npm2 사이에 별 차이가 없는 것 같네요
【전환】그럼 해결 방법은 없을까요? 물론 모듈 A 아래의 C v1.0 모듈이 C v2.0으로 업데이트되면 npm dedupe를 통해 C v2.0의 모든 두 번째 수준 종속 모듈을 첫 번째 수준으로 "리디렉션"할 수 있습니다.
디렉토리의 v1.0
npm dedupe를 사용하여 중복 모듈 제거:
npm dedupe는 무엇을 했나요? 제거할 수 있는 중복된 두 번째 수준 종속 모듈을 동일한 이름/버전을 가진 첫 번째 수준 모듈로 "리디렉션"할 수 있습니다

References npm 공식 문서 섹션 2 (npm 작동 방식):
[따뜻한 알림]: 무거운 책과 지루한 문서에 비교할 수 있는 인기 블로그는 없습니다
【끝】
기억하다 매일 10개의 작은 단어, 축적에 중점을 둡니다!
메모리: 메모리 종속성: 종속성 제약 조건: 제약 조건 배포: 배포 매개 변수: 매개 변수 범위: 범위
ecosystems: 생태계 접두사: 접두사 이전: 우선 순위/해지 전: revoke
 

위 내용은 npm의 모듈 설치 메커니즘에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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