>  기사  >  웹 프론트엔드  >  NPM 메커니즘에 대한 심층적인 이해

NPM 메커니즘에 대한 심층적인 이해

不言
不言앞으로
2019-03-29 10:00:421833검색

이 기사는 NPM 메커니즘에 대한 심층적인 이해를 제공합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

NPM을 사용하여 설치할 때 패키지 충돌이 자주 발생합니다(예: 여러 기본 모듈의 하위 모듈 버전이 일치하지 않는 등). 이로 인해 개발 과정에서 크고 작은 다양한 문제가 발생합니다. 다음 내용을 모두 소개합니다.

  1. NPM 기본 설치 방법
  2. NPM 패키지 정보 쿼리
  3. NPM 설치 메커니즘(기본)

설치 및 쿼리 명령

NPM 다양한 설치 방법

  • npm install packageName[@next | @versionNumber]npm install packageName[@next | @versionNumber]

    • 在 node_modules 中没有指定模块时安装,(不检查~/.npm目录)
  • npm install packageName --f | -- force

    • 一个模块不管是否安装过,npm都要 强制重新安装
  • npm update packageName

    • 如果远程版本较新、或者本地版本不存在时安装

NPM 查询服务

  • NPM通过registry的查询服务,从而知道每个模块的最新版本。
  • 可以通过 npm view packageName [version] 查询对映模块的信息

NPM 安装机制

输入 npm install 命令并敲下回车后,会经历如下几个阶段(以 npm 5.5.1 为例):

1. 执行工程自身 preinstall

当前 npm 工程如果定义了 preinstall 钩子此时会被执行。

2. 确定首层依赖模块

首先需要做的是确定工程中的首层依赖,也就是 dependenciesdevDependencies 属性中直接指定的模块(假设此时没有添加 npm install 参数)。

工程本身是整棵依赖树的根节点,每个首层依赖模块都是根节点下面的一棵子树,npm 会开启多进程从每个首层依赖模块开始逐步寻找更深层级的节点。

如果查询node_modules目录之中已经存在指定模块,那么不再重新安装

3. 获取模块

获取模块是一个递归的过程,分为以下几步:

  • 获取模块信息

    • 在下载一个模块之前,首先要确定其版本,这是因为 package.json 中往往是 semantic version(semver,语义化版本)
    • 此时如果版本描述文件(npm-shrinkwrap.json 或 package-lock.json)中有该模块信息直接拿即可
    • 如果没有则从仓库获取(向registry查询)。如 packaeg.json 中某个包的版本是 ^1.1.0,npm 就会去仓库中获取符合 1.x.x 形式的最新版本。
  • 获取模块实体。

    • 上一步会获取到模块的压缩包地址(resolved 字段),npm 会用此地址检查本地缓存,缓存中有就直接拿,如果没有则从仓库下载。
  • 查找该模块依赖

    • 如果有依赖则回到第1步,如果没有则停止。

4. 模块扁平化(dedupe)

一步获取到的是一棵完整的依赖树,其中可能包含大量重复模块。比如 A 模块依赖于 loadsh,B 模块同样依赖于 lodash。在 npm3 以前会严格按照依赖树的结构进行安装,因此会造成模块冗余。

npm3 版本

node_modules에 모듈이 지정되지 않은 경우 설치됨(~/.npm 디렉터리를 확인하지 않음)

npm install packageName - - f | -- force
  • 모듈 설치 여부에 관계없이 npm은
  • 강제 재설치


npm 업데이트 패키지 이름

원격 버전이 더 최신이거나, 로컬 버전이 없을 때 설치하세요


NPM 쿼리 서비스

NPM은 레지스트리 쿼리 서비스를 사용하여 각 모듈의 최신 버전을 파악합니다.

npm view packageName [버전]을 통해 매핑된 모듈의 정보를 쿼리할 수 있습니다.


NPM 설치 메커니즘

npm install 명령을 입력하고 Enter 키를 누르면 다음 단계를 거칩니다. (예시로 npm 5.5.1부터 시작):


1. 프로젝트 자체의 사전 설치를 실행합니다

현재 npm 프로젝트에 사전 설치 후크가 정의되어 있으면 이때 실행됩니다.

