> 웹 프론트엔드 > JS 튜토리얼 > 이 글은 npm의 원리를 이해하는 데 도움이 될 것입니다.

이 글은 npm의 원리를 이해하는 데 도움이 될 것입니다.

青灯夜游
풀어 주다: 2022-08-09 09:23:02
앞으로
3141명이 탐색했습니다.

npm은 JavaScript 세계의 패키지 관리 도구이자 Node.js 플랫폼의 기본 패키지 관리 도구입니다. npm을 통해 코드를 설치, 공유, 배포하고 프로젝트 종속성을 관리할 수 있습니다. 이 글은 여러분에게 npm의 원칙을 안내할 것입니다. 여러분에게 도움이 되기를 바랍니다!

이 글은 npm의 원리를 이해하는 데 도움이 될 것입니다.

npm의 원리는

npm이 세계 최대의 패키지 관리자라고 하는데 이유는 정말 사용자 친화적이겠죠?

1. npm init

는 간단한 패키지를 초기화하는 데 사용됩니다. 파일. package.json 파일은 패키지 설명 파일을 정의하는 데 사용됩니다.

1. npm init 실행npm init的执行的默认行为

执行npm init --yes,全部使用默认的值。

2、 自定义npm init行为

npm init命令的原理是:调用脚本,输出一个初始化的package.json文件。

获取用户输入使用prompt()方法。

二、依赖包安装

npm的核心功能:依赖管理。执行npm i从package.json中dependencies和devDependencies将依赖包安装到当前目录的node_modules文件夹中。

2.1、package定义

npm i 就可以安装一个包。通常package就是我们需要安装的包名,默认配置下npm会从默认的源(Registry)中查找该包名的对应的包地址,并且下载安装。 还可以是一个指向有效包名的http url/git url/文件夹路径。

package的准确定义,符合以下a)到g)其中一个条件,他就是一个package:

이 글은 npm의 원리를 이해하는 데 도움이 될 것입니다.

package的准确定义

2.2、安装本地包/远程git仓库包

共享依赖包,并非非要把包发布到npm源上才能使用。

1)、场景1:本地模块引用

开发中避免不了模块之间调用,开发中,我们把频繁调用的配置模块放在根目录,然后如果有很多层级目录,后来引用

const config = require(''../../../../..config)
로그인 후 복사

这样的路径引用不利于代码重构。这时候我们需要考虑把这个模块分离出来供其他模块共享。比如config.js可以封装成一个package放到node_modules目录下。

不需要手动拷贝或者创建软连接到node_modules目录,npm 有自己的解决方案:

方案:

1、新增config文件夹,将config.js移入文件夹,名字修改为index.js,创建package.json定义config包

{ 
    "name": "config", 
    "main": "index.js", 
    "version": "0.1.0" 
}
로그인 후 복사

2、在项目的package.json新增依赖项,然后执行npm i。

{ 
  "dependencies": { 
    "config":"file: ./config" 
  } 
}
로그인 후 복사

查看 node_modules 目录我们会发现多出来一个名为 config,指向上层 config/ 文件夹的软链接。这是因为 npm 识别 file: 协议的url,得知这个包需要直接从文件系统中获取,会自动创建软链接到 node_modules 中,完成“安装”过程。

2)、场景2:私有git共享package

团队内会有一些代码/公用库需要在团队内不同项目间共享,但可能由于包含了敏感内容。

我们可以简单的将被依赖的包托管到私有的git仓库中,然后将git url保存到dependencies中。npm会直接调用系统的git命令从git仓库拉取包的内容到node_modules中。

npm支持的git url格式:

<protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>[#<commit-ish> | #semver:<semver>]
로그인 후 복사

git 路径后可以使用 # 指定特定的 git branch/commit/tag, 也可以 #semver: 指定特定的 semver range.

比如:

git+ssh://git@github.com:npm/npm.git#v1.0.27 
git+ssh://git@github.com:npm/npm#semver:^5.0 
git+https://isaacs@github.com/npm/npm.git 
git://github.com/npm/npm.git#v1.0.27
로그인 후 복사

3)、场景3:开源package问题修复

