npm(Node Package Manager)
是 Node.js 标准的软件包管理器。如果了解centos的话,可以将其理解为类似yum
.
对于Node而言,NPM帮助起完成了第三方模块的发布,安装和依赖。而借助这个npm,Node与第三方模块之间形成了很好的生态系统。
安装好nodejs会自带安装好npm.所以只要搭建好Node环境,不需要另外安装NPM了。
现在看一下起常用的命令:
演示的环境是window是系统,然后再终端输入后(cmd窗口)
命令 | 描述 |
---|---|
npm | 帮助说明 |
npm init | 初始化模块环境创建 |
npm -v | 查看npm的版本 |
npm search 包名 | 搜索模块包是否存在 |
npm install 包名 (或简写 npm i 包名) [ --save| --save–dev ] | 在当前的目录安装包 |
npm install 包名 -g(或简写 npm i 包名 -g) | 全局模式安装包 |
npm uninstall 包名 | 卸载 |
npm update 包名 | 更新 |
npm info 包名 | 查看包的信息 |
npm outdated | 检测包过期有那些 |
npm config ls | 查看node的配置信息 |
为了方便演示:将路径cd在:F:\test
这个现实npm的版本,常用来查看是否安装了npm。
这个是查看npm有哪些命令的一个命令。
其实这个初始化,我们先试一下:如下
在初始化的时候,需要依次输入包名,版本等信息(如果想要快速初始化可以:npm init -y ,就需要依次输入这些信息了),图中没有输入确定创建,所以可以看出文件夹下面是空的。
然后输入确定后如下:
可见初始化的时候,生成了一个package.json
文件,然后看一下这个文件的内容:
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "小猪弟",
"license": "ISC"
}
可以看出初始化的时候会出事一个模块的配置信息,其是不是有点像是开发的软件版本信息的感觉?
如果我们在试着来一个命令插入某个包呢?先来一个插入命令,后面再具体聊这个命令。
插入一个math模块如下:
npm i math
可以看出多了一个文件node_modules,以及又有了一个package-lock.jsons文件。
其中node_modules文件放了使用的第三方的包或者说是模块。
下面来聊一下两个json。
现在需要解释一下package.json和package-lock.json的意义以及区别了
先看一下package.json和package-lock.json文件的内容:
package.json中字段解析。
name:项目名,也就是在使用npm init 初始化时取的名字,但是如果使用的是npm init -y 快速初始化的话,那这里的名字就是默认存放这个文件的文件名;
version:版本号;
descrotion:项目描述信息,简单描述一下功能
private:希不希望授权别人以任何形式使用私有包或未发布的;
scripts :指定来运行脚本命令的npm命令的缩写,尝试修改文package.json中的scripts为:
// 首先同文件下创建一个 1.js
//内容为:console.log('测试')
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start":"node ./1.js"
}
然后运行一下 npm run start
dependencies:指定了项目运行时所依赖的模块;这个命令是再插入第三方模块的时候: npm i 包名 --save。不过新版本不写默认是带有–save参数。
devDependencies:指定项目开发时所需要的模块,也就是在项目开发时才用得上,一旦项目打包上线了,就将移除这里的第三方模块;其插入的命令: npm i 包名 --save-dev,的时候会生成。
author: 模块作者
license:证书
package-lock.json:是在运行npm install时生成的一个文件,用于记录当前状态下项目中实际安装的各个package的版本号、模块下载地址、及这个模块又依赖了哪些依赖。
以前的版本是没有这个package-lock.json文件的,毕竟package.json已有这个开发模块依赖了哪些模块了,上传到一些共享平台(比如:github)上。就不需要上传第三方引用包了,毕竟可以通过这个json配置,然后下载即可。不然开发1M的代码,引用的第三方包有30M,也太浪费共享空间了。
但是这个又发现了一个问题,那就是第三方的包是不断迭代的,有些方法名字变了或者不用了, 而引用新版本会出现很多问题,比如报错等;package.json 仅会申请依赖包及其版本范围。 而 package-lock.json文件会申明具体的请求地址,具体的版本号,甚至 sha 值(怕别人修改已有包)。package-lock.json文件记录的依赖信息比package.json 更全。简单的说, 同一个 package.json 在两次 install 的时候安装的依赖可能不一样。 但是 package-lock.json文件可以保证不管几次安装, 安装的依赖都是一样的。
既然有这两个文件,那如何用?
其实这个涉及到npm install命令,这个下面聊这个问题。
npm install 可以简写为npm i 所以下面直接用npm i 进行演示。
在包版本可能需要初始化有了package.json然后才能插入包,不过现在新版本npm i 包名可以创建快速的package.json文件,以及新版本中多了一个package-lock.json这个锁定版本的文件。
还有一种下载的下载的上海可以定义版本如下写:
npm i 包名[@版本号]
首先常用的安装第三包的命令:
// 这个目前不用写 --save 因为默认就是
npm i math
这个是快捷创建package.json的方式得到如下:
// 可以看出自己包名以及包的版本信息,只有引入的第三方包的信息 所以可以快捷创建package.json,因为无法显示自己写的包的信息
{
"dependencies": {
"math": "^0.0.3"
}
}
这个时候有没有注意到一个神奇的地方,那就是插入math版本号前面有一个**^**.有什么意义吗?
首先说一下版本号的规范:一般版本号有三个数子带有不同的意义。格式如下:
主版本号.子版本号.修正版本号
版本前的特殊符号:
符号 ^ :
例子为:
{
"dependencies": {
"test": "^2.0.3"
}
}
表示:只会限定版本号的主版本号倍锁定,然后这个主版本号下最新的版本。
符号 ~ :
{
"dependencies": {
"test": "~2.0.3"
}
}
表示:只会限定版:主版本号和子版本号,然后安装最新版,也就是安装以主版本号和子版本号下的最新版本。
符号 ***** :
{
"dependencies": {
"test": "*"
}
}
表示安装最新版本。
不过一般package.json这个文件一般不会手动调正。
当然如果下载第三包带另一个参数:
npm i 包名 --save-dev
这个换一个第三方包:
npm i md5 --save-dev
这样看一下package.json如下:
// 因为没有采取初始化后再插入包,而是听过install 快速插入包。所以这个里面没有自定义包名等信息
{
"dependencies": {
"math": "^0.0.3"
},
"devDependencies": {
"md5": "^2.3.0"
}
}
可以看出dependencies和devDependencies 都是写出这个模块用到的第三放的包,但是两者又有一些区别:
上面下载的第三方包的时候,是在开发的路径下进行下载的。而且也只能在目标在这个路径下才可以调用,因为一般非全局的变量,调用第三方规则是:
这个路径下的 node_modules下的包,如果没有就找路径的父文件夹中是否有node_modules,依次类推。
而全局的包,却是无论在那个文件下都可以使用,当然也可以查看默认的安装路径:
// 查看默认全局安装的路径
npm config ls;
// 也可以修改这个路径的地址
npm config set prefix '修改的存储地址'
为什么要有一个全局呢?因为有些第三方工具,需要全部路径下可以用,比如修改镜像地址的工具:nrm。 这个类似与linux的镜像一个道理,那就是访问海外的镜像,有可能会下载很慢,可以通过这个配置镜像的地址,当然也可以通过命令修改镜像的地址但是使用nrm的更方便。
如果不使用nrm直接用命令修改地址如下:
npm config set registry 国内镜像地址
nrm (NPM registry manager)是 NPM 的镜像源管理工具,使用它可以快速切换 npm
命令镜像源。下面试一下:
// 下载nrm 这个工具
npm i nrm -g
虽然在F:\test中插入的,但是其没有在这个路径下,如果想知道在哪里,就通过上面提到的查看默认的全局地址试一下,不再演示。
可以看下nrm下有哪些源:
nrm ls
其实正常的化,如果使用了那个源,前面有一个星号的,我这个可能出现了bug,没有这个星号,所以网上找一个带有星号图看一下:
默认是npm源头,切换源可以如下操作:
nrm use taobao
当然nrm还有其它很多命令,下面再说两个:
//添加源
nrm add
// 删除源
nrm del
前面一直说到两个json文件,一直说上传共享的时这个两个json有什么用?
如下:
如何用?很简单:
// 引用的时候没有
npm i
这个就要说到package.json和package-lock.json在这个导入环境中所用的第三方包都起到什么作用。
首先导入的时候先检测package.json中对第三方包的版本限制的限制, 这个就是前面所说的在版本前面的特殊符号。然后再检测package-lock.json,如果其中第三方包的版本在package.json限制的范围之内,那就使用package-lock.json锁定的版本。如package-lock.json的锁定版本不在package.json范围内,就按照package.json限定版本进行下载,然后更新package-lock.json中的版本信息。
有些第三方的包,可以通过这个命令进行移除:
来一个例子:
// 如果是全局 -g
npm uninstall md5
其它的命令就直接演示一些使用常用命令,相对来说没必要聊太多。
搜索需要的包:
npm search 包名
更新包的版本:
npm update 包名
可以查看官网已经提示过期的第三方模块有哪些:
npm outdated
因为我刚按照以math模块,不可能过期,如果有过期的就会在这个地方显示出来。
查看包的信息:
npm info 包名
当然npm还有很多神奇的操作,如果需要了解可以看一些官网:https://www.npmjs.cn/
而目前为node的聊的后面一些自己的模块,第三方模块使用目前这些命令够用了。不够的话,以后再聊。