NPM实用指北

npm做为下载node附送的大礼包,你们必定不会陌生。
然而关于npm,估计大量的只是用到npm install XXX以及npm run XXXjavascript

其实这里边还有不少有意思的命令&参数。
关于npm,大概有两个做用:java

  1. 能让咱们很方便的从网上下载第三方包进行实现功能
  2. 可以让咱们本身编写包,并上传到网上供其余人下载

下载相关的操做

下载主要就是围绕着install这一个命令来的。node

install 能够简写为 i

安装原有的依赖包

当咱们处于一个项目下时,执行npm i便可安装当前项目全部的依赖包。
包含dependenciesdevDependenciesoptionalDependenciesbundleDependencies中的全部。
若是咱们在执行npm i时添加--production的参数,则表示是线上环境,将会忽略devDependencies下的全部依赖。git

如今咱们有以下的package.json文件:shell

{
  "dependencies": {
    "koa": "^2.5.0"
  },
  "devDependencies": {
    "eslint": "^4.19.1"
  }
}

若是执行npm i,则会安装全部的依赖。npm

> npm ls --depth=0
├── eslint@4.19.1
└── koa@2.5.0

而后咱们再尝试添加--production参数,使用--only=prod[uction]一样能够实现效果。json

> npm ls --depth=0
└── koa@2.5.0

使用--only=dev[elopment]则用来仅安装devDependencies的依赖。bash

--depth=XXX 用来设置显示路径的深度,默认会递归将全部的依赖都打印出来。

新增依赖的安装

上边是直接安装项目原有依赖的操做,若是咱们要新增一些依赖,这里有一些选项能够了解一下。
若是咱们在执行install添加--no-save--save-dev之类的flag时,不会直接写入到dependencies中,而是有一些其余的处理。服务器

各类选项:koa

flag description
--save-prod 默认选项 对应dependencies
--no-save 不将依赖写进package.json
--save-dev-D 对应devDependencies
--save-optional-O 对应optionalDependencies,在安装时能够经过指定--no-optional来忽略该模块下的依赖
--save-bundle-B 对应bundleDependencies貌似已经被废弃了-.-
--save-exact-E 安装精准的某个版本,在版本号处不会添加^之类的标识
--global-g 全局安装包,通常来讲须要管理员权限

更多的参数请查阅:https://docs.npmjs.com/cli/install

package.json中常常能看到依赖的版本号前边有一个 ^~
^~会致使从新安装依赖的时候,按照规则安装最新版。
好比版本号为 ^2.1.0,则会匹配 >=2.1.0 <3.0.0的全部包
若是版本号为 ~2.1.0,则会匹配 >=2.1.0 <2.2.0的全部包
这两个标识的好处是:一个包进行修复 bug,只更新了最后一位版本号,全部依赖它的包不须要从新上传本身的 package.json
因此说,涉及到可能产生不兼容后果的更新,请必定要修改前两位版本号。。不然就是坑人了-.-

以及咱们能够指定安装包时候的tag或者version

npm i koa@next
npm i koa@2.0.0
npm i koa@">=2.0.0 <2.5.0"

这里的next就是一个tag 若是不指定的话,有一个默认的latest
以及第二条指定安装2.0.0版本的koa
最后一条则会在范围规则内选择最新的版本进行安装。

上传相关的操做

要上传,确定就要先进行开发。
因此咱们上传的整个流程大概是这样的:

  1. npm init建立package.json
  2. 进行开发
  3. npm show <你的包名>,若是404,那么恭喜你,这个名字尚未被占用。
  4. npm publish,上传包。

npm init

其实有不少状况下,咱们建立package.json只是为了安装依赖,可是执行了npm init之后却要确认好屡次选填内容。
其实若是你添加了一个参数之后,npm就不会让你确认这些选填内容了。
npm init -f--force-y--yes均可以实现这个效果。
固然,若是你是要将这个文件夹做为一个pacakge发出去,则这些选填内容都是须要的。

开发包的过程

如何进行本地debug

在开发过程当中,为了本地快速进行调试,能够执行这样的命令:
npm link <你的包名>
若是在当前包的文件夹中,能够直接执行npm link

能够简写为 npm ln

