npm初探

转载请注明出处: 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
  1. npm install pkg2的时候, 下载的模块为:
  • pkg2
  • pkg1
  • pkg-B
  1. 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实际包的版本是否有新。