npm
Posted 鲸渔要加油
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了npm相关的知识,希望对你有一定的参考价值。
学习目标
◆ 能够使用 npm
管理包
◆ 能够说出 pageage.json
文件中属性的含义
◆ 知道怎么解决包下载慢的问题
◆ 了解如何开发包
◆ 了解如何发布包
◆ 熟练模块的加载机制
◆ 熟练 express基本操作
一、包
Node.js
中的第三方模块又叫做包
包的来源
-
Node.js
中的包是由第三方个人或团队开发出来的,都是免费且开源的,不需要付费即可免费下载使用 -
包是基于内置模块封装出来的,提供了更高级、更方便的
API
,极大的提高了开发效率
搜索包的网站: npm
下载包的网站: https://registry.npmjs.org/
- 下载包使用
npm
,全名叫做Node Package Manager
(简称npm
包管理工具),这个包管理工具随着Node.js
的安装包一起被安装到了用户的电脑上 - 可以在终端中执行
npm -v
命令,来查看自己电脑上所安装的npm
包管理工具的版本号
二、npm 初体验
1. 装包
- 如果想在项目中安装指定名称的包,需要运行如下的命令
npm install 包的完整名称
- 上述的装包命令,可以简写成如下格式
npm i 包的完整名称
npm i moment
# 安装一个包
npm i xxx
# 安装多个包
npm i xxx1 xxx2
2. 格式化时间的做法对比
传统做法
// 格式化时间方法.js
// 1. 定义格式化时间的方法
function dateFormat(dtStr) {
const dt = new Date(dtStr)
const y = dt.getFullYear()
const m = padZero(dt.getMonth() + 1)
const d = padZero(dt.getDate())
const hh = padZero(dt.getHours())
const mm = padZero(dt.getMinutes())
const ss = padZero(dt.getSeconds())
return `${y}-${m}-${d} ${hh}:${mm}:${ss}`
}
// 定义补零的函数
function padZero(n) {
return n > 9 ? n : '0' + n
}
module.exports = {
dateFormat
}
// 对时间进行格式化.js
// 导入自定义的格式化时间的模块
const TIME = require('./014 - timeformat')
// 调用方法,进行时间的格式化
const dt = new Date()
// console.log(dt)
const newDT = TIME.dateFormat(dt)
console.log(newDT)
使用第三方包做法
- 使用
npm
包管理工具,在项目中安装格式化时间的包moment
- 使用
require()
导入格式化时间的包 - 参考
moment
的官方API
文档对时间进行格式化
// 1.moment
const moment = require('moment')
// 2.参考 moment 官方 API 文档,调用对应的方法,对时间进行格式化
// 2.1 调用 moment() 方法,得到当前的事件
// 2.2 针对当前的时间,调用 format() 方法,按照指定的格式进行时间的格式化
const dt = moment().format('YYYY-MM-DD HH:mm:ss')
console.log(dt)
3. node_modules 和 pageage-lock.json
初次装包完成后,在项目文件夹下多一个叫做 node_modules
的文件夹和 package-lock.json
的配置文件,他们的作用是:
node_modules
文件夹用来存放所有已安装到项目中的包。require()
导入第三方包时,就是从这个目录中查找并加载包package-lock.json
配置文件用来记录node_modules
目录下的每一个包的下载信息,例如包的名字、版本号、下载地址等
4. 安装指定版本的包
默认情况下,使用 npm install
命令安装包的时候,会自动安装最新版本的包,如果需要安装指定版本的包,可以在包名之后,通过 @
符号指定具体的版本
npm i moment@2.22.2
5. 包的语义化版本
npm
规定,在项目根目录中,必须提供一个叫做 package.json
的包管理配置文件。用来记录与项目有关的一些配置信息
- 项目的名称、版本号、描述等
- 项目中都用到了哪些包
- 哪些包只在开发期间会用到
- 那些包在开发和部署时都需要用到
例如:2.24.0
- 第 1 位数字: 大版本
- 第 2 位数字: 功能版本
- 第 3 位数字: bug修复版本
- 只要前面的版本号增长了,后面的版本号就要归零
三、包管理配置
1. package.json 配置文件的作用
-
由于在一个项目中包的体积过大,不方便团队成员之间共享项目源代码,所以需要在共享时剔除
node_modules
-
npm
规定,在项目根目录中,必须提供一个叫做package.json
的包管理配置文件,用来记录项目中都用到了哪些包,从而方便剔除node_modules
目录
注意: 今后在项目开发中,一定要把 node_modules
文件夹,添加到 .gitignore
忽略文件中
2. 快速创建 package.json
npm
包管理工具提供了一个快捷命令,可以在执行命令时所处的目录中,快速创建 package.json
这个包管理配置文件
npm init -y
3. dependencies 节点
package.json
文件中,有一个 dependencies
节点,专门用来记录您使用 npm install
命令安装了哪些包,本来没有,装包就有了
注意:
- 上述命令只能在 英文的目录 下成功运行!项目文件夹的名称不能使用 中文 ,不能出现 空格
- 运行
npm install
命令安装包的时候,npm
包管理工具会自动把包的名称和版本号,记录到package.json
中
4. 一次性安装所有的包
-
当我们拿到一个剔除了
node_modules
的项目之后,需要先把所有的包下载到项目中才能运行起来,否则会报错 -
可以运行
npm install
命令(或npm i
)一次性安装所有的依赖包 -
执行
npm i
命令时,npm
包管理工具会先读取package.json
中的dependencies
节点,读取到记录的所有依赖包和版本号之后,npm
包管理工具会把这些包一次性下载到项目中
# 报错
Error: Cannot find module 'moment'
# 一次性装包
npm i
5. 卸载包
可以运行 npm uninstall
命令,来卸载指定的包,没有简写
注意: npm uninstall
命令执行成功后,会把要卸载的包,自动从 package.json
的 dependencies
中移除掉
npm uninstall moment
6. devDependencies 节点
- 如果某些包只在项目开发阶段会用到,在项目上线之后不会用到,则建议把这些包记录到
devDependencies
节点中 - 与之对应的,如果某些包在开发和项目上线之后都需要用到,则建议把这些包记录到
dependencies
节点中
# 安装指定的包,并记录到 devDependencies 节点中
npm install 包名 --save-dev
npm install --save-dev 包名
# 简写
npm i 包名 -D
npm i -D 包名
四、解决包下载慢的问题
在使用 npm
下包的时候,默认从国外的 npm
服务器进行下载,此时,网络数据的传输需要经过漫长的海底光缆,因此下包速度会很慢
使用淘宝的 npm 镜像服务器
- 切换
npm
的下包镜像源
下包的镜像源,指的就是下包的服务器地址
# 查看当前的下包镜像源
npm config get registry
# 将下包的镜像源切换为淘宝镜像源
npm config set registry=https://registry.npm.taobao.org/
使用 nrm 切换下载包的服务器
为了更方便的切换下包的镜像源,可以安装 nrm
这个小工具,利用 nrm
提供的终端命令,可以快速查看和切换下包的镜像源
# 1.通过 npm 包管理工具,将 nrm 安装为全局可用的工具
npm i nrm -g
# 2.查看所有可用的镜像源
nrm ls
# 3.将下包的镜像源切换为 taobao 镜像
nrm use taobao
五、包的分类
1. 项目包
-
那些被安装到项目的
node_modules
目录中的包,都是项目包 -
项目包又分为两类,分别是:
开发依赖包,记录到devDependencies
节点,只在开发期间会用到
核心依赖包,记录到dependencies
节点,在开发期间和项目上线之后都会用到
npm i 包名 -D # 开发依赖包
npm i 包名 # 核心依赖包
2. 全局包
-
在执行
npm install
命令时,如果提供了-g
参数,则会把包安装为全局包 -
全局包会被安装到
C:\\Users\\用户目录\\AppData\\Roaming\\npm\\node_modules
目录下 -
注意:
只有工具性质的包才有全局安装的必要性,判断某个包是否需要全局安装可以参考官方提供的使用说明
npm i 包名 -g # 安装全部包
npm uninstall 包名 -g # 卸载全部包
3. i5ting_toc 的安装和使用(全局包)
i5ting_toc
是一个可以把 md
文档转为 html
页面的小工具
# 将 i5ting_toc 安装为全局包
npm install -g i5ting_toc
# 调用 i5ting_toc, 轻松实现 md 转 html 的功能
i5ting_toc -f 要转换的md文件路径 -o
六、开发属于自己的包
1. 规范的包结构
一个规范的包,它的组成结构,必须符合以下 3 点要求
-
包必须以单独的目录而存在
-
包的顶级目录下要必须包含
package.json
这个包管理配置文件 -
package.json
中必须包含name
,version
,main
这三个属性,分别代表包的名字、版本号、包的入口
2. 发布包
1. 注册 npm
账号
- 访问 npm 网站,点击
sign up
按钮,进入注册用户界面 - 填写账号相关的信息:
Full Name
、Public Email
、Username
、Password
- 点击
Create an Account
按钮,注册账号 - 登录邮箱,点击验证链接,进行账号的验证
2. 登录 npm
账号
- npm
账号注册完成后,可以在终端中执行
npm login` 命令,依次输入用户名、密码、邮箱后,即可登录成功 - 注意:在运行
npm login
命令之前,必须先把下包的服务器地址切换为npm
的官方服务器。否则会导致发布包失败!
3. 把包发布到 npm
上
- 将终端切换到包的根目录之后,运行
npm publish
命令,即可将包发布到npm
上(注意:包名不能雷同)
4. 删除已发布的包
-
运行
npm unpublish 包名 --force
命令,即可从npm
删除已发布的包 -
注意事项
npm unpublish
命令只能删除 72 小时以内发布的包
npm unpublish
删除的包,在 24 小时内不允许重复发布
发布包的时候要慎重,尽量不要往npm
上发布没有意义的包!
七、模块的加载机制
1. 优先从缓存中加载
模块在第一次加载后会被缓存,这意味着多次调用 require()
方法不会导致模块的代码被多次执行
注意: 不论内置模块、用户自定义模块、还是第三方模块,他们都会优先从缓存中加载,从而提高模块的加载效率
2. 内置模块的加载优先级
内置模块是由 Node.js
官方提供的模块,内置模块的加载优先级最高
例如: require('fs')
始终返回内置的 fs
模块,即使在 node_modules
目录下有名字相同的包也叫做 fs
const fs = require('fs') // 始终返回的是内置的 fs 模块
3. 自定义模块的加载机制
-
使用 require() 加载自定义模块时,必须指定以
./
或者../
开头的路径标识符。在加载自定义模块时,如果没有指定./
或../
这样的路径标识符,则node
会把它当作内置模块
或第三方模块
进行加载 -
在使用
require()
导入自定义模块时,如果省略了文件的拓展名,则Node
会按照顺序分别尝试加载以下文件- 按照 确切的文件名 进行加载
- 补全 **
.js
**扩展名进行加载 - 补全 **
.json
** 扩展名进行加载 - 补全
.node
扩展名进行加载 - 加载失败,终端报错
4. 第三方模块的加载机制
-
如果传递给
require()
的模块标识符不是一个内置模块,也没有以'./'
或'../'
开头,则Node.js
会从当前模块的父目录开始,尝试从/node_modules
文件夹中加载第三方模块 -
如果没有找到对应的第三方模块,则移动到再上一层父目录中,进行加载,直到文件系统的根目录
5.目录作为模块
当把目录作为模块标识符,传递给 require()
进行加载的时候,有三种加载方式:
- 在被加载的目录下查找一个叫做
package.json
的文件,并寻找main
属性,作为require()
加载的入口 - 如果目录里没有
package.json
文件,或者main
入口不存在或无法解析,则Node.js
将会试图加载目录下的index.js
文件 - 如果以上两步都失败了,则
Node.js
会在终端打印错误消息,报告模块的缺失:Error: Cannot find module xxx
以上是关于npm的主要内容,如果未能解决你的问题,请参考以下文章
Error: Python executable “H:devpython3.10python.EXE“ is v3.10.0, which is not supported by gyp.(代码片段