npm 설치는 어떻게 내부에서 작업합니까?

11255 단어 npmjavascriptnode
대부분의 현재 발생하고 있는 프레임은 노드와 비슷하다.js, 반응.js,vue,angular 등은 모두 npm를 등뼈로 구축한 것이다.npm 등록표는 각종 프레임워크에 사용되는 라이브러리나 의존항을 유지합니다.
이 글은 다음 내용을 이해하는 데 도움이 될 것이다.
  • 집행할 때 발생하는 일의 배후 논리npm install.
  • 다운로드의 의존항 순서와 node_modules 폴더 구조.
  • 선결 조건:
  • 모든 JS 프레임워크의 기본 지식

  • 다음 중 하나를 설치하여 다음 예시를 시험적으로 사용하시오.
  • 노드와npm
  • nvm(노드 버전 관리자, 기계의 서로 다른 버전의 노드와 npm를 관리하는 데 사용)
  • docker compose(용기에서 노드 응용 프로그램 사용)

  • 우리가 npm install를 집행할 때 무슨 일이 일어날까요?
    명령npm install이 npm 등록표에서 의존 모듈을 다운로드하는 것을 우리는 모두 알고 있다.
    이것은 아래의 어떤 방식으로도 실현할 수 있다.
  • npm install - 의존 관계 트리에서 언급한 모든 의존 관계를 가져옵니다.
  • npm install <dependency_name> 또는 npm install <dependency_name>@<version> - 이름과 버전별로 특정 의존항을 가져옵니다(버전이 지정되지 않으면 최신 버전을 가져옵니다).
  • npm install <git remote url> - github,bitbucket 또는gitlab로 전송되는 라이브러리를 가져옵니다.
  • npm install의 작업을 단순화하는 알고리즘:
  • 폴더가 존재하거나 존재하는지 node_modules 확인하고 관계 트리(폴더 구조)에 의존하는 기존 폴더, 복제 트리(또는 빈 트리 생성)를 추적합니다.
  • 종속 항목(개발, 프로덕션 또는 직접 종속 항목)을 가져오고 클론에 추가합니다(1단계).
  • 트리 간의 차이를 찾고 부족한 의존항을 추가합니다.
  • 의존항은 가능한 한 나무 꼭대기에 가까운 위치에 추가됩니다.
  • 의존항이 포함될 때 나무의 다른 뿌리/분지를 방해하지 않습니다.
  • 원본 트리(2단계)와 클론 트리(1단계)를 비교하고 노드 모듈에서 새 트리를 복제하는 데 필요한 조치를 나열합니다.
  • 작업에는 설치(새 의존항), 업데이트(기존 의존항 버전), 이동(트리의 의존항 위치 변경), 삭제(새 트리에 필요하지 않은 라이브러리 마운트 해제)가 포함됩니다.
  • 모든 확인된 작업을 수행합니다(우선).
  • package-lock.json의 폴더 구조:
    npm에서 따르는 폴더 구조는 다음과 같이 변경됩니다.
  • 기존 노드 모듈 또는 패키지 잠금이 없습니다.json이나 패키지의 의존항입니다.json.
  • 기존 노드 모듈 또는 패키지 잠금이 없습니다.하지만 가방.의존 항목 목록이 있는 json을 사용할 수 있습니다.
  • 기존 노드 모듈이 없지만 패키지 잠금.제이슨과 가방.의존 항목 목록이 있는 json을 사용할 수 있습니다.
  • 노드 모듈, 패키지 잠금.제이슨과 가방.의존 항목 목록이 있는 json은 모두 사용할 수 있습니다.
  • 1. 기존 노드 모듈이나 패키지 자물쇠가 없습니다.json이나 패키지의 의존항입니다.json:
    이 간단한 예는 어떤 JS 프레임워크 프로그램도 처음 시작할 때 의존 관계가 없고 하나씩 추가하는 것이다.
    이 경우 종속 항목은 다음과 같은 설치 순서로 다운로드됩니다.
    예: 새 응용 프로그램에서 실행package.json.
    여기node_modules는 의존항으로 npm install <B>에 내부 의존항이 있다고 가정하면 모두 B의 루트 단계에 설치되어 있다.
    추론: 모든 의존항과 내부 의존항은 노드 모듈의 뿌리에서 자리를 잡으려고 시도한다. 같은 의존항과 충돌이 존재하지 않는 한 버전이 다르다.
    노드 단위
    |_B
    |[email protected]
    2. 기존 노드 모듈 또는 패키지 잠금이 없습니다.하지만 가방.종속성 목록이 있는 json에서는 다음을 사용할 수 있습니다.
    이 경우, 프로그램의 의존 항목은 패키지에 열거됩니다.파일을 잠그는 json이 없습니다.
    예: 패키지가 포함된 응용 프로그램 디렉토리에서 실행[email protected]합니다.다음과 같은 종속성이 있는 json:
    {
      "dependencies": {
        "A": "1.0.0",
        "B": "2.0.0"
      }
    }
    
    여기node_modules는 내부npm install에 의존하고A[email protected]에 의존한다.
    추론: 모든 의존항과 내부 의존항은 노드 모듈의 뿌리에서 자리를 잡으려고 시도한다. 같은 의존항과 충돌이 존재하지 않는 한 버전이 다르다.충돌이 발생하면 필요한 모든 의존항 아래에 하위 노드 modules를 생성하고 충돌의 내부 라이브러리를 전송합니다.
    노드 단위
    |_A
    |_α@v1.0
    |_B
    | uu 노드 u 모듈
    | [email protected]
    3. 기존 노드 모듈이 없지만 패키지 잠금.제이슨과 가방.종속성 목록이 있는 json에서는 다음을 사용할 수 있습니다.
    가령 B 내부는 [email protected]에 의존하고 A[email protected]B에 의존한다.
    소포 자물쇠.json 코드 세그먼트:
    {
      "dependencies": {
        "A": {
          "version": "1.0.0",
          "resolved": "NPM REGISTRY URL of A",
          "requires": {
            "alpha": "1.0.0"
          }
        },
        "alpha": {
          "version": "1.0.0",
          "resolved": "NPM REGISTRY URL of alpha v1",
        },
        "B": {
          "version": "2.0.0",
          "resolved": "NPM REGISTRY URL of B",
          "requires": {
            "alpha": "2.0.0",
            "beta": "3.0.0"
          },
          "dependencies": {
            "alpha": {
              "version": "2.0.0",
              "resolved": "NPM REGISTRY URL of alpha v2",
            }
          }
        },
        "beta": {
          "version": "3.0.0",
          "resolved": "NPM REGISTRY URL of beta v3",
        }
      }
    }
    
    추정: 가방의 정렬 의존 관계를 고려하지 않습니다.json에서 패키지는 패키지 자물쇠가 정의한 트리 구조에 설치됩니다.json.
    이로 인해 발생하는 의존 트리 구조는 다음과 같다.
    노드 단위
    |_A
    |_α@v1.0
    |_B
    || uu 노드 u 모듈
    || [email protected]
    |[email protected]
    4. 노드 모듈, 패키지 잠금.제이슨과 가방.json 모두 사용 가능:
    node modules 폴더는 package lock에서 가져온 새 트리와 일치하도록 재배치됩니다.json, 그리고 자물쇠에 정의된 순서대로 설치합니다.json 파일.
    [email protected](vs)[email protected]:
    새로운 프로그램에서 기존 의존 트리나 노드 모듈이 없는 상황에서 의존항의 설치 순서는 다음과 같습니다.
    예:
    가령 Package.json 내부는 Package-lock.json에 의존하고 A[email protected]에 의존한다.
    npm
    정경
    정경
    명령하다
    npm 설치
    npm 설치 B
    npm 설치 B
    npm 설치
    소포.json
    {
    종속성:
    “A”:“1.0.0”,
    “B”:“2.0.0”
    }
    }
    {
    종속성:
    “A”:“1.0.0”,
    “B”:“2.0.0”
    }
    }
    소포 자물쇠.json
    {
    종속성:
    “A”:{
    버전: 1.0.0,
    필요:
    “alpha”:“1.0.0”,
    }
    },
    알파:
    버전: 1.0.0,
    },
    “B”:{
    버전: 2.0.0,
    필요:
    “alpha”:“2.0.0”,
    },
    종속성:
    알파:
    버전: 2.0.0,
    }
    }
    }
    }
    }
    {
    종속성:
    “A”:{
    버전: 1.0.0,
    필요:
    “alpha”:“1.0.0”,
    },
    종속성:
    알파:
    버전: 1.0.0,
    }
    }
    },
    알파:
    버전: 2.0.0,
    },
    “B”:{
    버전: 2.0.0,
    필요:
    “alpha”:“2.0.0”,
    }
    }
    }
    }
    노드 단위
    노드 단위
    |_A
    |_α@v1.0
    |_B
    || uu 노드 u 모듈
    || [email protected]
    노드 단위
    |_A
    || uu 노드 u 모듈
    || [email protected]
    |[email protected]
    |_B
    위의 비교는 가방 자물쇠의 중요성을 총결하는 데 도움이 된다.json.
    패키지'alpha'가 JS 프로그램에서 가져온 경우B 장면 1은 v1을 가리키고 장면 2는 v2를 가져옵니다.
    따라서 가져온 파일에 따라 코드 세그먼트의 동작이 다를 수 있습니다.
    이것은 소포가 아니다.트리 구조를 확인하는 json (npm install은 패키지. json에 저장된 알파벳 순서에 따라 의존항을 다운로드하기 때문).
    기억해라. 가장 좋은 방법은 소포 자물쇠를 추진하고 유지하는 것이다.이 프로젝트를 사용하는 모든 구성원이 같은 의존 관계 트리를 사용할 수 있도록 json을 원본 코드 (예:git) 로 변환합니다.

    참조 자료:
  • npm설치기초-https://docs.npmjs.com/cli/install
  • npm 폴더 기초 - https://docs.npmjs.com/configuring-npm/folders.html
  • 팩.json기초지식-https://docs.npmjs.com/files/package.json
  • 소포 자물쇠.json기초지식-https://docs.npmjs.com/configuring-npm/package-lock-json.html
  • 좋은 웹페이지 즐겨찾기