우아한테크코스 테코톡
비녀의 Package Manager
카테고리 : 우아한테크코스 테코톡
비녀의 Package Manager
JS의 import
- 자바 스크립트 초창기에는 import 나 require 라는 개념을 지원하지 않았다. 더 정확히는 모듈이라는 개념을 자바스크립트에서 지원 하지 않았다.
- 초창기에는 코드량 적어서 모듈로 분리할 필요가 없었다.
- 프론트엔드가 발전을하고 자바스크립트의 코드량이 많아지면서 모듈로 분리할 필요성이 생김
Package 란?
- 모듈들을 뭉쳐놓은 덩어리 하나.
- npm 왈 모듈은 require 라는 node.js 의 도구를 사용해서 불러올 수 있는 것을 모듈이라고 하고 package.json 을 가지고 있는 모듈 혹은 모듈의 뭉치를 전부 다 패키지라고 정의
NPM의 등장
- 패키지들도 코드량이 늘어나면 굉장히 많이 필요하게 된다. 그래서 NPM 등장하면서 이것들을 관리할 수 있게 해주었다.
- NPM 발표
- 여러 버전의 동일한 패키지를 한 프로젝트에서 사용할 수 있게 하자
- 설치 방식을 통일하자
- 패키지 관련 정보가 들어있는 메타 데이터를 간소화 하자
- 누구나 배포할 수 있도록 하자
- 디렉터리 구조
- node_modules
- 설치하고자 하는 패키지들이 다 담겨져 있다.
- package.json
- 패키지를 다룰 수 있는 CLI 명령어를 제공하고 그것을 커스텀 할 수 있고 또 거기에 대한 메타데이터들을 제공한다.
- node_modules
Yarn 의 등장 (yet another resource negotiator)
- 페이스북과 구글 개발자들이 모여서 2016 년도에 내놓음
- npm 개선점 으로 개발
- 병렬화를 통한 속도 개선
- npm 이 병렬화를 하지 않아서 굉장히 느린 다운로드 속도를 가지고 있었다
- 자동화된 lock 생성
- npm 이 지금은 package.lock 이라는 파일을 제공하지만 원래는 shrinkwrap 이라는 메서드를 사용해서 CLI 에 직접 쳐줘야지만 그 파일을 생성해줌
- yarn 이 자동화된 yarn.lock 파일을 생성하는 기술을 처음 도입해서 npm 도 따라감
- 의존성 트리 알고리즘 변경
- npm 은 패키지를 다운로드 받는 순서에 따라서 의존성이 조금씩 변경이 될 수 있는 그런 알고리즘 이였다.
- yarn 에서는 그것을 제거하고 독자적인 알고리즘을 선택 함으로써 의존성 트리가 덜 변형되도록 하는 그런 알고리즘을 사용
- 캐시 사용
- yarn 캐시 파일을 가지고 있어서 다운로드 받았던 것을 기억할 수 있다.
- 다운로드 속도 개선
- 병렬화를 통한 속도 개선
NPM 계열의 한계
- 비 효율적 의존성 검색
- 부모 디렉토리 부터 시작해서 루트 디렉토리까지 순차적으로 node_modules 를 뒤지면서 패키지가 없으면 계속 찾아 나가게 된다.
- 패키지가 없으면 계속 찾아나가야 하는 단점이 있다.
- 잘못된 의존성이나 버전이 다른 의존성을 가지고 있어도 그것을 검색해서 사용해 버릴 수 있는 치명적인 단점이 있다.
- 부모 디렉토리 부터 시작해서 루트 디렉토리까지 순차적으로 node_modules 를 뒤지면서 패키지가 없으면 계속 찾아 나가게 된다.
- 유령 의존성(호이스팅)
- 너무 무거운 node_modules
- 다운로드를 잘 받았는지 검사하지 않는다
- 이것들을 해결하기 위해서 Pnpm 과 Yarn berry 가 나왔다.
Pnpm
- npm 의 구조를 가져가는데 명확하게 한가지만 변경을 했다.
- 평타화되지 않은 플랫하지 않은 node_modules 를 사용한다.
- 평타화되지 않아 디렉토리가 복잡하다
- 구조만 보면 덜 효율적이지 않냐라고 생각할 수 있지만 자체적으로 굉장한 알고리즘을 사용하고 있다.
- Symbolic Link 라고 하는 symlink 기술
- pnpm store
- 루트 디렉토리에 pnpm store 라는 레지스트리를 자체적으로 생성해서 pnpm store 에 한 번만 저장을 해서 중복과 디스키 낭비를 막을 수 있다.
- 실제 프로젝트 node_modules 에는 이걸 연결하는 Symbolic Link 만 달아줘서 pnpm store 에 연결해서 가져오고 만약에 프로젝트 내에서 공유해야 되는 내용이 있다면 그것에 대해서도 Symbolic Link 를 달아서 서로 참조하게 된다
다운로드 수를 줄이고 링크를 사용해서 효과적으로 개선 하려고 한것
npm 과 yarn 으로 프로젝트 100개를 컴퓨터에 다운을 받는다고 치면 node_modules 가 컴퓨터에 100개 다운 받아지게 될 거다
Yarn v2
- node_modules 개념을 아예 없애버리려고한 움직임을 가지고 있다.
- 일반 Yarn 과 다른게 Yarn2는 yarn set version berry 라는 병령어를 통해서 사용을 할 수 있다.
- node_modules 와 node 에 내장된 의존성 관리 없이 의존성을 관리 하고 싶다.
- 디렉토이에 node_modules 가 없다.
- pnp.cjs 이 생김
- //Cache 디렉토리
- cache 에 저장되는 것은 zip 인데 파일 패키지를 zip 파일로 저장을 한다.
- 이점
- Zero Install (Yarn install 을 불필요)
- 오프라인시에 캐싱기능으로 사용가능
- ci 배포시에 clone 만 하면 의존성이 다 있기 때문에 배포 속도를 줄일 수 있다.
- 폴더나 파일수가 굉장히 많이 줄어들고 용량도 줄어든다.
- 이점
- cache 에 저장되는 것은 zip 인데 파일 패키지를 zip 파일로 저장을 한다.
- 어떻게 관리하냐가 yarn berry 의 가장 주요한 문제점이었을 것이다 그래서 yarn berry 가 제시한 개념이 있다 -> Plug’n’Play
Yarn v2 - Plug’n’Play
- 직역을 하면 코드만 꼽으면 바로 실행할 수 있다는 뜻
- pnp.cjs
- 쉽게 얘기하면 일종의 지도
- 어떤 패키지 인지 명시
- 어떤 버전 인지 명시
- 어느 위치에 있는지 명시
- 어떤 의존을 참조하고 있는지 명시
- zip 파일들을 pnp.cjs 를 따라서 찾아가면서 yarn berry 가 작동 한다.