此时我们可以手动进入 node_modules 目录下修改相应的包内容,也许修改了一行代码就修复了问题。但是这种做法非常不明智!

方案:

fork原作者的git库,在自己的repo修复问题,然后将dependencies中的相应依赖改为自己修复后版本的git url就可以解决问题。

三、npm install如何工作

npm i执行完毕,node_modules中看到所有的依赖包。开发人员无关注node_modules文件夹的结构细节,关注业务代码中引用依赖包。

理解node_modules结构帮助我们更好理解npm如何工作。npm2到npm5变化和改进。

3.1 npm2

npm2在安装依赖包,采用的是简单的递归安装方法。每一个包都有自己的依赖包,每一个包的依赖都安装在自己的node_modules中,依赖关系层层递进,构成整个依赖树,这个依赖树与文件系统中的文件结构树一一对应。

最方便的依赖树的方式在根目录下执行npm ls

npm init --yes의 기본 동작은 모두 기본값을 사용합니다.

2. npm init 동작 사용자 정의
  • npm init 명령의 원리는 스크립트를 호출하고 초기화된 package.json 파일을 출력하는 것입니다.

    prompt() 메서드를 사용하여 사용자 입력을 받습니다.

2. 종속성 패키지 설치

🎜🎜npm의 핵심 기능: 종속성 관리. npm i를 실행하여 package.json의 종속성 및 devDependency에서 현재 디렉터리의 node_modules 폴더에 종속성 패키지를 설치합니다. 🎜🎜🎜2.1, 패키지 정의🎜🎜🎜npm i는 패키지를 설치할 수 있습니다. 일반적으로 package는 설치해야 하는 패키지의 이름입니다. 기본 구성에서 npm은 기본 소스(Registry)에서 패키지 이름에 해당하는 패키지 주소를 찾아 다운로드하여 설치합니다. 유효한 패키지 이름을 가리키는 http url/git url/폴더 경로일 수도 있습니다. 🎜🎜패키지의 정확한 정의는 다음 조건 a) ~ g) 중 하나를 충족하면 패키지입니다. 🎜

이 글은 npm의 원리를 이해하는 데 도움이 될 것입니다.🎜

정확한 정의 패키지 🎜🎜🎜2.2. 로컬 패키지/원격 Git 웨어하우스 패키지 설치 🎜🎜🎜공유 종속성 패키지를 사용하기 위해 npm 소스에 게시할 필요는 없습니다. 🎜🎜1), 시나리오 1: 로컬 모듈 참조 🎜🎜 개발 중에는 모듈 간 호출을 피할 수 없습니다. 개발 중에는 자주 호출되는 구성 모듈을 루트 디렉터리에 두고 계층 디렉터리가 많으면 나중에 참조 🎜

