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