npm,nrm,package.json相关概念区分

94 阅读4分钟

-------------------------前端小白,仅用作自我总结,有问题感谢指出-------------------------

npm:包管理器

执行npm install时,npm会根据package.json中各种依赖的定义去安装这些依赖。

安装后,会生成两个结果:

1.node_modules:所有依赖包

2.生成锁文件 package-lock.jsonyarn.lock

锁文件作用: a.控制安装版本 b.提高二次安装速度

package.json文件:项目管理文件

常见属性:

  • name 项目名称 (决定包在npm上的名字)
  • version 项目版本 (采用major.minor.patch形式)
  • description 项目描述信息
  • keywords 项目关键字 (方便npm检索信息)
  • author 作者信息
  • repository 项目仓库地址
  • script 项目的可执行脚本命令
  • dependencies 生产环境所需依赖包; npm install --save 或 npm i -S (简写)
  • devDependencies 开发环境所需的依赖; npm i --save-dev 或 npm i -D (简写)

版本号指定标识符:

1.依赖版本号组成:major.minor.patch,依次为主版本号、次版本号、修补版本号

2.^ 匹配最新的大版本,比如 ^1.2.3 会匹配所有 >=1.1.2 <2.0.0 的版本

3.~ 匹配最近的小版本,比如 ~1.2.3 会匹配所有 >=1.1.2 <1.2.0 的版本

4.* 安装最新版本的依赖包,比如 *1.2.3 会匹配 x.x.x

5.无符号时,比如 1.2.3,那就是将要使用的确切版本,总是会下载这个版本的依赖包

npm install策略

当我们每次使用npm install进行依赖安装的时候,先看有无lock文件:

1.如果有,则对比package.json和package-lock.json

如果package-lock.json里包版本号符合package.json要求,则直接获取包信息(如果是从远程拉取,则按照package-lock.json,否则以实际缓存的为准),构建依赖树,(注意这一步只是确定逻辑上的依赖树,并非真正的安装,后面会根据这个依赖结构去下载或拿到缓存中的依赖包);那么接下来就看.npmrc里有没有缓存,如果有缓存文件,则从缓存文件中拉取内容,否则从远程拉取;并更改package-lock.json版本号

如果版本号不符合要求,则直接从远程拉取,并更新package-lock.json中的版本号

2.如果没有,则:

根据package.json构建依赖树(注意这一步只是确定逻辑上的依赖树,并非真正的安装,后面会根据这个依赖结构去下载或拿到缓存中的依赖包)

如果缓存中(.npmrc)有,则优先从缓存中读取,否则从远程读取;注意:(如果是从远程拉取,则按照package.json,否则以实际缓存的为准)

需要注意的是,在使用cnpm install时候,并不会生成 package-lock.json 文件,也不会根据 package-lock.json 来安装依赖,它只会根据 package.json 来安装依赖

npm & cnpm & nrm 概念区分

1.NPM(Node Package Manager): NPM 是默认的包管理工具,随同Node.js 一起安装

使用NPM:npm install <package-name>

查看npm所有配置:npm config list

查看npm源的配置:npm config get registry

2.CNPM(China NPM):CNPM是NPM的国内镜像。CNPM 使用淘宝镜像作为源,与 NPM 基本相同,但下载速度更快。

安装CNPM:npm install -g cnpm --registry=https://registry.npm.taobao.org

使用CNPM:cnpm install <package-name>

3.NRM(NPM registry manager)是 npm 的镜像源管理工具,使用它可以快速切换 npm 源。 npm默认拉取外国的网站,如果切换国内淘宝镜像,可通过下列命令完成:

切换国内淘宝镜像:npm config set registry https://registry.npmmirror.com/

由于命令过长,所以使用nrm快速切换。

nrm安装:npm i -g nrm

nrm查看所有源:nrm ls

nrm切换源:nrm use <registry> 例如 nrm use taobao

4.配置.npmrc

用户级别的配置:npm config edit命令可以打开.npmrc文件进行编辑

项目级别的配置:项目的根文件下创建.npmrc文件,设置registry = "https://registry.npm.taobao.org",修改项目文件的源为淘宝,也可在npmrc内设置不同三方包安装时来自不同源,例如:

# 指定默认的源 
registry=https://registry.npm.taobao.org/

# 针对vue包,使用官方源 
@vue:registry=https://registry.npmjs.org/ 

# 针对lodash包,使用淘宝源
lodash:registry=https://registry.npm.taobao.org/ 

# 针对某个包,使用私有源 
@mycompany:registry=https://mycompany-npm-registry.com/

@<scope>:registry语法用于指定针对某个作用域(scope)的包使用的仓库地址。在这个语法中,<scope>是指包名前面的scope名称,例如@vue/cli中的@vue

npm源的优先级(高->低)

  1. 命令行参数:通过命令行参数设置的配置会覆盖其他所有配置。例如:npm install --registry=https://registry.npm.taobao.org/
  2. 环境变量:通过环境变量设置的配置会覆盖.npmrc文件中的配置。
  3. 项目级别的.npmrc文件:位于当前项目目录下的.npmrc文件中的配置会覆盖用户级别的配置。
  4. 用户级别的.npmrc文件:位于用户主目录下的.npmrc文件中的配置是全局默认配置。
  5. npm内置的默认配置:如果没有在上述位置找到相应的配置,npm会使用内置的默认配置。

需要注意的是,高优先级的配置会覆盖低优先级的配置。例如,如果你在命令行参数中设置了--registry,那么它将覆盖任何.npmrc文件中的配置。

不推荐 cnpm

前端项目存在package-lock.json文件,这两个命令对其有一定的影响:

1.cnpm i不受 package-lock.json 影响,只根据 package.json 下载安装。

2.cnpm i xxx@xxx不会跟新到 package-lock.json 中去。

3.npm i xxx@xxx 会跟新到 package-lock.json 中去。