{ 
    "scripts": { 
        "echo": "echo HELLO WORLD" 
    } 
}
로그인 후 복사
로그인 후 복사
🎜 경로 참조는 코드 리팩토링에 도움이 되지 않습니다. 현재로서는 다른 모듈이 공유할 수 있도록 이 모듈을 분리하는 것을 고려해야 합니다. 예를 들어 config.js를 패키지로 캡슐화하여 node_modules 디렉터리에 배치할 수 있습니다. 🎜🎜node_modules 디렉터리에 대한 소프트 연결을 수동으로 복사하거나 생성할 필요가 없습니다. npm에는 자체 솔루션이 있습니다. 🎜🎜 솔루션: 🎜🎜1 새 config 폴더를 추가하고 config.js를 폴더로 이동한 다음 index.js에 이름을 지정합니다. package.json을 생성하여 config package🎜
"scripts": { 
  "serve": "vue-cli-service serve", 
  "serve1": "vue-cli-service --serve1", 
  "serve2": "vue-cli-service -serve2", 
  "serve3": "vue-cli-service serve --mode=dev --mobile -config build/example.js" 
}
로그인 후 복사
로그인 후 복사
🎜2를 정의합니다. 프로젝트의 package.json에 종속성을 추가한 후 npm i를 실행합니다. 🎜
[ &#39;/usr/local/Cellar/node/7.7.1_1/bin/node&#39;, 
  &#39;/Users/mac/Vue-projects/hao-cli/node_modules/.bin/vue-cli-service&#39;, 
  &#39;serve&#39;, 
  &#39;--mode=dev&#39;, 
  &#39;--mobile&#39;, 
  &#39;-config&#39;, 
  &#39;build/example.js&#39; 
]
로그인 후 복사
로그인 후 복사
🎜node_modules 디렉터리를 보면 상위 config/ 폴더를 가리키는 config라는 추가 소프트 링크를 찾을 수 있습니다. 이는 npm이 file:protocol의 URL을 인식하고 이 패키지를 파일 시스템에서 직접 가져와야 함을 학습하기 때문입니다. "설치" 프로세스를 완료하기 위해 node_modules에 대한 소프트 링크를 자동으로 생성합니다. 🎜🎜2), 시나리오 2: 비공개 git 공유 패키지 🎜🎜팀 내 여러 프로젝트 간에 공유해야 하는 일부 코드/공용 라이브러리가 있지만 민감한 콘텐츠가 포함될 수 있습니다. 🎜🎜개인 Git 저장소에 종속 패키지를 호스팅한 다음 Git URL을 종속 항목에 저장할 수 있습니다. npm은 시스템의 git 명령을 직접 호출하여 git Warehouse의 패키지 내용을 node_modules로 가져옵니다. 🎜🎜npm에서 지원하는 git url 형식: 🎜
npm run scipt1 && npm run script2
로그인 후 복사
로그인 후 복사
🎜git 경로 뒤에 #을 사용하여 특정 git 브랜치/커밋/태그를 지정하거나 #semver: 특정 semver 범위를 지정할 수 있습니다.🎜🎜예: 🎜
npm run script1 & npm run script2
로그인 후 복사
로그인 후 복사
🎜3), 시나리오 3: 오픈 소스 패키지 문제 복구🎜🎜이때 node_modules 디렉터리에 수동으로 들어가서 해당 패키지 내용을 수정할 수 있습니다. 코드 한 줄을 수정하면 문제가 해결될 수도 있습니다. 하지만 이 접근 방식은 매우 현명하지 않습니다! 🎜🎜 해결 방법: 🎜🎜원본 작성자의 git 라이브러리를 포크하고 자신의 저장소에서 문제를 수정한 다음 종속성의 해당 종속성을 수정된 git URL 버전으로 변경하여 문제를 해결하세요. 🎜🎜🎜3. npm 설치 작동 방식 🎜🎜🎜npm i가 실행되고 모든 종속 패키지가 node_modules에 표시됩니다. 개발자는 node_modules 폴더의 구조적 세부 사항에는 주의를 기울이지 않지만 비즈니스 코드에서 참조되는 종속성 패키지에 중점을 둡니다. 🎜🎜node_modules 구조를 이해하면 npm 작동 방식을 더 잘 이해하는 데 도움이 됩니다. npm2에서 npm5로 변경 및 개선되었습니다. 🎜🎜🎜3.1 npm2🎜🎜🎜npm2는 종속성 패키지를 설치할 때 간단한 재귀 설치 방법을 사용합니다. 각 패키지에는 자체 종속성 패키지가 있으며 각 패키지의 종속성은 자체 node_modules에 설치됩니다. 종속성 관계는 계층별로 진행되어 전체 종속성 트리를 형성합니다. 파일 시스템. 🎜🎜종속성 트리를 만드는 가장 편리한 방법은 루트 디렉터리에서 npm ls를 실행하는 것입니다. 🎜🎜장점: 🎜🎜🎜🎜명백한 계층 구조로 바보 같은 관리가 쉽습니다. 🎜🎜🎜🎜단점:🎜
  • 복잡한 프로젝트의 경우 디렉터리 구조가 너무 깊고 깊은 파일 경로가 너무 길어서 창 파일 시스템의 파일 경로 길이가 260자를 초과할 수 없습니다.

  • 여러 패키지에 종속된 일부 패키지는 여러 곳에 반복적으로 설치되어 많은 중복성을 유발합니다.

