1. 탐구

yarn classic과 yarn berry는 각각 어디서 모듈을 관리할까?

yarn classic은 yarn V1, yarn berry는 yarn V2이후를 말한다.

yarn classic에서는 node_modules에서 패키지를 관리한다. yarn berry에서는 .yarnrc.yml에서 어디서 관리할 지 설정할 수 있는데, nodeLinker를 node-modules로 설정한다면 node_modules에서, pnp로 설정한다면, .yarn/cache에서 zip형태로 관리한다.

yarn에는 yarn.lock이 있다면, package-lock.json은?

package-lock.json은 npm의 버전을 관리하기 위한 파일이다. yarn classic(yarn V1)의 yarn.lock과 같은 개념이다. 이는 버전에 대한 정보를 담고 있기에 저장소에 업로드해야한다.

2. 개발

1. npm

  1. npm init -y

    package.json이 생성된다.

    // package.json
    {
      "name": "npm",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC"
    }
    

    npm폴더에서 npm init -y를 입력했기에, name은 자동으로 npm이 된다.

  2. npm install

    package-lock.json이 생성된다. 패키지에 대한 버전을 고정하기 위함이다.

    // package-lock.json
    {
      "name": "npm",
      "version": "1.0.0",
      "lockfileVersion": 3,
      "requires": true,
      "packages": {
        "": {
          "name": "npm",
          "version": "1.0.0",
          "license": "ISC"
        }
      }
    }
    

    설치된 패키지가 없기에, 별 내용이 없다.

  3. react를 설치한다.

    package.json, package-lock.json에 변화가 생기고, node_modules폴더가 생성된다.

    1. package.json

      // package.json
      {
        // ..
      	"dependencies": {
          "react": "^18.2.0"
        }
      }
      
      • ^18.2.0은, major버전만 고정한다는 뜻이다.
    2. package-lock.json

      // package-lock.json
      {
      	// ..
      	"packages":{
      		"": {
            "name": "npm",
            "version": "1.0.0",
            "license": "ISC",
            "dependencies": {
              "react": "^18.2.0"
            }
          },
      		"node_modules/js-tokens": {
            "version": "4.0.0",
            "resolved": "<https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz>",
            "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
          },
          "node_modules/loose-envify": {
            "version": "1.4.0",
            "resolved": "<https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz>",
            "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
            "dependencies": {
              "js-tokens": "^3.0.0 || ^4.0.0"
            },
            "bin": {
              "loose-envify": "cli.js"
            }
          },
          "node_modules/react": {
            "version": "18.2.0",
            "resolved": "<https://registry.npmjs.org/react/-/react-18.2.0.tgz>",
            "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
            "dependencies": {
              "loose-envify": "^1.1.0"
            },
            "engines": {
              "node": ">=0.10.0"
            }
          }
      	}
      }
      

      react의 의존성에 대한 정보가 추가되었다.

      node_modules/react 등에 대한 version을 명확하게 명시하고 있다. 그리고, 각 의존하고 있는 패키지를 명시하고 있다.

    3. node_modules

      Untitled

      node_modules에는 react 뿐 아니라 다른 패키지도 함께 설치가 되었다.

      모두 package-lock.json에서 본 패키지명들이다.

      node_modules안에도 .package-lock.json이 있는데, 이는 외부에 있는 package-lock.json과 내용이 정확하게 일치한다. node_modules에서 접근하기 쉽게 만든 복사본인 듯하다.

      이 때, react만 설치했음에도 react의 의존성 모듈들이 같은 depth에 설치되었는데 이것이 바로 node_modules의 깊이가 너무 깊어지는 것을 방지하기 위해 hoisting으로 끌어올려 설치하는 것이다. 이 hoisting은 유령 의존성 문제를 일으키는 원인이기도 하다.

      • 각 패키지

        Screenshot 2024-02-06 at 11.52.38 AM.png

        각 패키지에는 하나의 레포지토리처럼 모든 것이 세팅되어있다.

      • loose-envify? js-tokens?

        • js-tokens : Javascript를 토큰화하는 라이브러리이다.
        • loose-envify : js-tokens를 사용하여 process.env를 replace해주는 라이브러리이다.

결론

  1. npm은 package.json에서 패키지를 관리하고, package-lock.json에서는 패키지의 정확한 버전을 관리할 수 있도록 돕는다.
  2. 패키지를 설치하면, package-lock.json이 자동으로 생성되어 버전을 명시한다.
  3. 패키지를 설치하면, 해당 패키지 뿐 아니라, 패키지에 종속된 패키지들 또한 함께 저장이 되며, 이는 package-lock.json에 모두 명시가 되고, node_modules에 설치가 된다.

2. yarn(v1.22.19, yarn classic)