转载请注明出处: https://lihx.top/
释义
(node package manager),node包管理器,它的主要功能就是管理node包,包括:安装、卸载、更新、查看、搜索、发布等
包安装模式
本地安装 | 全局安装 |
---|---|
package会被下载到当前所在目录,也只能在当前目录下使用 | package会被下载到到特定的系统目录下,安装的package能够在所有目录下使用 |
npm install vue-cli | npm install vue-cli -g |
指令
指令 | 描述 |
---|---|
npm install vue@2.5.1 | 安装 |
npm i | 通过package.json安装 |
npm install vue --save-prod | 安装vue包到生产环境依赖下 (简化可以--save或者-S或者-P) |
npm install vue --save-dev | 安装vue包到开发环境依赖下 (简化可以-D) |
npm install vue --no-save | 安装vue包到node_modules中 (但是不写入package.json) |
npm uninstall vue | 卸载 |
npm ls | 查看安装了哪些包 |
npm ls(info) vue | 查看本地安装包的简略(详细)信息 |
npm update vue | 更新包 |
npm [config] set proxy http://proxy.com:8080 | 设置proxy代理(如内网) |
npm delete proxy | 删除代理 |
npm [config] get proxy | 查看代理 |
npm publish | 发布包 |
npm unpublish | 撤销发布 |
package.json
字段相当多,但最重要的的是下面几个
字段 | 描述 |
---|---|
name | (由于他会成为url的一部分,所以 non-url-safe 的字母不会通过,也不允许出现"."、"_"),最好先在http://registry.npmjs.org/上搜下你取的名字是否已经存在 |
version | 当package发生变化时,version也应该跟着一起变化,同时,你声明的版本需要通过semver的校验(semver可自行谷歌) |
dependencies | package的应用依赖模块,即别人要使用这个package,至少需要安装哪些。应用依赖模块会安装到当前模块的node_modules目录下 |
devDependencies | package的开发依赖模块,即别人要在这个package上进行开发 |
devDependencies与dependencies实质区别(npm ... -D 和 -S)
我们经常在通过npm install $package来安装一个依赖包时,npm只会安装该依赖包的package.json文件中的dependencies所指定的依赖包,devDependencies是不会被安装的。
假设有以下两个模块:
pkg1
- devDependencies
pkg-A - dependencies
pkg-B
pkg2
- devDependencies
pkg-C - dependencies
pkg1
- npm install pkg2的时候, 下载的模块为:
- pkg2
- pkg1
- pkg-B
- cd pkg2目录, npm i操作,下载模块为
- pkg-C
- pkg1
- pkg-B
总结:在发布npm包的时候,本身dependencies下的模块会作为依赖,一起被下载,devDependencies下面的模块就不会自动下载了。但对于项目而言,npm install 会自动下载devDependencies和dependencies下面的模块。
自npm 5.0版本发布以来,npm i的规则发生了三次变化。
- npm 5.0.x 版本,不管package.json怎么变,npm i 时都会根据lock文件下载
package-lock.json file not updated after package.json file is changed · Issue #16866 · npm/npm
这个 issue 控诉了这个问题,明明手动改了package.json,为啥不给我升级包!然后就导致了5.1.0的问题...
- 5.1.0版本后 npm install 会无视lock文件 去下载最新的npm
然后有人提了这个issue why is package-lock being ignored? · Issue #17979 · npm/npm
控诉这个问题,最后演变成5.4.2版本后的规则。
- 5.4.2版本后 why is package-lock being ignored? · Issue #17979 · npm/npm
大致意思是,如果改了package.json,且package.json和lock文件不同,那么执行`npm i`时npm会根据package中的版本号以及语义含义去下载最新的包,并更新至lock。
如果两者是同一状态,那么执行 `npm i` 都会根据lock下载,不会理会package实际包的版本是否有新。