3.2 npm3

npm3의 node_modules 디렉터리가 더 평평한 계층 구조로 변경되었습니다. npm3은 설치 중에 전체 종속성 트리를 탐색하여 가장 합리적인 폴더 설치 방법을 계산합니다. 반복적으로 종속되는 모든 패키지는 다시 설치할 수 있습니다.

npm의 경우 이름이 같고 버전이 다른 패키지는 두 개의 독립 패키지입니다.

npm3의 종속성 트리 구조는 더 이상 폴더 계층 구조와 일대일로 일치하지 않습니다.

3.3 npm5

npm3의 플랫 종속성 패키지 설치 방법을 따르세요. 가장 큰 변화는 package-lock.json 파일이 추가된 것입니다.

Package-lock.json 기능: 종속성 설치 구조를 잠그고 node_modules 디렉터리 파일 계층 구조가 json 구조와 일대일로 일치하는지 확인합니다.

npm5는 npm i를 실행한 후 기본적으로 package-lock.json 파일을 생성하고 이를 git/svn 코드 베이스에 제출합니다.

업그레이드하려면 버전 5.0을 사용하지 마세요.

참고: npm 5.0에서 package-lock 파일이 이미 존재하는 경우 package.json 파일에 수동으로 종속성을 추가한 후 npm install을 실행하면 새 종속성이 node_modules, package-lock.json에 설치되지 않습니다. 그에 따라 업데이트되지 않습니다.

4. 종속성 패키지 버전 관리

종속성 패키지 업그레이드 관리와 관련된 지식을 소개합니다.

4.1 시맨틱 버전 semver

npm 종속성 관리의 중요한 기능 중 하나는 시맨틱 버전(semver) 사양을 버전 관리 솔루션으로 채택하는 것입니다.

의미론적 버전 번호는 세 개의 숫자를 포함해야 하며 형식은 major.minor.patch입니다. 이는 주요 버전 번호, 수정된 버전 번호를 의미합니다.

필요한 종속성 패키지의 버전 번호나 범위를 지정하려면 종속성에서 semver 규칙을 사용해야 합니다.

일반적으로 사용되는 규칙은 다음과 같습니다.

이 글은 npm의 원리를 이해하는 데 도움이 될 것입니다.

semver 의미 버전

1. 임의의 두 규칙은 공백으로 연결되어 두 규칙의 교차점인 "AND" 논리를 나타냅니다.

예를 들어 >=2.3.1 <=2.8.0은 >=2.3.1 및 <=2.8.0

  • 로 해석될 수 있습니다. 2.3.1, 2.4.5, 2.8.0
  • 과 일치할 수 있습니다. 하지만 1.0.0, 2.3.0, 2.8.1, 3.0.0

2에는 일치하지 않습니다. 두 규칙을 합친 "OR" 논리를 표현하기 위해 두 규칙을 연결합니다.

예: ^2 >=2.3.1 || ^3 >3.2

  • 2.3.1, 2,8.1, 3.3.1
  • 과 일치할 수 있습니다. 하지만 1.0.0, 2.2.0, 3.1.0, 4.0.0

3과 일치하지 않습니다. 버전 번호 범위를 더 직관적으로 표현하는 방법

  • 또는 x는 모든 주요 버전과 일치합니다
  • 1 또는 1.x는 주 버전 번호가 1
  • 인 모든 버전과 일치합니다. 1.2 또는 1.2.x는 버전 번호 1.2

