yarn berry

Node.js를 위한 패키지 관리 시스템.

node_modules의 문제

  1. node_modules는 일반적으로 매우 큰 공간을 차지한다.

  2. npm 및 yarn1 에서는 중복 해서 설치되는 node_modules를 위해 끌어올리기(Hoisting)기법을 사용하는데 이때 유령 의존성(Phantom Dependency) 문제가 발생한다. 유령의존성 현상이 발생하면 package.json에 명시하지 않은 라이브러리를 사용할 수 있는 현상이 발생한다.

    Untitled.png

  3. require, import 명령어에 걸리는 시간이 오래걸린다.

    node_modules를 통한 패키지 찾기는 해당 패키지를 찾기 위해서 계속 상위 디렉토리의 node_moduels 폴더를 탐색하는데, 바로 찾지 못한다면 느린 I/O 명령어를 계속 실행하게 되어 비효율적이다.

    하지만 pnp를 사용하게 되면 pnp.cjs 파일에 path에 대한 정보가 명시되어 있기 때문에 느린 I/O 명령어가 많이 사용되지 않는다.

    //pnp.cjs
     	["react", [\\
            ["npm:18.0.0", {\\
              "packageLocation": "./.yarn/cache/react-npm-18.0.0-fdbcb4c477-293020b965.zip/node_modules/react/",\\
              "packageDependencies": [\\
                ["react", "npm:18.0.0"],\\
                ["loose-envify", "npm:1.4.0"]\\
              ],\\
              "linkType": "HARD"\\
            }]\\
          ]]
    
  4. 환경에 따라 달라지는 동작

    3번의 특성에서 상위 디렉토리로 올라가면서 폴더를 탐색하는데 이때 상위 디렉토리가 어떤 node_modules를 포함하고 있는지에 따라 의존성을 불러올 수도 있기도 하고 없기도 하다. 환경에 따라 동작이 변하면 해당 상황을 재현하기 까다로워지고 클라우드 환경에 배포했을 때 문제가 생길 수 있다.

Yarn Berry 장점

  1. Yarn Berry는 Plug ‘n’ Play를 지원한다. 이때 pnp.cjs 파일로 dependency를 관리
  2. Zero install를 사용한다면 cache 된 파일을 직접 git에 올려놓음으로써 사용자들이 모두 같은 환경에서 개발을 할 수 있다는 장점이 있다.
  3. package.json에 맞게 node_modules를 갱신하기 위한 반복적인 yarn install을 할 필요가 없다. 브랜치를 체크 아웃할 때마다 .yarn/cache 폴더에 있는 의존성도 커밋으로 잡혀있기 때문에 파일들처럼 취급되어 함께 변경된다.
/* react 패키지 중에서 */
["react", [
  /* npm:17.0.1 버전은 */
  ["npm:17.0.1", {
    /* 이 위치에 있고 */
    "packageLocation": "./.yarn/cache/react-npm-17.0.1-98658812fc-a76d86ec97.zip/node_modules/react/",
    /* 이 의존성들을 참조한다. */
    "packageDependencies": [
      ["loose-envify", "npm:1.4.0"],
      ["object-assign", "npm:4.1.1"]
    ],
  }]
]],

monorepo

Untitled.png

- /.husky
- /packages
  - common-components
	- common-utils
	- common-styles
  - common-hooks
  - prototype-a
  - prototype-b
- .eslintrc.json
- .prettierrc.json
- lint-staged.config.js
- tsconfig.json

Reference