>  기사  >  웹 프론트엔드  >  Node.js의 package.json에 있는 라이브러리 버전 번호 소개

Node.js의 package.json에 있는 라이브러리 버전 번호 소개

不言
不言앞으로
2019-04-02 10:15:561848검색

이 글은 Node.js의 package.json 라이브러리 버전 번호를 소개합니다. 이는 특정 참조 가치가 있으므로 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

~와 ^

의 차이점 최근 로컬에서는 문제가 없었으나 온라인상에서 문제가 발생하여 나중에 node_modules 디렉토리를 삭제하고 재설치하니 문제가 발생했습니다. 이 문제를 로컬에서 재현하고 git 기록을 살펴보았습니다. 아무도 package.json의 버전 번호를 수정하지 않았기 때문에 package.json의 라이브러리 버전 번호를 자세히 살펴보았습니다.

~와 ^

    "babel-loader": "^7.1.1",
    "body-parser": "~1.15.2"

npm install --save xxx, ~ 대신 ^ 사용에 우선순위를 부여합니다.^而不是~

以版本号x.y.z为例
x:主版本号, 当你做了不兼容的API修改
y:次版本号, 当你做了向下兼容的功能性问题
z:修订号, 当你做了向下兼容的问题修复

~x.y.z, 会更新到y最新的版本, 例如 body-parser: ~1.15.2, 这个库会去匹配到1.15.z的最新版本, 如果出现了1.16.0, 则不会自动升级
^x.y.z, 会更新到x的最新版本, 例如 babel-loader: ^7.1.1, 这个库会去匹配7.y.z的最新版本, 如果出现了8.1.1, 则不会自动升级

可以参考npm官方给出的解释
^1.2.3 := >=1.2.3 <2.0.0
^0.2.3 := >=0.2.3 <0.3.0
^0.0.3 := >=0.0.3 <0.0.4

大多数情况下遵循这种版本号规则的依赖包都没问题, 但是npm是开源的世界, 并不是所有的都严格遵循这种规则, 所以会出现上述的问题;

为什么需要package锁

有如下几个可能原因, 在某些情况下, package.json是无法保证每个人自己电脑上执行的 npm install 后安装的依赖版本都是一样的
1.如果package.json中记录的依赖包的版本是一个版本范围, 一旦执行npm i 会导致这个包更新到最新版本
2.就算你依赖了一个固定版本的包(如A 1.1.1), 但你依赖的包A可能依赖其他的包B,而A在声明依赖时可能也使用了semser命名, 如 ^1.2.3, 如果包B release 了新版, 也会导致包B会安装到更新版本
3.不同人使用的npm程序的版本不同

如果依赖包的版本不一致, 会导致开发环境和生产环境产品不一致的行为; 或者导致不同团队成员之前也产品环境差异

如何解决包版本不一致的情况

1.npm 使用package-lock.json文件来解决这个问题

执行npm install会自动生成package.json文件, 只要执行普通的安装, 更新等可能会修改 package.json的npm命令, 都会自动同步修改package-lock.json文件

npm install xxx
npm rm xxx
npm update xxx

2.npm 还支持npm-shrinkwrap.json, 和package-lock.json功能完全一样

执行 npm shrinkwrap
버전 번호 x.y.z를 예로 들어

x: 주요 버전 번호, Compatible API 수정을 합니다

y: 부 버전 번호, 이전 버전과 호환되는 기능 문제가 있는 경우

z: 개정 번호, 이전 버전과 호환되는 수정이 있는 경우

~x.y.z, 최신으로 업데이트됩니다. y 버전(예: body-parser): ~1.15.2. 이 라이브러리는 1.15.z의 최신 버전과 일치합니다. 1.16.0이 나타나면 자동으로 업그레이드되지 않습니다. >^x.y.z는 최신 버전의 x로 업데이트됩니다(예: babel-loader: ^7.1.1). 이 라이브러리는 다음과 같은 경우 최신 버전의 7.y.z와 일치합니다. 8.1.1로 나오며 자동으로 업그레이드되지 않습니다
  • npm의 공식 설명을 참고하세요
  • ^1.2.3 := >=1.2.3 <2.0.0
  • ^0.2.3 := > ;=0.2.3 <0.3.0
  • ^0.0.3 := >=0.0.3 <0.0.4

  • 대부분의 경우 이 버전 번호 규칙을 따르는 종속 패키지는 괜찮지만 npm은 개방형입니다. 소스 세계에서는 모두가 이 규칙을 엄격하게 따르지는 않으므로 위의 문제가 발생합니다.
    패키지 잠금이 필요한 이유

    어떤 경우에는 package.json이 모든 사람에게 보장되지 않을 수 있습니다. 컴퓨터에서 npm install을 실행한 후 설치된 dependency 버전은 모두 동일합니다

    1. package.json에 기록된 종속 패키지의 버전이 해당 버전 범위 내에 있는 경우 npm i가 실행되면 해당 패키지가 최신 버전으로 업데이트됩니다.

    2. 당신도 패키지의 고정 버전(예: A 1.1.1)에 의존하지만 의존하는 패키지 A는 다른 패키지 B에 의존할 수 있으며 A는 ^와 같은 종속성을 선언할 때 semser 이름 지정을 사용할 수도 있습니다. 1.2.3. 패키지 B가 새 버전을 출시하면 패키지 B도 최신 버전으로 설치됩니다

    3. 사람들마다 다른 버전의 npm 프로그램을 사용합니다🎜🎜종속 패키지의 버전이 일치하지 않는 경우 개발 환경과 프로덕션 환경 사이에 일관되지 않은 동작이 발생하거나 개발 환경과 프로덕션 환경 사이에 일관되지 않은 동작이 발생합니다. 이전에도 서로 다른 제품 환경을 사용했던 패키지 버전 문제를 해결하는 방법은 무엇입니까? 일반 설치, 업데이트 등은 package.json의 npm 명령을 수정하여 package-lock.json 파일을 자동으로 수정합니다. 🎜rrreee🎜2.npm은 package-와 동일한 기능을 가진 npm-shrinkwrap.json도 지원합니다. lock.json🎜 🎜npmshrinkwrap을 실행하여 npm-shrinkwrap.json🎜을 생성하세요. 이 명령은 package-lock.json 파일을 기반으로 새 npm-shrinkwrap.json 파일을 생성하거나 기존 npm-shrinkwrap.json 파일을 덮어씁니다. 이 명령으로 생성 및 업데이트된 파일은 기존 또는 향후 package-lock.json 파일보다 우선합니다. 🎜🎜3. 원사를 사용하세요🎜🎜원사를 사용하면 다음과 같은 주요 이점이 있습니다🎜🎜🎜빠름: 다운로드하는 각 패키지는 반복 다운로드 없이 캐시되어 리소스 활용도를 극대화할 수 있습니다.🎜🎜신뢰성: 사용된 형식이 상세하고 단순합니다. 종속성 설치를 위한 lockfile 파일과 결정적 알고리즘은 한 시스템에서 실행되는 설치 프로세스가 다른 시스템에서도 동일한 방식으로 실행되도록 보장합니다. 🎜🎜보안: 실행하기 전에 설치 패키지의 무결성을 확인하세요🎜🎜🎜yarn은 npm보다 빠릅니다. Yarn의 잠금 파일은 Yarn.lock이며, 이는 일관성 없는 패키지 버전 문제를 해결할 수 있습니다🎜🎜[관련 권장 사항: 🎜 JavaScript 비디오 튜토리얼 🎜】🎜🎜🎜

    위 내용은 Node.js의 package.json에 있는 라이브러리 버전 번호 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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