npm命令

(参考:https://npmjs.org/doc/
https://docs.npmjs.com/cli-documentation/cli
http://www.runoob.com/nodejs/nodejs-npm.html

安装模块

根据package.json安装
npm install
安装位置为当前目录的node_modules目录

安装本地的模块文件
npm install

安装指定URL的模块
npm install

安装本地文件系统中指定的目录包含的模块
npm install

安装并更新package.json中的版本配置
npm install [–save|–save-dev|–save-optional]
其中:
添加–save 参数安装的模块的名字及其版本信息会出现在package.json的dependencies选项中
添加–save-dev 参数安装的模块的名字及其版本信息会出现在package.json的devDependencies选项中
添加–save-optional 参数安装的模块的名字及其版本信息会出现在package.json的optionalDependencies选项中

安装模块的config的tag配置中含有指定tag的版本
npm install @

安装模块的指定版本
npm install @
Example: npm install underscore@1.5.2


安装模块指定版本号范围内的某一个版本
npm install @
Example: npm install async@”>=0.2.0 <0.2.9″

–force强制拉取远程资源,即使本地已经安装这个模块
Example: npm install underscore –force

-g或–global全局安装模块,如果没有这个参数,会安装在当前目录的node_modules子目录下
Example: npm install -g express

配置

显示npm的bin目录
npm bin

设置npm配置
npm config set [–global]
使用–global参数,设置全局配置

Example:
设置代理
npm config set proxy=http://proxy.tencent.com:8080
设置npm的镜像地址
npm config set registry http://npm.oa.com

获取npm配置
npm config get

Example:
获取npm当前镜像地址
npm config get registory

删除npm配置
npm config delete

Example:
删除代理设置
npm config delete proxy

在编辑器中打开npm配置文件
npm config edit

交互式的创建package.json文件
npm init

创建模块的压缩包
npm pack [ [ … ]]
如果没有参数,则npm会打包当前模块目录

发布模块,发布后可通过名称来安装该模块
npm publish
npm publish
其中:
:包含package.json文件的目录
:经过gzip压缩并归档的一个URL或文件路径,该压缩包包含单个目录,且该目录内有package.json文件

删除模块
npm rm
npm r
npm uninstall
npm un
注意:不会删除package.json文件dependencies选项中对应的依赖配置

查找模块
npm search [search terms ..]
npm s [search terms ..]
npm se [search terms ..]
查找匹配查找字符串的模块

更新模块
npm update [-g] [ [ … ]]
更新指定name列表中的模块。-g参数更新全局安装的模块。
如果没有指定name,且不是在某个模块内,会更新当前目录依赖的所有包都会被更新(包括全局和模块内);如果当前目录在某个模块目录内,会更新该模块依赖的模块,所以不指定name直接运行npm update时,最好在某个模块内运行,以免更新到其他不想更新的模块。

执行脚本
npm start []
npm stop []
npm test [] 等
运行package的start脚本,该脚本写在package.json文件scripts的start字段中。
该字段的值可以是当前系统控制台可执行的脚本,也可以是当前系统可执行文件的路径。
如果不传name参数,则执行当前目录下package.json文件中定义的脚本。
详见https://npmjs.org/doc/misc/npm-scripts.html
package.json文件
模块的配置文件,详见https://npmjs.org/doc/files/package.json.html

其他

删除重复, 压平依赖树
npm dedupe
npm ddp

锁定依赖版本
npm-shrinkwrap

npm语义化版本号

https://docs.npmjs.com/about-semantic-versioning
http://blog.xcatliu.com/2015/04/14/semantic_versioning_and_npm/
https://segmentfault.com/a/1190000014405355?utm_medium=referral&utm_source=tuicool

^
表示同一主版本号中,不小于指定版本号的版本号。

~
表示同一主版本号和次版本号中,不小于指定版本号的版本号。

  • Patch releases: 1.0 or 1.0.x or ~1.0.4
  • Minor releases: 1 or 1.x or ^1.0.4
  • Major releases: * or x

^指明的版本范围,只要修改 [major, minor, patch] 三元组中,最左侧的第一个非0位,都是可以的。
也就是说,要确定 ^版本包含的范围,先要找到 最左侧的第一个非0位 ,只有在这一位右侧的变动,才被包含在这个 ^ 指定的范围内。
举个栗子 :

  • ^1.2.3版本包括:>= 1.2.3 并且 < 2.0.0
  • ^0.2.3版本包括:>= 0.2.3 并且 < 0.3.0
  • ^0.0.3版本包括:>= 0.0.3 并且 < 0.0.4

https://zhuanlan.zhihu.com/p/66039729
https://docs.npmjs.com/misc/semver#caret-ranges-123-025-004

版本格式

版本格式:主版本号.次版本号.修订号,版本号递增规则如下:

  • 主版本号(major):当你做了不兼容的 API 修改,
  • 次版本号(minor):当你做了向下兼容的功能性新增,可以理解为Feature版本,
  • 修订号(patch):当你做了向下兼容的问题修正,可以理解为Bug fix版本。

先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。

先行版本

当要发布大版本或者核心的Feature时,但是又不能保证这个版本的功能 100% 正常。这个时候就需要通过发布先行版本。比较常见的先行版本包括:内测版、灰度版本了和RC版本。Semver规范中使用alpha、beta、rc(以前叫做gama)来修饰即将要发布的版本。它们的含义是:

  • alpha: 内部版本
  • beta: 公测版本
  • rc: 即Release candiate,正式版本的候选版本

比如:1.0.0-alpha.0, 1.0.0-alpha.1, 1.0.0-beta.0, 1.0.0-rc.0, 1.0.p-rc.1 等版本。alpha, beta, rc后需要带上次数信息。

版本发布准则

列举出比较实用的一些规则:

  • 标准的版本号必须采用XYZ的格式,并且X、Y 和 Z 为非负的整数,禁止在数字前方补零,版本发布需要严格递增。例如:1.9.1 -> 1.10.0 -> 1.11.0。
  • 某个软件版本发行后,任何修改都必须以新版本发行。
  • 1.0.0 的版本号用于界定公共 API。当你的软件发布到了正式环境,或者有稳定的API时,就可以发布1.0.0版本了。
  • 版本的优先层级指的是不同版本在排序时如何比较。判断优先层级时,必须把版本依序拆分为主版本号、次版本号、修订号及先行版本号后进行比较。

npm包依赖

当执行npm install package -S 来安装三方包时,npm 会首先安装包的最新版本,然后将包名及版本号写入到 package.json 文件中。
比如,通过npm 安装 react 时:

  1. {
  2. "dependencies": {
  3. "react": "~16.2.0"
  4. }
  5. }

项目对包的依赖可以使用下面的 3 种方法来表示(假设当前版本号是 16.2.0):

  • 兼容模块新发布的补丁版本:~16.2.0、16.2.x、16.2
  • 兼容模块新发布的小版本、补丁版本:^16.2.0、16.x、16
  • 兼容模块新发布的大版本、小版本、补丁版本:*、x

批量升级

https://github.com/dylang/npm-check
npm-check -u

npm包发布

通常我们发布一个包到npm仓库时,我们的做法是先修改 package.json 为某个版本,然后执行 npm publish 命令。手动修改版本号的做法建立在你对Semver规范特别熟悉的基础之上,否则可能会造成版本混乱。npm 考虑到了这点,它提供了相关的命令来让我们更好的遵从Semver规范:

  • 升级补丁版本号:npm version patch
  • 升级小版本号:npm version minor
  • 升级大版本号:npm version major

当执行 npm publish 时,会首先将当前版本发布到 npm registry,然后更新 dist-tags.latest 的值为新版本。
当执行 npm publish —tag=next 时,会首先将当前版本发布到 npm registry,并且更新 dist-tags.next 的值为新版本。这里的 next 可以是任意有意义的命名(比如:v1.x、v2.x 等等)

查看登录用户
npm whoami

需要.npmrc / package.json 里面的register一样..

创建私有registry

可选项

https://medium.com/engenharia-noalvo/ways-to-have-your-private-npm-registry-and-a-final-diy-solution-eed001a88e74

Paid alternatives
MyGet (https://www.myget.org) —which costs US$ 9/month for starter plan and you only would have 2 contributors and 1GB storage.
NPM Org (https://www.npmjs.com) — which costs US$ 7 per user per month.

Free alternatives
DIY NPM (https://docs.npmjs.com/misc/registry)— Build your own registry at your own risk, you would need a CouchDB instance and a Node.js server.
Git! You sure could point your packages to private Git repositories, using URLs in package.json (http://fiznool.com/blog/2015/05/20/an-alternative-to-npm-private-modules/). It is very nice when the repository is public, but, when you have a private Git repository, you will need HTTPS or SSH credentials, and you often cannot have a per-team credential.
Sinopia (https://www.npmjs.com/package/sinopia) — Which is a handsome DIY registry, but it has some community problems, such it seems it will be abandoned (https://github.com/rlidwka/sinopia/issues/376). It also requires a Node.js server.
Cnpmjs.org (https://github.com/cnpm/cnpmjs.org) — Which requires a Node.js server, a MySQL instance and a Simple File Store Service, like qiniu, aliyun-oss, tfs, upyun.
Npm-register (https://github.com/jdxcode/npm-register) — which seems to be a better option than Sinopia, with CDN and caching things, but it will require an Amazon AWS S3 bucket and a Redis instance for doing that. It also has an option to easily deploy to Heroku.

Verdaccio

https://zhaomenghuan.js.org/blog/npm-private-repository-verdaccio.html
似乎用这个的比较多


使用淘宝镜像

使用淘宝镜像
npm config set registry https://registry.npm.taobao.org
npm config set registry http://registry.npmjs.org/

不推荐使用cnmp, 路径不一样, 可能会有奇怪的问题

配置

https://docs.npmjs.com/misc/config
λ npm config -h
npm config set
npm config get []
npm config delete
npm config list [—json]
npm config edit
npm set
npm get []

配置代理
https://www.cnblogs.com/huang0925/archive/2013/05/17/3083207.html
npm config get userconfig

strict-ssl=false
registry=http://registry.npmjs.org/
proxy=http://:/
https-proxy=http://:/

npm config set proxy http://username:password@server:port
npm config set https-proxy http://username:pawword@server:port


错误处理

文件下载失败
https://spontaleo.github.io/2017/11/23/%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3npm%E6%97%A0%E6%B3%95%E5%AE%89%E8%A3%85sqlite3%E7%9A%84%E9%97%AE%E9%A2%98%EF%BC%9F/
npm config set loglevel http
https://docs.npmjs.com/misc/config

Installing ERROR | Unexpected end of JSON input while parsing near
https://github.com/npm/npm/issues/19072
npm cache clean —force