npm入门(一)—了解基本组成与概念

前言

npm做为开发的一个经常使用的工具,在使用的时候,固然能够驾轻就熟,可是有时候真的问本身,到底有多了解这个经常使用的工具,其实也是以为有点心虚,有种“只会用但不了解”的感觉。固然这并不会影响个人开发和使用,可是总以为不去认真梳理一下,有种罪恶感。node

所以,就梳理一下本身的知识吧,你们要辩证地看待,我也是尽可能负责任地描述正确的观点,若有误解,务必告诉鄙人,我也想学习更多了解更多git

简单知道npm

npm,是node package manager的缩写,从名称上理解,node 包管理器。npm的背后,是有一个软件注册中心(registry,下面解释到),理解为一个数据库,详细记录了每一个包(package)的信息,包括做者、版本、依赖、受权信息等。来自各个大陆的开源开发人员使用npm来共享和借用包,许多组织也使用npm来管理私有开发。github

从做用上认识:web

NPM是随同NodeJS一块儿安装的包管理工具,能解决NodeJS代码部署上的不少问题。数据库

  • 容许用户从NPM服务器下载别人编写的第三方包到本地使用。
  • 容许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
  • 容许用户将本身编写的包或命令行程序上传到NPM服务器供别人使用。

若是我换种说法的话,就好像,你下载使用别人的类库,以及你本身封装类库上传给别人使用差很少吧npm

从官方上定义上理解,能够大致上从三部分去认识它:json

  • the website
  • the Command Line Interface (CLI)
  • the registry
  • package

website

npm有个著名的 网站,在这个网站上,能够寻找和了解包的状况,找到合适本身使用的工具资源等。使用该网站来发现包、设置配置文件和管理npm体验的其余方面windows

CLI

从名字上就能知道了,就是命令行接口。说白了就是用来与npm进行交互的输入的命令脚本bash

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。安装的途径有两个

  1. 使用版本管理器下载安装
  2. 使用安装包直接下载安装

固然咱们强烈是建议使用第一种方式,这样的话,在你后续须要对你的应用进行各个版本测试时方便切换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