4로 시작하는 모든 버전과 일치합니다. MAJOR.MINOR.PATCH 뒤에 추가하고 점으로 구분된 태그가 뒤따릅니다. 시험판 버전 태그는 일반적으로 불안정한 것으로 간주되므로 권장되지 않습니다. 사용되는 버전입니다.

  • 1.0.0-알파
  • 1.0.0-베타.1
  • 1.0.0-rc.3

4.2 종속성 버전 업그레이드

종속성 패키지를 설치한 후 새 버전이 출시됩니다. npm을 사용하여 버전을 업그레이드하는 방법은 무엇입니까?

  • npm i 또는 npm 업데이트이지만 npm 버전이 다르고 package.json 및 package-lock.json 파일이 다르며 설치 및 업그레이드 성능이 다릅니다.

npm3 사용 결론:

  • 로컬 node_modules가 이미 설치된 경우 설치를 다시 실행하면 패키지 버전이 업데이트되지 않지만 업데이트를 실행하면 업데이트되며, 로컬 node_modules가 비어 있으면 설치/업데이트를 실행하면 업데이트 패키지가 직접 설치됩니다.
  • npm 업데이트는 항상 package.json에 지정된 semver와 일치하는 최신 버전 번호로 패키지를 업데이트합니다. 이 경우 ^1.8.0과 일치하는 최신 버전은 1.15.0
  • 입니다. package.json이 제공되면 나중에 npm 설치 또는 업데이트가 실행되더라도 package.json의 webpack 버전은 원래 ^1.8.0으로 유지됩니다.

npm5 사용에 대한 결론:

  • 설치가 실행될 때마다 npm은 package-lock에 지정된 버전에 따라 webpack 설치에 우선순위를 부여합니다. b) npm 3 테이블에서;
  • 설치/업데이트가 완료될 때마다 패키지 잠금 파일은 항상 node_modules로 업데이트됩니다. - (따라서 패키지 잠금 파일은 node_modules의 JSON 표현으로 간주될 수 있습니다)
  • node_modules 설치 후 npm update를 실행하면 package.json의 버전 번호도 ^1.15.0

4.3 Best Practice

제가 자주 사용하는 노드는 8.11.x이고 npm은 5.6입니다. .

  • 使用npm >= 5.1 版本,保持package-lock.json文件默认开启配置。
  • 初始化,npm i 安装依赖包,默认保存^X.Y.Z,项目提交package.json和package-lock.json。
  • 不要手动修改package-lock.json

升级依赖包:

  • 升级小版本,执行npm update升级到新的小版本。
  • 升级大版本,执行npm install @ 升级到新的大版本。
  • 手动修改package.json中的版本号,然后npm i。
  • 本地验证升级新版本后没有问题,提交新的package.json和package-lock.json文件。

降级依赖包:

  • 正确:npm i @验证没有问题后,提交package.json和package-lock.json文件。
  • 错误:修改package.json中的版本号,执行npm i不会生效。因为package-lock.json锁定了版本。

删除依赖包:

  • A计划:npm uninstall 。提交package.json和package-lock.json。
  • B计划:在package.json中删除对应的包,然后执行npm i,提交package.json和package-lock.json。

五、npm的sctipts

5.1 基本使用

npm scripts是npm的一个重要的特性。在package.json中scripts字段定义一个脚本。

比如:

{ 
    "scripts": { 
        "echo": "echo HELLO WORLD" 
    } 
}
로그인 후 복사
로그인 후 복사

我们可以通过npm run echo 命令执行这段脚本,就像shell中执行echo HELLO WOLRD,终端是可以看到输出的。