🎜🎜2. 첫 번째 수준 종속성 모듈 결정 🎜🎜🎜가장 먼저 해야 할 일은 프로젝트의 첫 번째 수준 종속성을 결정하는 것입니다. 이는 종속성 및 devDependency 속성 모듈(현재 npm 설치 매개변수가 추가되지 않는다고 가정) 🎜🎜프로젝트 자체는 전체 🎜종속성 트리🎜의 루트 노드입니다. 각 첫 번째 수준 종속성 모듈은 루트 노드 아래의 하위 트리입니다. npm은 각 첫 번째 수준 종속성 모듈에서 시작하여 점차적으로 더 깊은 항목을 검색합니다. 레벨 노드. 🎜
지정된 모듈이 node_modules 디렉터리에 이미 있으면 다시 설치되지 않습니다.
🎜🎜3. 모듈 얻기 🎜🎜🎜 모듈 얻기는 다음 단계로 나누어지는 🎜재귀적🎜 프로세스입니다. 🎜 🎜🎜🎜모듈 정보 얻기🎜🎜🎜모듈을 다운로드하기 전에 먼저 해당 버전을 확인해야 합니다. 왜냐하면 package.json에는 시맨틱 버전(semver, semantic version)이 포함되어 있는 경우가 많기 때문입니다.🎜🎜 이때 버전 설명 파일이 (npm-shrinkwrap.json 또는 package-lock.json) 모듈 정보를 직접 가져옵니다. 그렇지 않은 경우 웨어하우스에서 가져옵니다(레지스트리로 쿼리). 예를 들어 packaeg.json의 패키지 버전이 ^1.1.0이면 npm은 웨어하우스로 이동하여 1.x.x 형식을 준수하는 최신 버전을 가져옵니다. 🎜🎜🎜🎜🎜모듈 엔터티를 가져옵니다. 🎜🎜🎜이전 단계에서는 모듈의 압축된 패키지 주소(해결된 필드)를 가져옵니다. npm은 이 주소를 사용하여 로컬 캐시에 있으면 직접 가져옵니다. 창고에서 다운로드했습니다. 🎜🎜🎜🎜🎜이 모듈의 종속성을 찾으세요🎜🎜🎜종속성이 있으면 1단계로 돌아가고 그렇지 않으면 중지하세요. 🎜🎜🎜🎜🎜🎜4. 모듈 평면화(중복 제거) 🎜🎜🎜한 단계로 얻을 수 있는 것은 다수의 중복 모듈을 포함할 수 있는 완전한 종속성 트리입니다. 예를 들어 모듈 A는 loadsh에 의존하고 모듈 B도 lodash에 의존합니다. npm3 이전에는 설치가 종속성 트리 구조에 엄격하게 기반을 두었기 때문에 모듈 중복이 발생했습니다. 🎜🎜npm3 버전부터 중복 제거 프로세스가 기본적으로 추가되었습니다. 모든 노드를 순회하여 노드 모듈의 첫 번째 수준인 루트 노드 아래에 모듈을 하나씩 배치합니다. 중복된 모듈이 발견되면 해당 모듈은 삭제됩니다. 🎜🎜여기서 중복 모듈 정의가 필요합니다. 이는 🎜이름이 같고 semver 호환이 가능한 모듈🎜을 의미합니다. 각 semver는 허용된 버전 범위에 해당합니다. 두 모듈의 허용된 버전 범위가 겹치는 경우 버전 번호가 정확히 동일하지 않아도 호환되는 버전을 얻을 수 있습니다. 이를 통해 중복 제거 프로세스 중에 더 많은 중복 모듈을 제거할 수 있습니다. 🎜🎜예를 들어 node-modules 아래의 foo 모듈이 lodash@^1.0.0에 의존하고 bar 모듈이 lodash@^1.1.0에 의존한다면 ^1.1.0이 호환되는 버전입니다. 🎜🎜그리고 foo가 lodash@^2.0.0에 의존하고 bar가 lodash@^1.1.0에 의존하는 경우 semver의 규칙에 따라 둘 사이에 호환되는 버전이 없습니다. 한 버전은 node_modules에 배치되고 다른 버전은 종속성 트리에 유지됩니다. 🎜🎜🎜예를 들어 종속성 트리가 원래 다음과 같다고 가정해 보겠습니다. 🎜🎜node_modules🎜-- foo🎜---- lodash@version1🎜🎜-- bar🎜---- lodash@version2🎜🎜version1과 version2가 호환 버전, 중복 제거 후 다음 형식이 됩니다. 🎜🎜node_modules🎜-- foo🎜🎜-- bar🎜🎜-- lodash (예약된 버전이 호환 버전입니다) 🎜🎜 버전1과 버전2가 호환되지 않는 버전이라고 가정하면 다음 버전은 종속성 트리에 남아 있습니다. 🎜🎜node_modules🎜-- foo🎜-- lodash@version1🎜🎜-- bar🎜---- lodash@version2🎜🎜🎜5 모듈을 설치합니다.

이 단계에서는 프로젝트의 node_modules를 업데이트하고 모듈의 라이프사이클 기능을 실행합니다(사전 설치, 설치, 사후 설치 순서).

6. 프로젝트 자체 생명주기 실행

현재 npm 프로젝트에 Hook이 정의되어 있으면 이때 실행됩니다( 설치, 사후 설치, 사전 게시, 준비 순서에 따라).

마지막 단계로 버전 설명 파일을 생성하거나 업데이트하면 npm 설치 프로세스가 완료됩니다.

이 기사는 여기서 끝났습니다. 더 흥미로운 내용을 보려면 PHP 중국어 웹사이트의 JavaScript 비디오 튜토리얼 칼럼을 주목하세요!

위 내용은 NPM 메커니즘에 대한 심층적인 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제