플랫 node_modules만이 유일한 방법은 아닙니다.

5006 단어 pnpmnpmnodejavascript
이 문서는 이전 버전의 pnpm을 다룹니다. 문서의 업데이트된 버전go here .

pnpm의 새로운 사용자는 pnpm이 만드는 node_modules의 이상한 구조에 대해 자주 묻습니다. 왜 평평하지 않습니까? 모든 하위 종속성은 어디에 있습니까?

I am going to assume that readers of the article are already familiar with flat node_modules created by npm and Yarn. If you don't understand why npm 3 had to start using flat node_modules in v3, you can find some prehistory in Why should we use pnpm?.



그렇다면 pnpmnode_modules이 특이한 이유는 무엇입니까? 두 개의 디렉토리를 만들고 그 중 하나에서 npm install express를 실행하고 다른 하나에서 pnpm install express를 실행해 봅시다. 다음은 첫 번째 디렉토리node_modules에서 얻을 수 있는 것의 상단입니다.



전체 디렉토리here를 볼 수 있습니다.

그리고 이것이 pnpm에 의해 생성된 node_modules에서 얻는 것입니다.



확인할 수 있습니다here.

그렇다면 모든 종속성은 어디에 있습니까? node_modules라는 .registry.npmjs.org 폴더와 express라는 심볼릭 링크가 하나뿐입니다. 글쎄, 우리는 express 만 설치했으므로 애플리케이션이 액세스해야 하는 유일한 패키지입니다.

Read more about why pnpm's strictness is a good thing here



안에 무엇이 있는지 봅시다express.


express에는 node_modules가 없습니까? express 의 모든 종속성은 어디에 있습니까?

요령은 express가 단지 심볼릭 링크라는 것입니다. Node.js는 종속성을 해결할 때 실제 위치를 사용하므로 심볼릭 링크를 유지하지 않습니다. 그러나 express의 실제 위치는 어디입니까?

여기: node_modules/.registry.npmjs.org/express/4.16.3/node_modules/express .

자, 이제 .registry.npmjs.org/ 폴더의 용도를 알았습니다. .registry.npmjs.org/는 모든 패키지를 플랫 폴더 구조에 저장하므로 다음 패턴으로 이름이 지정된 폴더에서 모든 패키지를 찾을 수 있습니다.

.registry.npmjs.org/<name>/<version>/node_modules/<name>


이 플랫 구조는 npm v2에서 생성된 중첩node_modules으로 인해 발생한 긴 경로 문제를 방지하지만 npm v3,4,5,6에서 생성된 플랫node_modules과 달리 패키지를 격리된 상태로 유지합니다.

이제 express의 실제 위치를 살펴보겠습니다.



사기인가요? 아직 부족하다node_modules ! pnpmnode_modules 구조의 두 번째 트릭은 패키지의 종속성이 종속 패키지의 실제 위치와 동일한 디렉토리 수준에 있다는 것입니다. 따라서 express의 종속성은 /express/4.16.4/node_modules/express/node_modules/가 아니라 /express/4.16.4/node_modules/에 있습니다.


express 의 모든 종속성은 node_modules/.registry.npmjs.org/ 의 적절한 디렉토리에 대한 심볼릭 링크입니다. express의 종속성을 한 수준 위로 배치하면 순환 심볼릭 링크를 피할 수 있습니다.

보시다시피 pnpmnode_modules 구조가 처음에는 이상해 보이지만
  • Node.js와 완전히 호환됨
  • 패키지가 종속성과 함께 잘 그룹화됨

  • 구조는 피어 종속성이 있는 패키지의 경우 약간more complex이지만 아이디어는 동일합니다. 심볼릭 링크를 사용하여 플랫 디렉터리 구조로 중첩을 생성합니다.


    pnpm 을 사용해 보고 싶다면 npm: npm i -g pnpm 를 사용하여 쉽게 설치할 수 있습니다. 그런 다음 무언가를 설치해야 할 때 npm 대신 실행하십시오: pnpm install foo bar .

    좋은 웹페이지 즐겨찾기