总结如下:

  • npm run 命令执行时,会把./node_modules/.bin目录添加到执行环境的PATH变量中。全局的没有安装的包,在node_modules中安装了,通过npm run 可以调用该命令。
  • 执行npm 脚本时要传入参数,需要在命令后加 -- 表明,比如 npm run test -- --grep="pattern" 可以将--grep="pattern"参数传给test命令。
  • npm 还提供了pre和post两种钩子的机制,可以定义某个脚本前后的执行脚本。
  • 运行时变量:npm run 的脚本执行环境内,可以通过环境变量的方式获取更多的运行相关的信息。可以通过process.env对象访问获得:
  • npm_lifecycle_event:正在运行的脚本名称
  • npm_package_:获取当前package.json中某一个字段的匹配值:如包名npm_package_name
  • npm_package__:package中的嵌套字段。

5.2 node_modules/.bin目录

保存了依赖目录中所安装的可供调用的命令行包。本质是一个可执行文件到指定文件源的映射。

例如 webpack 就属于一个命令行包。如果我们在安装 webpack 时添加 --global 参数,就可以在终端直接输入 webpack 进行调用。

上一节所说,npm run 命令在执行时会把 ./node_modules/.bin 加入到 PATH 中,使我们可直接调用所有提供了命令行调用接口的依赖包。所以这里就引出了一个最佳实践:

•将项目依赖的命令行工具安装到项目依赖文件夹中,然后通过 npm scripts 调用;而非全局安装

于是 npm 从5.2 开始自带了一个新的工具 npx.

5.3 npx

npx 的使用很简单,就是执行 npx 即可,这里的 默认就是 ./node_modules 目录中安装的可执行脚本名。例如上面本地安装好的 webpack 包,我们可以直接使用 npx webpack 执行即可。

5.4 用法

1、传入参数

"scripts": { 
  "serve": "vue-cli-service serve", 
  "serve1": "vue-cli-service --serve1", 
  "serve2": "vue-cli-service -serve2", 
  "serve3": "vue-cli-service serve --mode=dev --mobile -config build/example.js" 
}
로그인 후 복사
로그인 후 복사

除了第一个可执行的命令,以空格分割的任何字符串都是参数,并且都能通过process.argv属性访问。

比如执行npm run serve3命令,process.argv的具体内容为:

[ &#39;/usr/local/Cellar/node/7.7.1_1/bin/node&#39;, 
  &#39;/Users/mac/Vue-projects/hao-cli/node_modules/.bin/vue-cli-service&#39;, 
  &#39;serve&#39;, 
  &#39;--mode=dev&#39;, 
  &#39;--mobile&#39;, 
  &#39;-config&#39;, 
  &#39;build/example.js&#39; 
]
로그인 후 복사
로그인 후 복사

2、多命令运行 在启动时可能需要同时执行多个任务,多个任务的执行顺序决定了项目的表现。

1)串行执行

串行执行,要求前一个任务执行成功之后才能执行下一个任务。使用 && 服务来连接。

npm run scipt1 && npm run script2
로그인 후 복사
로그인 후 복사

串行执行命令,只要一个命令执行失败,整个脚本会中止的。

2)并行执行

并行执行,就是多个命令同时平行执行,使用 & 符号来连接。

npm run script1 & npm run script2
로그인 후 복사
로그인 후 복사

3、env 环境变量 在执行npm run脚本时,npm会设置一些特殊的env环境变量。其中package.json中的所有字段,都会被设置为以npm_package_ 开头的环境变量。

4、指令钩子 在执行npm scripts命令(无论是自定义还是内置)时,都经历了pre和post两个钩子,在这两个钩子中可以定义某个命令执行前后的命令。比如在执行npm run serve命令时,会依次执行npm run preserve、npm run serve、npm run postserve,所以可以在这两个钩子中自定义一些动作:

"scripts": { 
  "preserve": "xxxxx", 
  "serve": "cross-env NODE_ENV=production webpack", 
  "postserve": "xxxxxx" 
}
로그인 후 복사

5、常用脚本示例

// 删除目录 
"clean": "rimraf dist/*", 

