npm的简单玩法

TL;DR

  • npm -l 查看所有命令用法
  • npm (command) -l 某命令的快捷用法
  • npm install 安装模块
  • npm uninstall 卸载模块
  • npm update 更新模块
  • npm outdated 检查模块是否已经过时
  • npm ls 查看安装的模块
  • npm init 在项目中引导创建一个package.json文件
  • npm help 查看某条命令的详细帮助
  • npm run 运行脚本

介绍npm

npm是Node.js的包管理工具,包就是指各种 javascript 库。
可以管理项目中的各种包包。
可以发布自己的包包。
官网下载node.js,npm便会一起安装。
祭上官网文档

新手可以借助how-to-npm

直接安装这个插件,按照教程走。

1
npm install -g how-to-npm

安装完之后,输入

1
how-to-npm

就会看到12个小练习,也就是基本命令的使用了。

  • how-to-npm print 重新显示当前的练习
  • how-to-npm verify 验证是否完成一个练习
  • how-to-npm solution 显示当前练习的解决方案

npm本身的一些命令

对于一般的包,以下命令也是适用的。如webpack -h

检测npm的版本(通常也会用这个来测试是否安装成功)

1
npm -v

!!!查看所有命令的用法(统揽使用命令)

1
npm -l

!!!查看某命令的快捷使用方法

1
npm <command> -h

查看npm所有命令

1
npm -h

大概有以下命令
access, adduser, bin, bugs, c, cache, completion, config,
ddp, dedupe, deprecate, dist-tag, docs, doctor, edit,
explore, get, help, help-search, i, init, install,
install-test, it, link, list, ln, login, logout, ls,
outdated, owner, pack, ping, prefix, prune, publish, rb,
rebuild, repo, restart, root, run, run-script, s, se,
search, set, shrinkwrap, star, stars, start, stop, t, team,
test, tst, un, uninstall, unpublish, unstar, up, update, v,
version, view, whoami

查看某命令的具体用法

1
npm help <command>

管理配置文件

1
npm config -h

运行命令看下有些使用方式,一般用于设置配置的一些参数。

升级npm

1
npm install npm -g

查看npm的介绍

1
npm help npm

package.json

使用 npm 来管理的 javascript 项目一般都有一个package.json文件。它定义了这个项目所依赖的各种包,以及项目的配置信息(比如名称、版本、依赖等元数据)

重要字段

  • name - 包名。
  • version - 包的版本号。
  • description - 包的描述。
  • homepage - 包的官网 url 。
  • author - 包的作者姓名。
  • contributors - 包的其他贡献者姓名。
  • dependencies - 指定项目运行所依赖的模块。
  • devDependencies - 指定项目开发所依赖的模块。
  • repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。
  • main - main 字段是一个模块ID,它是一个指向你程序的主要项目。就是说,如果你包的名字叫 * express,然后用户安装它,然后require(“express”)。
  • keywords - 关键字
  • bin - 用来指定各个内部命令对应的可执行文件的位置。
  • scripts - 指定了运行脚本命令的npm命令行缩写。
  • engines - 依赖node和npm版本,如果小于这个版本就好抛错。一般加上这个。npm升级挺快。

    一个完整的package.json

    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
    26
    27
    28
    29
    30
    {
    "name": "reactnotes",
    "version": "1.0.0",
    "description": "react 教程",
    "main": "./index.js",
    "dependencies": {
    "react": "^15.4.1",
    "react-dom": "^15.4.1"
    },
    "devDependencies": {
    "webpack-dev-server": "^1.16.2"
    },
    "scripts": {
    "start": "node index.js"
    },
    "repository": {
    "type": "git",
    "url": "git+https://github.com/atlantis1024/ReactNotes.git"
    },
    "author": "victor",
    "license": "Apache-2.0",
    "bugs": {
    "url": "https://github.com/atlantis1024/ReactNotes/issues"
    },
    "homepage": "https://github.com/atlantis1024/ReactNotes#readme",
    "engines": {
    "node": ">= 6.9.0",
    "npm": ">= 3.0.0"
    }
    }

package.json里面的版本声明

dependencies 和 devDependencies是依赖的包包及其版本号。
但是版本号的声明各种各样,前三者,最常见,一般默认是^version

  • version :安装一个确定的版本,遵循“大版本.次要版本.小版本”的格式规定。如:1.0.0。
  • ~version :以 ~1.0.0 来举例,表示安装1.0.x的最新版本(不低于1.0.0)。但是大版本号和次要版本号不能变。
  • ^version :以 ^1.0.0 来举例,表示安装1.x.x的最新版本(不低于1.0.0),但是大版本号不能变。
  • 1.2.x :表示安装1.2.x。
  • 、>=、<、<= :可以像数组比较一样,使用比较符来限定版本范围。

  • version1 - version2 :相当于 >=version1 <=version2.
  • range1 || range2 :版本满足range1 或 range2 两个限定条件中任意一个即可。
  • tag :一个指定 tag 对应的版本。
    • 或 “” (空字符串):任意版本。
  • latest :最新版本。
  • http://… 或 file://… :你可以指定http或本地文件路径下的包作为版本。
  • git… :参考下面的“直接将 Git Url 作为依赖包版本”
  • user/repo :参考下面的“直接将 Git Url 作为依赖包版本”
    git Url形式的例子:
    1
    2
    3
    4
    5
    git://github.com/user/project.git#commit-ish
    git+ssh://user@hostname:project.git#commit-ish
    git+ssh://user@hostname/project.git#commit-ish
    git+http://user@hostname/project/blah.git#commit-ish
    git+https://user@hostname/project/blah.git#commit-ish

