Nodejs 包管理器 - npm

337 阅读4分钟

背景

经常会忘记一些 npm 包管理的概念,本文主要记录这些概念

1. 什么是 npm?

npm 全称 Node Packages Manager。是 node.js 的默认的包管理工具,

为什么要包管理工具?

开发者可以通过 npm 包管理工具 查询,下载,更新和卸载计算机包。

Npm 指令

以 express 为例

  • 查询:npm search express
  • 更新:npm update express
  • 卸载:npm uninstall express
  • 下载:npm install express
  • 初始化 package: npm init
  • ...

Nodejs 有什么包管理工具

  1. npm:nodejs 内置的包管理工具
  2. 其他:cnpm yarn pnpm ...

本文主要从 npm 切入,其他的包管理工具另外介绍

2.包配置 (package.json)

package.json 位于模块的目录下,用于定义包的属性

属性参考:NPM 使用介绍 | 菜鸟教程

dependencies

dependencies 和 devDependencies 理解是比较容易乱的。

在网上搜到的:

  1. dependencies:表示项目的运行依赖,即在生产环境下需要使用的模块。这些模块会被安装到项目的 node_modules 目录中,且默认会被打包发布到生产环境中
  2. devDependencies:表示项目的开发依赖,即在开发环境下需要使用的模块。这些模块同样会被安装到项目的 node_modules 目录中,但是不会被打包发布到生产环境中

可是实际操作下来,只要在代码里引用了,无论模块在 dependencies 还是 devDependencies 都会打包到生产环境;

这篇文章能解答 dependenciesdevDependencies 的区别: 你真的理解 devDependencies 和 dependencies 的区别吗? - 掘金

总结:

devDependenciesdependencies的区别在于是否在 npm 包开发中

  • 开发的项目是发 npm 包提供给外部需要注意依赖的安装地方,需要安装放到 dependencies 只是开发环境需要则放到 devDependencies

  • 自己项目用,则不需要发 npm 包的话,把依赖安装到 devDependencies 或者 dependencies 中,实质上是没有任何区别的。

  • 日常项目使用无论放在 devDependencies 还是 dependencies ,只要引用了,都会打包到代码里面。项目需不需要 --save--dev 没什么区别

3.版本号管理 (遵循 semver)

格式

major.minor.patch

主版本号.次版本号.修补版本号

版本匹配规则

  1. ~ version : minor 版本号指定了,则 patch 版本号任意;如果 minor 版本号没指定,则 minor,patch 版本号任意

    1. ~1.2.3 := >=1.2.3 <1.3.0-0
    2. ~1.2 := >=1.2.0 <1.3.0-0 (与 1.2.x 相同)
    3. ~1 := >=1.0.0 <2.0.0-0 (与 1.x 相同)
    4. ~0.2.3 := >=0.2.3 <0.3.0-0
    5. ~0.2 := >=0.2.0 <0.3.0-0 (与 0.2.x 相同)
    6. ~0 := >=0.0.0 <1.0.0-0 (与 0.x 相同)
  2. ^ version : 允许不修改 [major, minor, patch] 元组中最左边的非零元素的更改

    1. ^1.2.3 := >=1.2.3 <2.0.0-0
    2. ^0.2.3 := >=0.2.3 <0.3.0-0
    3. ^0.0.3 := >=0.0.3 <0.0.4-0
    4. ^1.x := >=1.0.0 <2.0.0-0
    5. ^0.x := >=0.0.0 <1.0.0-0
  3. 版本比较> version;>= version;< version;<= version

  4. x 标识符: x 的位置表示任意版本

  5. *标识符: 任意版本,"" 也表示任意版本

  6. range1 || range2: 满足 range1 或者满足 range2 ,可以多个范围

4.缓存 package-lock.json

package-lock.json | npm Docs

对于 npm 修改 node_modules treepackage.json 的任何操作,都会自动生成 package-lock.json 。它描述了 package-lock.json 文件生成时的确切树,以便后续安装能够生成相同的树,而不管中间依赖项更新如何

使用 git 提交代码的时候把该文件提交,团队在使用 npm i 的时候会下载一个一样的 node_modules 依赖树

作用(核心是记录依赖版本,保持一致性)

  1. 描述依赖关系树的单一表示,这样可以保证团队、部署和持续集成安装完全相同的依赖关系(记录依赖)

  2. 为用户提供一种工具,使他们可以 "穿越" 到 node_modules 的先前状态,而无需提交目录本身 (记录依赖)

  3. 通过可读的源代码控制差异提高树更改的可见性。 (可读性)

  4. 通过允许 npm 跳过以前安装的包的重复元数据解析来优化安装过程。 (记录依赖)

  5. 从 npm v7 开始,lockfiles 包含足够的信息来获得包树的完整图片,减少读取 package.json 文件的需要,并允许显着的性能改进。 (优化性能)

5.怎么使用 NPM 管理自定义 package

在日常开发中虽然经常用到其他开源包,但是如果有部分需要多个应用用到,这时候就可以上传到 npm ,然后使用的时候 npm install xxx@version 即可

1. 发包

  1. 有 npm 账号
  2. 切换 npm 源地址(确保源正确)
npm config get registery // 确定是不是官方地址,如果不是执行下一步切换为官方地址
npm config set registery https://registery.npmjs.org
  1. 第一发布用 npm adduser (填写你注册的 npm 账号的 username, password, email) 。否则用 npm login 即可
npm whoami //查看当前登陆用户
  1. 发布 npm publish

2. 更新包

代码如果有更新, publish 的时候需要更改版本号的,否则也提交不到。方式两种如下

  1. 直接改 package.json
  2. npm 指令操作 package.json
npm version patch // 补丁版本,最后一位数加1 
npm version minor // 增加了新功能 中间的数字加1
npm version major // 大改动,不向下兼容 第一位数字加1

3. 删除包

npm unpublish [packagename]--force