// 本地搭建一个http服务 
"server": "http-server -p 9090 dist/", 

// 打开浏览器 
"open:dev": "opener http://localhost:9090", 

// 实时刷新 
"livereload": "live-reload --port 9091 dist/", 

// 构建 HTML 文件 
"build:html": "jade index.jade > dist/index.html", 

// 只要 CSS 文件有变动,就重新执行构建 
"watch:css": "watch &#39;npm run build:css&#39; assets/styles/", 

// 只要 HTML 文件有变动,就重新执行构建 
"watch:html": "watch &#39;npm run build:html&#39; assets/html", 

// 部署到 Amazon S3 
"deploy:prod": "s3-cli sync ./dist/ s3://example-com/prod-site/", 

// 构建 favicon 
"build:favicon": "node scripts/favicon.js",
로그인 후 복사

六.npm配置

6.1 npm config

  • 通过npm config ls -l 可查看npm 的所有配置,包括默认配置。
  • 通过npm config set ,常见配置:
  • proxy,https-proxy:指定npm使用的代理
  • registry:指定npm下载安装包时的源,默认是https://registry.npmjs.org。可以指定私有的registry源。
  • package-lock.json:指定是否默认生成package-lock.json,建议保持默认true。
  • save :true/false指定是否在npm i之后保存包为dependencies,npm5开始默认为true。
  • 通过npm config delete 删除指定的配置项。

6.2 npmrc文件

可以通过删除npm config命令修改配置,还可以通过npmrc文件直接修改配置。

npmrc文件优先级由高到低,包括:

  • 工程内配置文件:项目根目录下的.npmrc文件
  • 用户级配置文件:用户配置里
  • 全局配置文件
  • npm内置配置文件 我们可以在自己的团队中在根目录下创建一个.npmrc文件来共享需要在团队中共享的npm运行相关配置。

比如:我们在公司内网下需要代理才能访问默认源:https://registry.npmjs.org源;或者访问内网的registry,就可以在工作项目下新增.npmrc文件并提交代码库。

示例配置:

proxy = http://proxy.example.com/ 
https-proxy = http://proxy.example.com/ 
registry = http://registry.example.com/
로그인 후 복사

这种在工程内配置文件的优先级最高,作用域在这个项目下,可以很好的隔离公司项目和学习研究的项目两种不同环境。

将这个功能与 ~/.npm-init.js 配置相结合,可以将特定配置的 .npmrc 跟 .gitignore, README 之类文件一起做到 npm init 脚手架中,进一步减少手动配置。

6.3 node版本约束

一个团队中共享了相同的代码,但是每个人开发机器不一致,使用的node版本也不一致,服务端可能与开发环境不一致。

  • 这就带来了不一致的因素----方案:声明式约束+脚本限制。
  • 声明:通过package.json的engines属性声明应用运行所需的版本要求。例如我呢项目中使用了async,await特性,得知node查阅兼容表格[1]得知最低支持版本是7.6.0.因此指定engines配置为:
{ 
  "engines": {"node": ">=7.6.0"} 
}
로그인 후 복사
  •     强约束(可选):需要添加强约束,需要自己写脚本钩子,读取并解析engines字段的semver range并与运行环境做比对校验并适当提醒。

总结

  •     npm init初始化新项目
  •     统一项目配置:需要团队共享npm config配置项,固化到.npmrc文件中
  •     统一运行环境:统一package.json,统一package-lock.json文件。
  •     合理使用多样化的源安装依赖包
  •     使用npm版本:>= 5.2版本
  •     使用npm scripts和npx管理相应脚本
  •     安全漏洞检查:npm audit fix修复安全漏洞的依赖包(本质:自动更新到兼容的安全版本)

引用链接

[1] node查阅兼容表格: https://node.green/

更多node相关知识,请访问:nodejs 教程

위 내용은 이 글은 npm의 원리를 이해하는 데 도움이 될 것입니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:zzvips.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