举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{ "dependencies" :
{ "foo" : "1.0.0 - 2.9999.9999"
, "bar" : ">=1.0.2 <2.1.2"
, "baz" : ">1.0.2 <=2.3.4"
, "boo" : "2.0.1"
, "qux" : "<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0"
, "asd" : "http://asdf.com/asdf.tar.gz"
, "til" : "~1.2"
, "elf" : "~1.2.3"
, "two" : "2.x"
, "thr" : "3.3.x"
, "lat" : "latest"
, "dyl" : "file:../dyl"
}
}

生成pakage.json

1
npm init

就会生成一个package.json的文件。
如果想生成默认package.json,可以执行npm init -y,连交互式界面都不会出现。
另外需要注意,npm init的时候需要输入用户字段,如果还没有设置npm用户,需要通过npm addUser设置。

模块的常用命令

安装和删除一个模块

运行以下命令:

1
npm install <modulename>

npm install作为npm最重要的功能和最常用的功能,这里只介绍三个非常有用的选项–global,–save,–save-dev。
–global可以简写成-g,–save可以简写成-S,–save-dev可以简写成-D,注意大写。
npm uninstall和npm install接受同样的选项和参数。

-g是安装在全局,然后可以使用命令。
–save的作用是在package.json的dependencies字段增加或者修改一个安装包和版本号名值对。
–save-dev则是修改devDependencies,这样就不用安装了某个包之后手动修改package.json,npm已经帮我们把包依赖和版本管理做好了。
全局安装的包默认都存在C:\Users\Administrator\AppData\Roaming\npm下,这是windows版的,其他版本不懂。
其他在项目根目录下的node_modules文件夹里
案例是

1
npm install @linclark/pkg --save

显示安装的所有模块

运行命令:

1
npm ls

查看某模块的具体信息

1
npm info [module]

但是这信息太多,一般直接查找有tag的版本

1
npm dist-tags ls [module]

检测当前安装的所有npm包是否有更新

1
npm outdated

列出可以更新的包,如果没有任何输出,那么恭喜你,所有的包都是不需要更新的。

升级某模块

1
npm update [module]

运行脚本命令

1
npm run <script>

如果在 package.json 文件中的 scripts 字段定义了命令,就可以使用 npm run 来执行脚本命令。
假设 package.json 文件中的 scripts 字段如下定义:

1
2
3
4
5
6
"scripts": {
"test": "mocha",
"lint": "eslint lib bin hot scripts",
"prepublish": "npm run test && npm run lint",
"start": "node index.js"
}

  • npm run test :相当于执行 mocha 命令。它会开始执行测试框架 Mocha 。
  • npm run lint :相当于执行 eslint lib bin hot scripts 命令。它会开始执行 eslint 检查。
  • npm run prepublish :相当于执行 npm run test 和 npm run lint 两条命令。现在你了解如何复合命令了吧。
  • npm start :只有start不用run,相当于执行 node index.js 。Node.js 启动一个服务的入口脚本。

项目的版本

npm包的版本号一般都是x.y.z的形式。
其中x表示主版本号,通常有重大改变或者达到里程碑才改变;
y表示次要版本号,或二级版本号,在保证主体功能基本不变的情况下,如果适当增加了新功能可以更新此版本号;
z表示尾版本号或者补丁号,一些小范围的修修补补就可以更新补丁号。
查看当前所有模块的版本:

1
npm version

第一版本通常是0.0.1或者1.0.0,当修改了代码,需要更新版本号重新发布到npm,直接使用npm version 命令自动搞定。
x.y.z => major.minor.version
三个选项分别对应三部分的版本号,每次运行命令会导致相应的版本号递增一,同时子版本号清零。

  • npm version patch 则 z+1
  • npm version minor 则 y+1 && z=0
  • npm version major 则 x+1 && y=0 && z=0
    当然也可以粗暴的这样
    1
    npm version 1.12.9

每次发布项目的时候,记得更新版本号。

如果npm包同时又是一个git仓库,在运行了npm version 和npm publish之后,npm会自动给git仓库打上一个跟当前版本号一样的tag,对于挂在github上的npm包很有用。

给项目增加备注

有时候安装模块的时候会有以下警告

1
2
3
npm WARN package.json %ID% No description
npm WARN package.json %ID% No repository field.
npm WARN package.json %ID% No README data

这样项目怎么使用,用户可能比较困惑。
所以尽量完善这些备注。
前两者,在npm init的时候填写description和reponsitory即可。
最后一个在根目录下添加README.md即可。

新建npm账户

新建npm的用户,运行

1
npm adduser

设置账号密码之类
在运行下面命令,就知道自己的信息

1
npm whoami

上面已经登录账户
因此可以更新init,将username换成刚设置的

1
npm init --scope=<username>

更新package.json.

发布npm

首先去npm注册账号,然后

1
npm login

就可以发布自己的包了

1
npm publish

删除包,有发布就有删除,删除好像有个限制,如果大于24小时,需要联系npm管理员删除。

1
npm unpublish <module>

npm包之间的深度依赖关系

基本从npm3开始已经变成扁平化结构,具体参照玩转npm
但每次安装/卸载了包之后最好重新执行npm dedupe,因为这样会重新计算包的依赖关系,以保证包结构是最优的。

1
npm dedupe

设置发布的标签

目前知道的标签有beta和latest,next

怎么设置呢

1
npm dist-tag add [module]@version beta

这样这个版本就设置为beta版

1
npm info

就可以看到有dist-tag这项

删除发布的标签

有时候需要删除beta

1
npm dist-tag rm [module] beta

玩转npm
npm常用你应该懂的使用技巧
npm 使用小结