前言
npm作为开发的一个常用的工具,在使用的时候,当然可以得心应手,但是有时候真的问自己,到底有多了解这个常用的工具,其实也是觉得有点心虚,有种“只会用但不了解”的感受。当然这并不会影响我的开发和使用,但是总觉得不去认真梳理一下,有种罪恶感。
因此,就梳理一下自己的知识吧,大家要辩证地看待,我也是尽量负责任地描述正确的观点,如有误解,务必告诉鄙人,我也想学习更多了解更多
简单知道npm
npm,是node package manager的缩写,从名称上理解,node 包管理器。npm的背后,是有一个软件注册中心(registry,下面解释到),理解为一个数据库,详细记录了每个包(package)的信息,包括作者、版本、依赖、授权信息等。来自各个大陆的开源开发人员使用npm来共享和借用包,许多组织也使用npm来管理私有开发。
从作用上认识:
NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题。
- 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
- 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
- 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
如果我换种说法的话,就好像,你下载使用别人的类库,以及你自己封装类库上传给别人使用差不多吧
从官方上定义上理解,可以大体上从三部分去认识它:
- the website
- the Command Line Interface (CLI)
- the registry
- package
website
npm有个著名的 网站,在这个网站上,可以寻找和了解包的情况,找到合适自己使用的工具资源等。使用该网站来发现包、设置配置文件和管理npm体验的其他方面
CLI
从名字上就能知道了,就是命令行接口。说白了就是用来与npm进行交互的输入的命令脚本
the registry
从中文上理解,可以理解为注册表,注册中心,或者npm注册源,它是一个大型的JavaScript软件公共数据库。每个包由软件和元数据组成。开源开发人员和公司的开发人员使用npm registry向整个社区或其组织的成员提供包,并下载包用于自己的项目。
package
上面三点都提及到一个概念——package(中文翻译过来就包啦,所以我们通俗地称呼它为包),那实际上它是个什么东西呢?撇开官腔话解释,我们可以通俗点去理解一下,它是一个软件工具,是一个类库,是一份组织好的代码,它提供出来使用,或者是开发者自己整理好这份代码,那就需要包装好它整理好它,很形象地称之为pacakge。
简单来说,就是打包好一份代码啦。
那官方一点讲,package(包)是一个文件或者文件夹,它包含一个名叫package.json的文件,由它来描述包的信息,以便发布到npm registry
从用途上理解,例如我有一些封装好的工具、函数,或者框架类库,想要多人维护它的话,就要打包出来发布到一个线上的地方(registry),别人可以用来下载来,然后共同维护开发。或者也是单纯的想要提供给别人使用,也需要打包出来吧,形成一份独立的文件,这就是package的含义了。
关于pacakge的概念认知,先到这里,大家先去知道这么一个东西,关于它的更多内容,下一篇会进行详细介绍。
小结
实际上,npm就是围绕这package来进行一系列管理操作,它提供了一个地方存放这些包信息(registry),并提供一些命令(CLI)来让用户去管理pacakge。而我们怎么知道这些包的信息或者去寻找他呢,就是去 网站 里了解了。
拥有你的npm账号
要使用npm进行开发,首先得拥有一个npm账号,这样方便你在npm圈子里进行活动。
前往 login page
界面操作我相信聪明的你肯定会了,那简单说一下一些注册信息,方便更好的填写
- Full name: 顾名思义,就是你的全名啦
- Public email:你的公共电子邮件地址将被添加到包的元数据中,并对下载你的包的任何人可见。当你更新包时,我们也会发送电子邮件到这个帐户,以及偶尔的产品更新和信息。
- Username: 用户名,当您在npmjs.com上发布包或与其他npm用户交互时将显示的用户名。您的用户名必须小写,并且可以包含连字符和数字。
- Password:密码
npm账号分为两种,一个是免费用户,一个是付费用户。前者发布的包和使用的包都是面对大众的,公用的。后者是可以发布自己私有的npm包或创建一个组织(企业等),允许发布组织私有包和使用一些私有的包
npm登录
默认地,运行一下命令,就会在你默认设置的registry里进行登录,没有更改过默认设置就是在http://registry.npmjs.org
(后面有详细说明):
npm login
接下来会提示你输入你的信息,按照你注册的信息输入即可
登录成功后,可以检查一下,运行
npm whoami
接着会输出现在登录的账号用户名
配置本地npm环境
npm的使用是基于nodejs的环境下的,因此需要在你的电脑上安装nodejs。安装的途径有两个
- 使用版本管理器下载安装
- 使用安装包直接下载安装
当然我们强烈是建议使用第一种方式,这样的话,在你后续需要对你的应用进行各个版本测试时方便切换node版本和npm版本,以及你需要同时负责好几个项目,而这几个项目需要用到不同版本的npm时进行切换开发。
尽管你当前没有这种需求,但是为了后续以防万一,还是使用第一种方式比较好。
使用版本管理器下载安装
针对不同系统的用户,采用不同的版本管理器应用
针对OSX 或 Linux
Windows
使用安装包直接下载安装
前往 官网 选择对应的版本进行下载,建议选择有LTS(long term support)标记的版本,顾名思义,有这种标记的版本是被长期维护支持的,可靠性比较高
如果你是使用Linux的,建议使用 NodeSource installer 进行安装
npm版本
在我们下载安装好nodejs后,其实npm也相应的自动已经安装好了,下载不同版本的nodejs就会有不同版本的npm,但是npm版本的迭代速度要比nodejs的快,所以,你要确认一下安装的npm版本是否是你想要的。
在命令行工具中运行 npm -v
,查看当前的npm版本。
在命令行工具中运行 node -v
,查看当前的nodejs版本。
latest release & next release
如果你想要把npm更新到新版本,可以先了解一下这两个版本的区别
latest release
最新的稳定版本。是已经发布了的。 运行以下命令即可
npm install npm@latest
next release
npm的最新未发布版本,最终作为最新版本发布。一般是你想在发布前就使用即将的新版本进行测试时。运行以下命令即可
npm install npm@next
设置npm registry
npm registry,我们常说的npm源,常见的是说使用淘宝源。为什么需要设置这个东西?默认地,我们发布的公共包,是发到http://registry.npmjs.org
上,别人搜索进行下载资源也是基于这个资源库。但是有些时候,你下载的资源需要从别处来下,例如使用淘宝源,会是下载更顺畅速度更快,更多时候,当你需要下载的公司的私有资源时,就需要设置对应的公司资源所在地址。因此,我们常会遇到一个问题,我如何设置这个地址,即npm registry
设置默认registry
这方法简单粗暴,直接把你的npm registry设置一个默认的注册地址
npm config set registry xxx
xxx为你想要的注册地址
利用npmrc工具分情况使用默认注册地址
有时候在不同项目里,需要采用不同的registry地址来进行npm包的处理,例如项目A需要用源A,项目B需要用源B。
这时候我们可以使用 npmrc 这个工具来管理。
先了解下该工具的一些简单的命令
npmrc // 列出所有的profiles
npmrc [name] // 切换profile,支持模糊匹配
npmrc -c [name] // 创建新profile,并命名为[name]
1)要使用该工具,首先就得要安装
注意:这跟.npmrc文件是不同的,这里是一个npm包工具
运行以下命令进行全局安装
npm i npmrc -g
2)新建profile
npmrc -c projectA
新建了一个名叫projectA的profile
3)设置该profile下的npm registry
命令跟设置默认注册源是一样的
npm config set registry xxxxA
就是这么简单的三步,就能划分出了一个profile,对其设置该registry,同理按照以上第二步和第三部,再新建一个profileB,和设置源B。这时候就会有两个profile,有其对应的源。 这时候,我们就可以根据项目的需要,切换到不同的profile下,就能自动使用对应的注册源了。
4)切换profile
npmrc projectB
例如上述命令,切换到了另一个名叫projectB的profile上
为npm包设置域,针对域设置不同registry
前面两个解决方案,都能解决不同项目下使用不同的npm registry,但是他们是单独的一个项目下的npm资源统一使用一个npm registry,那万一是一个项目下的资源要是分别使用不同的npm registry呢?上面的两个方案就有点力不从心了。
这时候,我们可以对npm包进行分域,一个域下的资源使用一个registry。
设置域
我们在进行安装npm包时,就可以设置该包所在的域了。例如
npm install @myscope/packageName
从这行命令来看,就是下载安装一个名叫packageName的npm包,放在了node_modules文件夹下的myscope文件下。这里的用myscope就是该包所在的域的名字,@为域的一个使用标识。
设置了之后在package.json文件里也可以看到,已经加上了这么一个域名,在例如使用nodejs的require()引用文件时,也是要带上这个@域名的。毕竟文件是在这个文件夹下的
by the way,设置域除了为了设置不同registry的目的外,还可以用来避免和其它包重名,避免冲突。
设置域的registry
对包进行分好域后,就要设置该域下的npm包采用哪个registry来进行管理资源了。 运行
npm login --registry=xxxx --scope=@myscope
或者
npm config set @myscope:registry xxxx
这样一来,我们就对名叫myscope的域设置了xxx的registry地址了。之后在处理这些包的时候,就会使用该注册地址。未设置的,还是用回之前默认的地址。
登录不同registry
上面介绍了设置不同registry,那么我们怎么按照需求登录上不同的registry,然后进行不同的管理呢?
默认登录
运行npm login
就会在当前设置的默认registry下进行登录
指定registry登录
1)使用npmrc工具
如果使用了npmrc工具,可以npmrc profilename
切换到默认指定了registry的profile下,然后运行npm login
登录即可
2)直接指定登录
运行npm login --registry=xxxx