2022.01.14

rin·2022년 1월 14일
1

npm, yarn

Package가 왜 생겼을까?

  • Html, Css, JS 삼위일체..
  • Html -> css는 style, link, tag 중 하나 이용 / js는 script or script tag 이용
  • 레거시에서는 js, css 파일을 WAS에서 만드는 jsp(준 html)에 끼워넣어서 사용
    • js는 순서가 중요 (인터프리터) -> 순서 꼬이면 망함
    • css는 파일이 너무 많아져서 도메인 샤딩문데, 점수제/class 를 모든 페이지 마다 지정해줘서 관리해야하는 문제
  • Lib에 대한 관심 증가
    1. CDN 방식 <script src=""></script> : CDN에서 직접 당겨서 사용함
    2. Bower : twitter에서 개발. CDN이 셧다운됐을 때 미러링이 안됨 = CDN 죽으면 내 사이트도 죽음. CDN에 올라와있는 library를 실제 프로젝트 폴더에 다운받아줌. package의 개념이 없고 사용자가 등록한 폴더를 통으로 다운받아줌. Bower에 등록된 코드를 통으로 받아서 서비스. lisence, copyright에 대한 개념이 적었다.
    3. npm : 이쯤부터 webpack이 등장.

Project

  • 두 가지로 구성 : Package(npm / yarn), Bundler(webpack / snowpack / rollup ..)
    • Bundler : webpack이 짱이다. snowpack은 신흥강자. esBuild(?). webpack은 완전히 마스터해야함(자유자재로 다룰 수 알아야함) 웹팩만 이해하면 다른 것들도 사용하기 쉬울것임 + babel, coreJs

Package
npm

  • node 만든 애들이 만들어서.. node 설치할 때 같이 깔림
  • nodejs 프로젝트의 manifasto(매니페스토는 개인이나 단체가 대중에 대하여 확고한 정치적 의도와 견해를 밝히는 것으로 연설이나 문서의 형태)가 필요하다고 생각함 = package.json
  • npm init 실행하면 package.json 생성되는데 얘가 가장 기본의 매니페스토임
  • package.json에 작성된 내용을 기준으로 npm과 상호작용된다. -> npm에 퍼블리싱할 때 영향을 미치는 각 속성들 알아본다.❗️
  • import 에서는 package.json를 보고 라이브러리의 파일을 적절하게 가져온다. (실제로 nodejs는 required 라는 구문을 사용함)
  • package.json이 없는 기존의 link/bower는 npm과 호환이안됨. 즉, 얘네는 package가 아님
  • dependencies <> dev-dependencies : nodejs 개발할 때는 조금 차이가 있으니 이해해두도록한다. 즉, 실제 차이가 나는건 서버 개발시 --production flag를 추가한 install.
  • package.json은 import의 근간이다. 스펙을 정의하는 것. 이 패키지가 어떤 의존성이 있고, 어떤 파일부터 시작되는지 알 수 있다.
  • lock file.. install한 시점의 버전 스냅샷.
    • semver
    • node version, yarn version이 다르면 lock file이 업그레이드 될 수 있음 (충돌날 수 있음)
    • 누군가가 지웠다가 다시 만든 경우도 다를 수 있음..

yarn

  • npm은 파일 시스템을 많이 써서 리소스 소모면에서 약점이 있었다.
  • facebook이 만든 새로운 package system
  • npm이 가지고 있던 고질적인 파일시스템 문제를 해결하는게 주요 목표였음
  • cold build ?? zero install ??
    • npm과 yarn의 발전 방향성은 약간 차이가 있음
    • npm은 package system을 유지하고 있는 기본적인 시스템을 만들어낸 선구자
    • npm은 빌드체인이 있어서.. 중간에 하나만 깨져도 다 터짐
    • yarn이 이를 안전하게 빌드할 수 있도록 cold build에 대해 관심이 많음. 지속적으로 멱등성을 유지하려함.
  • yarn beta version -> yarn2 = yarn berry
    • yarn berry zero install하면 인스톨한 모든 라이브러리를 zip파일로 만들어서 git같은 곳에 올려두고 빠르게 가져올 수 있음

🤔
WAS-html + WEB-css,js 로 관리했던게 레거시
파일이 늘어가고, 정렬문제가 생기면서 library 사용이 대두되고, 이를 잘 관리하기 위해서 package manager가 나타남 -> npm이 생겨나고 프로젝트 단위로 관리되면서 Bundler를 이용.

Bundler
목표 : 기계가 js 의존성을 정의할 수 있도록 하자!!

package를 이용해서 서드파티를 관리하려고 함. 파일과 파일은 서로 연관된 트리가 있을 것. (각각은 import로 이뤄져 있음 import A from B)
🎉 import 문을 이용해서 트리구조를 만들 수 있게됨!

  • import A from 'react' : 가장 가까운 node_modules를 찾음
  • import A from '/react' : 절대경로
  • import A from './react' : 상대경로, 현재 폴더에서 찾아올라감 -> 없으면 가장 가까운 node_modules를 찾아감. node_modules에서 찾는게 목적이면 ./node_modules/react로 쓰는게 더 안전하긴함. 좋은건 아님.
  • from절에 어떻게 들어갔냐에 따라서 특정 알고리즘에 의해 다르게 해석됨. -> nodejs의 기본룰을 따라가게 되어있음.

선후관계를 만들어 줄 때 키🗝는 import임

  • 파일의 시작인 entry를 가져와서 파일의 모임인 chunk를 만들어 트리구조를 만듦
  • 백그라운드에 있는 모든 것들도 webpack이 로딩을 하게 되어있음.

js나 css를 빌드 직접하는게 아니라, 웹팩을 설정함으로써 통합개발환경을 구성한다.
CRA에는 Pre-defined된 webpack이 있음.. 웹팩 설정과 디펜던시를 뒤에서 쫙 설치해준담에 얘네가 가지고 있는 프로젝트 구성을 토대로 만들어줌.
-> 웹팩만 쓸 줄 알면 넘어갈 수 있음.

*Babel.. 웹팩과 거의 한 몸임.. 없으면 개발안되는 수준.

Mono-repo

  • lerna / yarn workspace
  • 멀티프로젝트와 유사함. 멀티 패키지
  • package.json이 루트에 있고, packages 폴더 하위에 각각 package.json을 가진 다수의 package가 있다.
    • private: true인 경우 npm repository에 publishing 할 수 없음. (보통 최상위에 설정해서 껍데기는 퍼블리싱 못하게한다.)
  • lerna는 cli가 아닌 javascript library라서 yarn처럼 작동하려고 learn.json이라는 설정파일이 필요함.
  • workspace는 각각의 패키지를 관리하는게 주목적(통합 tool), lerna는 각 패키지에 커맨드를 날리는 목적이 더 큼(lerna를 설치하면 lerna 설정파일에 있는 커맨드를 이용해서 각 패키지에 커맨드를 날릴 수 있음)
    • 퍼블리싱에는 lerna
    • 매니지먼트는 workspace
  • 그래서 왜 쓰냐?
    • 디펜던시 정의안해도 workspaces 이용해서 자동으로 셋팅해준다!
profile
🌱 😈💻 🌱

0개의 댓글