이번 프로젝트에서는 CRA, Vite 등을 활용하지 않고 직접 리액트 개발환경을 셋팅해주었다.
간단한 초기 설정을 하기 위해 다음과 같은 플로우로 진행했다.
1. 패키지 매니저 정하기
2. 웹팩, 플러그인, 로더 설치
3. webpack.config.js, tsconfig 설정
4. public 폴더 추가 및 App.tsx, index.tsx 파일 추가
5. eslint,prettier 설치 및 설정
수많은 패키지를 효율적으로 설치, 삭제, 업데이트하기 위해 패키지 매니저가 필요하다. 그렇다면 coduo 에서는 어떤 패키지 매니저를 선택했을까?
node.js의 모든 패키지와 모듈을 관리하며 CLI 클라이언트 npm으로 구성된다.
💡 우리의 목표는 라이브러리를 많이 쓰고, 커뮤니티를 많이 보는 것이 아닌 최대한 성능적으로 프로젝트를 개선하는 것이므로
Yarn
을 선택했다.
npm v2 이전에서는 패키지들을 설치할 때 중복되는 패키지들이 생성되어 디스크 공간을 낭비할 수 있다는 단점이 있었다.
그래서 이를 막기 위해 v3과 yarn 에서는 호이스팅을 활용하여 트리를 flat 하게 만들게 되었다. 하지만 충돌할 수 있는 패키지는 상위 모듈 아래에 두기 때문에 유령 의존성이 발생할 수 있다.
💡 유령 의존성
직접 의존하고 있지 않은 라이브러리를 require() 할 수 있는 현상. 위의 그림에서 package-1 이 B(2.0) 을 require 할 수 있게 됨.
다른 의존성을 package.json 에서 제거했을 때 소리없이 같이 사라지기도 해서 예측하기 어렵다.
유령 의존성을 해결하기 위해 다음과 같은 패키지 매니저가 등장했다.
yarn Berry 는 패키지 의존성을 node_modules 폴더에 저장하지 않고 .zip 파일로 압축하여 .yarn/cache
에 저장한다. 그리고 이를 찾기 위한 정보를 .pnp.cjs
파일에 기록한다.
→
.pnp.cjs
를 이용함으로써 별도의 디스크 I/O 작업 없이도 패키지의 위치를 정확히 알 수 있기 때문에 시간도 단축되고, 중복 설치를 방지하며, node_modules
를 만들고 패키지들을 호이스팅 시킬 필요가 없다.
node_modules를 직접 설치하는 대신, 전역 저장소(Virtual Store)에서 패키지를 공유하는 구조를 사용한다.
~/.pnpm-store
에 모든 패키지를 저장하는 저장소를 두고, 중첩된 패키지는 단 한번만 설치한다.즉 파일 이름으로 파일에 접근하지 않고 각 의존성 파일에 해시값을 부여해 관리한다. (중복 패키지는 동일한 해시 id)
프로젝트마다 node_modules
폴더에 symbolic(sym) link 를 만들어 연결
⇒ npm v2 처럼 중첩 구조, 중복된건 같은 해시값으로 !
레퍼런스
yarnBerry 나 pnpm 도 사용해보고 싶었지만 지금 프로젝트에서는 장점을 크게 느끼지 못할 것 같아 yarn으로 진행하기로 했다. 만약 불편하다고 느끼게 되거나 확실한 이유를 찾으면 마이그레이션 하기로 결정했다.
패키지 매니저를 정했으니 여러 패키지들을 설치해 주어야 하는데, 어떤것을 devDependency 로 설치해주어야 하는지 조금 헷갈렸다. 그래서 자세히 알아보았다.
yarn add -D 라이브러리명
로컬 환경에서 개발 및 테스트에만 필요한 패키지들이 정의되어 있다.
devDependencies에 포함된 라이브러리는 실제 배포할 때 포함되지 않기 때문에 빌드 시간을 줄일 수 있다.
ex) eslint, prettier ,react-dom, @types/jest, vite, file-loader, typescript …
프로덕션 환경에서 응용 프로그램을 실행시키기 위한 패키지들이 정의되어있다.
ex) @emotion/react, react-dom, @tanstack/react-query …
글씨체 어떻게 한거에요?