而后在要调试的项目中执行npm link <你的包名>
便可建立一个引用本地的连接。
在调试完毕后,执行npm unlink来删除连接。

如何建立命令行可执行模块

咱们能够在package.json中添加bin字段,用来指定一个文件。

{
  "bin": {
    "sayhi": "bin/hi"
  }
}

文件./bin/hi

#!/usr/bin/env node

console.log('hi there')

若是用过-g进行全局安装,就会注册对应的命令,咱们在terminal中就能够直接执行了。
#!/usr/bin/env node为必须的,路径可能会变

npm show

这个方法貌似没有被写在文档里。。但它确实是存在的。
执行npm show XXX会返回这个包对应的信息,也能够直接在后边按照JSON的格式来进行取值:

npm show koa version
npm show koa dist-tags.latest

npm publish

当咱们的包开发完毕后,就能够执行publish来进行上传了。

npm publish

你一样能够在后边指定一个文件夹路径或者压缩包,但都须要这二者包含package.json文件(npm包的信息都在这里)

以及,咱们能够在后边拼接--tag=XXX来上传一个对应的tag,若是不写的话,默认会上传到latest下。
tag的好处是,咱们能够同时维护多份代码,二者互不影响(可是要当心publish的时候必定不要忘记tag
就好比去年的node.js稳定版仍是6,可是koa已经开始使用7.6+async/await特性,因此他们就发布了koa@next,也就是如今的2.x,用来支持新的语法。

以后的版本更新

若是咱们的包放到线上之后,发现了bug,咱们须要修复它,由于npm的限制,因此每次publish必须保证version的一致性。
npm给咱们提供了这样三个命令:

  1. npm version patch
  2. npm version minor
  3. npm version major

三个命令依次会修改version的第3.2.1位。
major.minor.patch

patch

patch为改动最小的,也就是咱们上边提到过的bug修复,^~都会兼容的版本号。

minor

若是是minor,则会修改中间的版本号,通常来说,新功能的增长须要修改这个版本号,由于可能会形成以前的使用方式改变。

major

最后一个则是很大的更新才会去修改的版本号,例如咱们亲爱的koa,在抛弃Generator拥抱async/await就是直接发布了koa2.x

执行这三个命令的先提条件是,你当前仓库是不存在未提交的修改的。
由于npm会直接帮你修改version并增长一条commit记录,若是有未提交的修改,可能会致使版本冲突。
在执行完这些命令(或者手动修改版本号也是没问题的),再执行npm publish便可上传更新包了。

若是想要自定义此次提交的信息的话,能够这样:
npm version patch -m "Upgrade version to %s"
%s会自动被 npm替换为更新后的版本号提交上去。

更新时必定记得加对应的--tag,不然默认会推到@latest

npm scripts

关于package.json中的scripts,不知道你们了解多少。
若是你的包是上传到npm上的,那么其实有不少scripts是相似钩子的存在。

publish

当你的包执行了publish上传到服务器后,这个脚本会执行。
其实咱们能够在这个地方执行git push操做来将本次的修改直接推到GitHub仓库上,节省了一次没必要要的命令键入。
或者若是你这个包同时还上传到apm或者之类的同类型仓库,也能够直接在这里进行处理(省去屡次繁琐的操做)

install

这个脚本会在包被安装后执行。
好比说咱们使用Flowtype开发了一个包,咱们能够直接将源码传到npm上,而后在install命令中执行编译,去除flow comments

一些依赖于 node-gyp的包都会有 install: node-gyp rebuild的操做。

uninstall

若是你的包会对一些全局的数据形成影响(好比某些包可能会去改写.bashrc之类的文件)。
这时你能够在uninstall脚本中将那些修改项进行还原(良心操做)。

更多的 scripts钩子: https://docs.npmjs.com/misc/scripts

小记

最近翻看了一下npm的文档,发现了不少以前不多用的命令&参数。
以为npm作的真心很不错,原来的一些重复性的工做,其实能够很轻松的使用npm相关的命令来解决。
但愿你们不要只拿来进行npm install
最后:NPM Loves You

参考资料

https://docs.npmjs.com/cli/init
https://docs.npmjs.com/misc/developers
https://docs.npmjs.com/cli/version

相关文章
相关标签/搜索