npm的使用
node.js通过自带的
npm
(node package manager)工具来管理第三方模块。
npm
全称Node Package Manager
(node 包管理器),它的诞生是为了解决 Node 中第三方包共享的问题。npm
命令行工具,不需要单独安装。在安装Node的时候,会连带一起安装npm
。- npm网站,是一个第三方模块store,可以自由地下载,上传模块。
- 官网
包(package)与模块关系
- node.js中一个模块就是一个单独的js文件。
- 包是多个模块的集合。一个模块能够解决的问题比较单一,一个包中有多个模块。
- npm 管理的单位就是包。
通过npm命令行下载第三方模块(包)
分成三步:
- 初始化项目。如果之前已经初始化,则可以省略。
- 安装包。 npm install 包名
- 引入模块,使用。
第一步:初始化项目
进入到项目所在的根目录下,启动cmd命令行窗口(按下shift键,点击右键,在弹出的菜单中选择在此处打开命令行)
输入如下命令:
npm init --yes
# 或者是
npm init -y
init命令用来在根目录下生成一个package.json文件,该文件中记录了当前项目的基本信息。它是一切工作的开始。
npm init 命令
:
在某个目录下开启cmd命令行窗口,输入如下命令:
npm init
它会启动一个交互式的程序,填入一些关于本项目的信息。最后会生成一个package.json文件。
如果希望直接采用默认信息,可以使用:
npm init --yes
# 或者是
npm init -y
说明:
- 这个命令只需要运行一次,它的目的仅仅是生成一个package.json文件。而这个package.json文件在后期是可以手动修改的。
- 如果项目根目录下已经有了package.json文件,就不需要再去运行这个命令了。
- 一般从网上clone下来的项目都会包含这个文件。
package.json文件
:
它整体是一个json字符串,是对当前项目的整体描述。其中最外层可以看作是一个js的对象(每一个属性名都加了"",这就是一个典型的json标记)。这个文件中有非常多的内容:
-
name,表示这个项目的名字。如是它是一个第三方包的话,它就决定了在require()时应该要写什么内容
-
version,版本号
第二步:安装包
生成了package.json文件之后,就可以来安装第三方包了。在npm官网中,有上百万个包,供开发者使用。
node_modules文件夹
这个文件夹中保存着从npm中下载来的第三方包。在使用npm install 命令时,会修改这个文件夹中的内容。具体如下,当键入npm install XXX
之后(这里假设这个XXX包是存在的,也没有出现任何的网络错误):
-
如果有package.json
(1) 修改package.json文件。根据开发依赖和生产依赖的不同,决定把这句记录加在devDependencies或者是dependencies列表中。
(2) 修改node_modules文件夹
- 如果有node_modules文件夹,则直接在下面新建名为XXX的文件夹,并从npm中下来这个包。
- 如果没有node_modules,则先创建这个文件夹,再去下载相应的包。
-
如果没有package.json。会给一个警告信息
说明
:
- 建议先初始化项目,创建package.json文件之后,再去install包。
- 在分享代码时,一般不需要把node_modules也给别人(就像不需要把jquery.js给别人,因为他们可以自己去下载)。别人拿到代码之后,先运行npm install(后面不接任何的包名),自己去安装依赖包。
全局安装包和本地安装包
通过npm install
命令来安装包,简单说就是把包从npm的官网上下载到自己的电脑中。具体这个包下载到哪里了,还是有一点讲究的。
分成两类:
- 全局安装: 包被安装到了系统目录(一般在系统盘的node_modules中),本机都可以使用。
- 命令:
npm install -g 包名
- 命令:
- 局部安装(或者叫本地安装),包被安装在当前项目的根目录下,与package.json同级目录的node_modules。就只在这个项目中可以使用。
- 命令:
npm install 包名
- 命令:
全局安装nrm包
因为下载包时,默认是从npm官网(国外的网站)下载,速度可能会比较慢。在npm有一个工具可以来手动设置从哪里去下载包。这个工具就是nrm。这个工具是帮助切换安装包的来源的,不应该只限于某个具体的项目,所以采用全局安装的方式来安装它。
nrm的使用方法:
# 第一步: 全局安装
npm install nrm -g
# 第二步:列出所有的源信息
# (*)标注的就是当前使用的源
nrm ls
# 第三步:根据需要切换源
# 例如:指定使用taobao源
nrm use taotao
全局包与本地包的区别
-
全局安装的包一般可提供直接执行的命令。通常对一些工具类的包采用这种方式安装,如:
gulp, nodemon, live-server,nrm等。
-
本地安装的包是与具体的项目有关的, 需要在开发过程中使用这些具体的功能。
提示
:
- 要用到该包的命令执行任务的就需要全局安装。
- 要通过require引入使用的就需要本地安装。
require的加载机制
在使用一个模块时,会使用require命令来加载这个模块。以加载一个自定义模块为例,require(文件名)的效果是:
- 执行这个文件中的代码
- 把这个文件中的module.exports对象中的内容返回出来。
以如下代码为例:
// moudule1.js
var a = 1;
var b = 2;
console.log(a+b);
var c = a+b;
module.exports = {
data: c
}
在index.js中使用模块
// index.js
const obj = require('./moudule1.js');
console.log(obj);
// 这里的obj对象就是moudule1.js中的module.exports对象
require
优先加载缓存中的模块。- 如果是相对路径,则根据路径加载自定义模块,并缓存。
require('./main')
省略扩展名的情况。- 先加载
main.js
,如果没有再加载main.json
,如果没有再加载main.node
(c/c++编写的模块)。
- 如果不是相对路径,则加载核心模块,并缓存。
- 如果不是自定义模块,也不是核心模块,则加载第三方模块。
- node 会去本级 node_modules 目录中找。
- 如果在 node_modules 目录中找到
moment
目录,则加载该模块并缓存。 - 如果过程都找不到,node 则取上一级目录下找
node_modules
目录,规则同上。 - 如果一直找到代码文件的系统的根路径还找不到,则报错.
npm 常用命令
-
查看
npm --version npm -v # 查看npm 版本 npm root -g # 查看全局包的安装目录
-
升级 npm (npm自己安装自己)
npm install npm --global # 或者 npm install npm -g
-
初始化
package.json
npm init -y # 或者 npm init --yes
-
安装第三方包
# 安装package.json中列出的所有的包 npm install # 全局安装 npm install 包名 -g # 本地安装,没有指定版本,默认安装最新的版本 npm install 包名 # 一次安装多个包 npm install 包名1 包名2 包名3 # 安装指定版本的包 npm install 包名@版本号 # 简写,把install简写成 i npm i 包名
-
删除已安装的包
npm uninstall 本地安装的包名 npm uninstall -g 全局安装的包名