NPM是什么
NPM(node package manager Node包管理器)
以往的Web开发中,JS文件数量少,依赖少,逻辑相对简单。需要jQuery时,跑到官网下载后引用,需要Bootstrap时,官网下载后引用,大部分都是这样。
但是伴随着Web时代到来,需求功能变多,需要依赖、引用、复用的库渐渐增多,有人就觉得这样十分麻烦,不可以由一个服务器来管理所有的库、功能包吗?NPM的雏形就诞生了。当时Node.js还在Ryan Dahl的大脑里孕育着,所以NPM刚出来时并没有得到注意和推广,社区力量薄弱,创始人在一次与Ryan Dahl聊天时,将这个想法告知了Ryan Dahl,他觉得这主义不错,就将NPM纳入了Node.js中。NPM的成功推广也是由Node.js所带来的。
NPM常见的使用场景有:
- 允许用户从NPM服务器下载别人编写的第三方包到本地应用。
- 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
- 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
安装
window:npm install npm -g
安装模块:使用NPM来安装一个模块,并使用它。
- 创建一个my-project目录,安装colors模块,然后创建一个index.js文件。
md my-project
cd ./my-project/
npm install colors
安装完成后,可以在当前目录下查看是否有node_modules/colors目录。
注意,这只是在当前目录下安装,只能再对应目录下使用。这样每到一个新目录都得重新安装一次,我们可以使用全局安装。
npm install -g colors
创建index.js
cd .>index.js
在文件中写如下内容:
require("colors");
console.log("hello world" .rainbow);
运行index.js,你就会看到彩虹色的hello world了。

npm ls:可以查看安装了哪些包

npm ls pkg:查看特定package的信息,运行如下命令,输出colors的信息
npm info pkg: 如果要查看更详细信息,可以通过npm info pkg ,输出的信息非常详尽,包括作者、版本、依赖等。

进入node_modules/colors模块中,看一看文件构成。
其中package.json带着一些这个包的元数据的文件。一个网站,将会依赖于几十上百个包。这些包通常很小。
name - 包名。
version - 版本号。
description - 描述。
homepage - 官网。
author - 作者姓名。
contributors - 包的其他贡献者姓名。
dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。
repository - 包代码存放的位置。
等等。
自定义模块
要自定义模块,你需要创建一个package.json文件。通过这种方式来定义模块有三种好处。
- 可以很方便的将项目中的模块共享给其他人,不需要将整个node_modules目录发送给他们。因为有了package.json之后,其他人运行npm install就可以把依赖的模块都下载下来了,在以往,都是直接将node_modules目录发送给别人,这是馊主意。特别是当使用Git这样的SCM系统进行代码控制的时候。
- 可以很方便的纪录所依赖模块的版本号。举个例子来说,当你的项目通过npm install colors安装的是0.5.0的colors。一年后,由于colors模块API的开放,可能导致与你的项目不兼容,如果你使用npm install并且不指定办版本号来安装的话,你的项目就没法正常运行了。
- 让分享更简单。如果你的项目不错,你是否想将它分享给别人?这时,因为有package.json文件,通过npm publishiucn可以将其发布到NPM库中供所有人下载使用了。
在原先的目录中,删除node_modules目录,并创建一个package.json文件:
md .>package.json
vim package.json
添加如下内容:
{
"name": "my-colors-project",
"version": "0.0.1",
"dependencies": {
"colors": "0.5.0"
}
}
package.json文件是从Node.js和NPM两个层面来描述目的。其中只有name和version是必要的字段,也叫最少配置项:
-
"name"
- 全部为小写字母
- 一个单词,无空格
- 允许半角破折号和下划线
-
"version"
- 格式为x.x.x
- 遵循语义化版本号规则semver spec
示例:
{
"name": "my-project-package",
"version": "1.0.0"
}
通常情况下,package.json还会定义一些依赖的模块,通过使用一个对象,将依赖模块的模块名以及版本号以对象的属性和值将其定义在package.json文件中。
保存之前的内容,安装依赖的模块,然后再次运行index.js文件:
npm install
node index # 注意了,这里不需要加上".js"后缀。
当运行npm install后,就会自动为项目安装依赖项。

运行node index,结果和之前显示的也一样。

在这个例子中,自定义模块是内部使用的,如果想发布出去,NPM提供了如下这种方式,可以很方便的发布模块 :
npm publish
当别人使用require('my-colors-project')时,为了能够让Node知道该载入哪个文件,我们可以在package.json文件中使用main属性来指定:
{
"name": "my-colors-project",
"version": "0.0.1",
"main": "./index",
"dependencies": {
"colors": "0.5.0"
}
}
当需要让模块暴露API的时候,main属性就会变得尤为重要,因为你需要为模块定义一个入口(有时候,入口可能是多个文件)。
npm help json:查看package.json文件所有的属性文档
tips:如果你不想发布你的模块,那么在package.json中加入"private":"true"。可以避免误发布。
NPM有一个丰富的仓库,包含了上千个模块。NPM有两个命令可以用来在仓库中搜索和查看模块:search和view。
例如,要搜索realtime相关的模块,可以使用如下命令:
npm search realtime
该命令会在已发布模块的name、tags以及description字段中搜索此关键字,并返回匹配的模块。
找到了感兴趣的模块后,通过运行npm view命令,后面紧跟该模块名,就能看到package.json文件以及NPM仓库相关的属性。
相关: