NPM包管理工具入门

前言

NPM对于Nodejs, 就像Maven对于Java.
NPM是一个包管理工具, 用于管理依赖.

npmrc 详解

作为一个包管理工具, 肯定有相关的配置.
比如, 从哪个仓库下载依赖, 保存到本地的哪个目录下.

安装好NPM后, 会有三个文件

  1. 每个项目的配置文件(/path/to/my/project/.npmrc)
  2. 每个用户的配置文件(〜/.npmrc)
  3. 全局配置文件($PREFIX/etc/npmrc)
  4. NPM内置配置文件(/path/to/npm/npmrc)

具体可以看看npmrc官方文档

script
1
2
3
4
5
6
7
8
# 设置远程仓库
npm config set registry https://registry.npm.taobao.org
# 设置缓存位置
npm config set cache "D:\nodejs\node_cache"
# 设置全局模块存放位置
npm config set prefix "D:\nodejs"

npm config ls

像我们一开始都会配置国内仓库, 这些命令都是去修改用户的配置文件, 也就是~/.npmrc

package.json 和 package-lock.json

pom.xml类似, package.json就是描述这个项目的, 发布的时候会用到.
这里拿hexo的举个例子.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
"name": "hexo-site",
"version": "0.0.0",
"scripts": {
"build": "hexo generate",
"clean": "hexo clean",
"deploy": "hexo deploy",
"server": "hexo server"
},
"hexo": {
"version": "5.3.0"
},
"dependencies": {
"hexo": "^5.0.0",
"hexo-generator-archive": "^1.0.0",
"hexo-generator-category": "^1.0.0",
"hexo-generator-index": "^2.0.0",
"hexo-generator-tag": "^1.0.0",
"hexo-renderer-ejs": "^1.0.0",
"hexo-renderer-marked": "^3.0.0",
"hexo-renderer-stylus": "^2.0.0",
"hexo-server": "^2.0.0",
"hexo-theme-landscape": "^0.0.3"
}
}

nameversion是必填项, 用来标记项目名称和版本号. 这个name可以作为require的参数传递.
scripts用来注册npm命令, 比如npm clean就会调用hexo clean命令.
hexo是自定义的配置, 不用管.
dependencies表示本项目的所有依赖名称以及版本哈.

具体可以看看package.json官方文档

package-lock.jsonpackage.json结构差不多, 那为什么要有两个不同的文件呢?

package.json 和 package-lock.json

比如说hexo依赖的hexo-renderer-ejspackage.json的版本号是1.0.0.
在执行npm install的时候, npm会根据package.json的定义, 从本地磁盘或远程仓库里获取依赖.

假设hexo-renderer-ejs紧急发布了一个修复bug的版本1.0.2.
那在执行npm install的时候就会去根据主版本号1去获取最新的hexo-renderer-ejs版本.

正常按语义化版本的规范来说, 只要主版本号不变, 那都是兼容的.
但万一不按规范来, 比如1.0.21.0.0是不兼容的. 而npm install每次都会根据主版本号去拉取最新的依赖, 那风险就很大了.

为了解决这个问题, package-lock.json就出现了. package-lock.jsonpackage.json结构差不多.
执行npm install的时候, npm会根据package.json拉取最新的依赖版本, 然后生成package-lock.json, 锁定版本号.
然后下次npm install的时候, 就会从package-lock.json中获取准确的版本号, 就不会出现升级风险.

参考资料