背景
经常会忘记一些 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 有什么包管理工具
- npm:nodejs 内置的包管理工具
- 其他:cnpm yarn pnpm ...
本文主要从 npm 切入,其他的包管理工具另外介绍
2.包配置 (package.json)
package.json 位于模块的目录下,用于定义包的属性
属性参考:NPM 使用介绍 | 菜鸟教程
dependencies
dependencies 和 devDependencies 理解是比较容易乱的。
在网上搜到的:
dependencies:表示项目的运行依赖,即在生产环境下需要使用的模块。这些模块会被安装到项目的 node_modules 目录中,且默认会被打包发布到生产环境中。devDependencies:表示项目的开发依赖,即在开发环境下需要使用的模块。这些模块同样会被安装到项目的 node_modules 目录中,但是不会被打包发布到生产环境中
可是实际操作下来,只要在代码里引用了,无论模块在 dependencies 还是 devDependencies 都会打包到生产环境;
这篇文章能解答 dependencies 和 devDependencies 的区别: 你真的理解 devDependencies 和 dependencies 的区别吗? - 掘金
总结:
devDependencies 和 dependencies的区别在于是否在 npm 包开发中。
-
开发的项目是发 npm 包提供给外部需要注意依赖的安装地方,需要安装放到
dependencies只是开发环境需要则放到devDependencies -
自己项目用,则不需要发 npm 包的话,把依赖安装到
devDependencies或者dependencies中,实质上是没有任何区别的。 -
日常项目使用无论放在
devDependencies还是dependencies,只要引用了,都会打包到代码里面。项目需不需要--save--dev没什么区别
3.版本号管理 (遵循 semver)
格式
major.minor.patch
主版本号.次版本号.修补版本号
版本匹配规则
-
~ version : minor 版本号指定了,则 patch 版本号任意;如果 minor 版本号没指定,则 minor,patch 版本号任意
~1.2.3:=>=1.2.3 <1.3.0-0~1.2:=>=1.2.0 <1.3.0-0(与1.2.x相同)~1:=>=1.0.0 <2.0.0-0(与1.x相同)~0.2.3:=>=0.2.3 <0.3.0-0~0.2:=>=0.2.0 <0.3.0-0(与0.2.x相同)~0:=>=0.0.0 <1.0.0-0(与0.x相同)
-
^ version : 允许不修改
[major, minor, patch]元组中最左边的非零元素的更改^1.2.3:=>=1.2.3 <2.0.0-0^0.2.3:=>=0.2.3 <0.3.0-0^0.0.3:=>=0.0.3 <0.0.4-0^1.x:=>=1.0.0 <2.0.0-0^0.x:=>=0.0.0 <1.0.0-0
-
版本比较 : > version;>= version;< version;<= version
-
x 标识符: x 的位置表示任意版本
-
*标识符: 任意版本,"" 也表示任意版本
-
range1 || range2: 满足 range1 或者满足 range2 ,可以多个范围
4.缓存 package-lock.json
对于 npm 修改 node_modules tree或 package.json 的任何操作,都会自动生成 package-lock.json 。它描述了 package-lock.json 文件生成时的确切树,以便后续安装能够生成相同的树,而不管中间依赖项更新如何
使用 git 提交代码的时候把该文件提交,团队在使用 npm i 的时候会下载一个一样的 node_modules 依赖树
作用(核心是记录依赖版本,保持一致性)
-
描述依赖关系树的单一表示,这样可以保证团队、部署和持续集成安装完全相同的依赖关系。 (记录依赖)
-
为用户提供一种工具,使他们可以 "穿越" 到
node_modules的先前状态,而无需提交目录本身 (记录依赖) -
通过可读的源代码控制差异提高树更改的可见性。 (可读性)
-
通过允许 npm 跳过以前安装的包的重复元数据解析来优化安装过程。 (记录依赖)
-
从 npm v7 开始,lockfiles 包含足够的信息来获得包树的完整图片,减少读取
package.json文件的需要,并允许显着的性能改进。 (优化性能)
5.怎么使用 NPM 管理自定义 package
在日常开发中虽然经常用到其他开源包,但是如果有部分需要多个应用用到,这时候就可以上传到 npm ,然后使用的时候 npm install xxx@version 即可
1. 发包
- 有 npm 账号
- 切换 npm 源地址(确保源正确)
npm config get registery // 确定是不是官方地址,如果不是执行下一步切换为官方地址
npm config set registery https://registery.npmjs.org
- 第一发布用 npm adduser (填写你注册的 npm 账号的 username, password, email) 。否则用 npm login 即可
npm whoami //查看当前登陆用户
- 发布 npm publish
2. 更新包
代码如果有更新, publish 的时候需要更改版本号的,否则也提交不到。方式两种如下
- 直接改 package.json
- npm 指令操作 package.json
npm version patch // 补丁版本,最后一位数加1
npm version minor // 增加了新功能 中间的数字加1
npm version major // 大改动,不向下兼容 第一位数字加1
3. 删除包
npm unpublish [packagename]--force