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형태로 관리한다.
package-lock.json은 npm의 버전을 관리하기 위한 파일이다. yarn classic(yarn V1)의 yarn.lock과 같은 개념이다. 이는 버전에 대한 정보를 담고 있기에 저장소에 업로드해야한다.
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이 된다.
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"
}
}
}
설치된 패키지가 없기에, 별 내용이 없다.
react를 설치한다.
package.json, package-lock.json에 변화가 생기고, node_modules폴더가 생성된다.
package.json
// package.json
{
// ..
"dependencies": {
"react": "^18.2.0"
}
}
^18.2.0은, major버전만 고정한다는 뜻이다.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을 명확하게 명시하고 있다. 그리고, 각 의존하고 있는 패키지를 명시하고 있다.
node_modules

node_modules에는 react 뿐 아니라 다른 패키지도 함께 설치가 되었다.
모두 package-lock.json에서 본 패키지명들이다.
node_modules안에도 .package-lock.json이 있는데, 이는 외부에 있는 package-lock.json과 내용이 정확하게 일치한다. node_modules에서 접근하기 쉽게 만든 복사본인 듯하다.
이 때, react만 설치했음에도 react의 의존성 모듈들이 같은 depth에 설치되었는데 이것이 바로 node_modules의 깊이가 너무 깊어지는 것을 방지하기 위해 hoisting으로 끌어올려 설치하는 것이다. 이 hoisting은 유령 의존성 문제를 일으키는 원인이기도 하다.
각 패키지

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