npm与包
包
1.什么是包
Node.js中的第三方模块
又叫做包
。
就像电脑和计算机指的是相同的东西,第三方模块和包指的是同一个概念,只不过叫法不同。
2.包的来源
不同于Node.js中的内置模块与自定义模块,包是第三方个人或团队开发出来的,免费供所有人使用。
注意
:Node.js中的包都是免费且开源的,不需要付费即可免费下载使用。
3.为什么需要包
由于Node.js的内置模块仅提供了一些底层的API,导致在基于内置模块进行项目开发的时候,效率很低。
包是基于内置模块封装出来的
,提供了更高级、更方便的API,极大的提高了开发效率。
包和内置模块之间的关系,类似于jQuery和浏览器内置API之间的关系。
4.从哪里下载包
国外有一家IT公司,叫做npm, Inc.
这家公司旗下又一个非常著名的网站:https://www.npmjs.com/,它是全球最大的包共享平台
,你可以从这个网站上搜索到任何你需要的包,只要你有足够的耐心!
到目前为止,全球约1100多万的开发人员,通过这个包共享平台,开发并共享了超过120多万个包供我们使用。
npm, Inc.公司
提供了一个地址为https://registry.npmjs.org/的服务器,来对外共享所有的包,我们可以从这个服务器上下载自己所需要的包。
注意:
- 从https://www.npmjs.com/网站上搜索自己所需要的包
- 从https://registry.npmjs.org/服务器上下载自己所需要的包
5.如何下载包
npm, Inc.公司
提供了一个包管理工具,我们可以使用这个包管理工具,从https://registry.npmjs.org/服务器把需要的包下载到本地使用。
这个包管理工具的名字叫做Node Package Manager(简称npm包管理工具
),这个包管理工具随着Node.js的安装包一起安装到了用户的电脑上。
可以在终端中执行npm -v
命令,来查看自己电脑上所安装的npm包管理工具的版本号:
$ npm -v
6.14.8
npm初体验
1.格式化时间的传统做法
- 创建格式化时间的自定义模块
- 定义格式化时间的方法
- 创建补零函数
- 从自定义模块中导出格式化时间的函数
导入格式化时间的自定义模块
调用格式化时间的函数
// 01.test.js
// 创建格式化时间的函数
function dataFormat(dtStr) {
}
// 创建补零函数
function padZero(n) {
}
// 导出格式化的时间的函数
module.exports = {
dataFormat
}
//02.test.js
// 导入格式化时间的自定义模块
const TIME = require('./01.test.js')
const dt = new Date()
// 调用格式化时间的函数
const newDT = TIME.dataFormat(dt)
console.log(newDT)
2.格式化时间的高级做法
使用npm包管理工具,在项目中安装格式化时间的包moment
- 使用require()导入格式化时间的包
- 参考moment的官方API文档对时间进行格式化
// 1.导入moment包
const moment = requrie('moment')
// 2.参考moment官方API文档,调用对应的方法,对时间进行格式化
// 2.1调用moment()方法,得到当前的时间
// 2.2针对当前的时间,调用format()方法,按照约定的格式进行格式化
const dt = moment().format('YYYY-MM-DD HH:mm:ss')
console.log(dt) // 输出 2022-12-30 16:23:48
3.在项目中安装包的命令
如果想在项目中安装指定名称的包,需要运行如下的命令:
npm install 包的完整名称
上述的安装命令,可以简写成如下格式:
npm i 完整的包名称
4.初次装包后多了哪些文件
初次装包完成后,在项目文件下多一个叫做node_modules的文件夹和packgae-lock.json的配置文件。
其中:
node_modules文件夹用来存放所有已安装到项目中的包
。require()导入第三方包时,就是从这个目录中查找并加载包。
package-lock.json配置文件用来记录node_modules目录下的每一个包的下载信息
,例如包的名字、版本号、下载地址等。
注意:程序员不要手动修改node_modules或package-lock.json文件中的任何代码,npm包管理工具会自动维护它们。
5.安装指定版本的包
默认情况下,使用npm install命令安装包的时候,会自动安装最新版本的包
。如果需要安装指定版本的包,可以在包名之后,通过@符号
指定具体的版本,例如:
npm i moment@2.22.2
6.包的语义化版本规范
包的版本号是以“点分十进制”形式进行定义的,总共有三位数字,例如2.24.0
其中每一位数字所代表的含义如下:
第一位数字:大版本
第二位数字:功能版本
第三位数字:Bug修复版本
版本号提升的规则
:只要前面的版本号增长了,则后面的版本号归零
。
包管理配置文件
npm规定,在项目根目录中,必须提供一个叫做package.json的包管理配置文件。用来记录与项目有关的一些配置信息。例如:
- 项目的名称、版本号、描述等
- 项目中都用到了哪些包
- 哪些包只在
开发期间
会用到 - 那些包在
开发
和部署
时都需要用到
1.多人协作的问题
遇到的问题:第三方包的体积过大
,不方便团队成员之间共享项目源代码。
解决方案:共享时剔除node_modules
2.如何记录项目中安装了哪些包
在项目根目录
中,创建一个叫做package.json
的配置文件,即可用来记录项目中安装了哪些包,从而方便剔除node_modules目录之后,在团队成员之间共享项目的源代码。
注意
:今后在项目开发中,一定要把node_modules文件夹,添加到.gitignore忽略文件中。
3.快速创建package.json
npm包管理工具提供了一个快捷命令
,可以在执行命令时所处的目录中
,快速创建package.json这个包管理配置文件:
// 作用:在执行命令所处的目录中,快捷新建package.json文件
npm init -y
注意:
- 上述命令
只能在英文的目录下成功运行
!所以,项目文件夹的名称一定要使用英文命名,不要使用中文,不能出现空格
。 - 运行npm install命令安装包的时候,npm包管理工具会自动把
包的名称
和版本号
,记录到package.json中。
4.dependencies
节点
package.json文件中,有一个dependencies
节点,专门用来记录您使用npm install命令安装了哪些包。
5.一次性
安装所有的包
当我们拿到一个剔除了node_modules的项目之后,需要先把所有的包下载到项目中,才能将项目运行起来。
否则会报类似于下面的错误:
// 由于项目运行依赖于moment这个包,如果没有提前安装好这个包,就会报如下的错误:
Error: Cannot find module 'moment'
可以运行npm install
命令(或npm i)一次性安装所有的依赖包:
// 执行npm install命令时,npm包管理工具会先读取package.json中的dependencies节点,
// 读取到记录的所有依赖包名称和版本号之后,npm包管理工具会把这些包一次性下载到项目中
npm install
6.卸载包
可以运行npm uninstall
命令,来卸载指定的包:
// 使用npm uninstall具体的包名来卸载包
npm uninstall moment
注意: npm uninstall命令执行成功后,会把卸载的包,自动从package.json的dependencies中移除掉。
7.devDependencies节点
如果某些包只在项目开发阶段
会用到,在项目上线之后不会用到
,则建议把这些包记录到devDependencies节点中。
与之对应的,如果某些包在开发和项目上线
之后都需要用到,则建议把这些包记录到dependencies节点中。
您可以使用如下的命令,将包记录到devDependencies节点中:
// 安装指定的包,并记录到devDependencies节点中
npm i 包名 -D
// 注意:上述命令时简写形式,等价于下面完整的写法:
npm install 包名 --save-dev
解决下包速度慢的问题
1.为什么下包速度慢
在使用npm下包的时候,默认从国外的https://registry.npmjs.org/服务器进行下载,此时,网络数据的传输需要经过漫长的海底光缆,因此下包速度会很慢。
2.淘宝NPM镜像服务器
淘宝在国内搭建了一个服务器,专门把国外官方服务器上的包同步
到国内的服务器,然后在国内提供下包的服务。从而极大的提高了下包的速度。
扩展:
镜像
(Mirroring)是一种文件存储形式,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。
3.切换
npm的下包镜像源
下包的镜像源,指的就是下包的服务器地址
。
// 查看当前的下包镜像源
npm config get registry
// 将下包的镜像源切换为淘宝镜像源
npm config set registry=https://registry.npm.taobao.org/
// 检查镜像源是否设置成功
npm config get registry
4.nrm
为了更方便的切换下包的镜像源,我们可以安装nrm
这个小工具,利用nrm提供的终端命令,可以快速查看和切换下包的景象源。
// 通过npm 包管理器,将nrm安装为全局可用的工具
npm i nrm -g
// 查看所有可用的镜像源
nrm ls
// 将下包的镜像源切换为淘宝镜像源
nrm use taobao
5.包的分类
项目包:
那些被安装到项目
的node_modules目录中的包,都是项目包。
项目包又分为两类,分别是:
开发依赖包
(被记录到devDependencies节点中的包,只在开发期间会用到)核心依赖包
(被记录到dependencies节点中的包,在开发期间和项目上线之后都会用到)
npm i 包名 -D # 开发依赖包(会被记录到devDependencies节点下)
npm i 包名 # 核心依赖包(会被记录到dependencies节点下)
全局包
在执行npm install命令时,如果提供了-g参数,则会把包安装为全局包。
全局包会被安装到用户电脑自己的node磁盘目录中eg:C:\Users\用户目录\AppData\Roaming\npm\node_modules目录下
npm i 包名 -g # 全局安装指定的包
npm uninstall 包名 -g # 卸载全局安装的包
注意:
- 只有
工具性质的包
,才有全局安装的必要性。因为它们提供了好用的终端命令。 - 判断某个包是否需要全局安装后才能使用,可以
参考官方提供的使用说明
即可。
i5ting_toc
i5ting_toc是一个可以把md文档转为html页面的小工具,使用步骤如下:
# 将i5ting_toc安装为全局包
npm install -g i5ting_toc
# 调用i5ting_toc,轻松实现md转html的功能
i5ting_toc -f 要转换的md文件路径 -o
6.规范包的结构
在清楚了包的概念、以及如何下载和使用包之后,接下来,我们深入了解一下包的内部结构
。
一个规范的包,它的组成结构,必须符合以下3点要求:
- 包必须以
单独的目录
存在 - 包的顶级目录下必须包含
package.json
这个包管理配置文件 - package.json目录中必须包含
name
、version
、main
这三个属性,分别代表包的名字
、版本号
、包的入门
。
注意:以上3点要求是一个规范包结构必须遵守的格式,关于更多的约束,可以参考如下网址:
https://yarnpkg.com
7.开发属于自己的包
需要实现的功能
功能1:
// 1.导入自己的包
const selfpackage = require('selfpackage-tools')
// -------功能1: 格式化日期-------
const dt = selfpackage.dateFormat(new Date())
// 输出 2023-01-05 10:09:45
console.log(dt)
功能2:
// 1.导入自己的包
const selfpackage = require('selfpackage-tools')
// ------功能2:转义HTML中的特殊字符------
const htmlStr = '<h1 style="color: red;">你好!©;<span>小黄!</span></h1>'
const str = selfpackage.htmlEscape(htmlStr)
// <h1 style="color: red;">你好!&copy;<span>小黄!</span></h1>
console.log(str)
功能3:
// 1.导入自己的包
const selfpackage = require('selfpackage-tools')
// -------功能3:还原HTML中的特殊字符------
const rawHtML = selfpackage.htmlUnEscape(str)
// 输出 <h1 style="color: red;">你好!©<span>小黄!</span></h1>
console.log(rawHTML)
上面三个功能建议自己手写出来尝试一下。
初始化包的基本结构
- 新建selfpackage-tools文件夹,作为
包的根目录
- 在selfpackage-tools文件夹中,新建如下三个文件:
package.json (包管理配置文件)
index.js (包的入口文件)
README.md (包的说明文档)
初始化package.json
{
"name": "selfpackage-tools",
"version": "1.0.0",
"main": "index.js",
"description": "提供了格式化时间", HTMLEscape的功能,
"keywords": ["selfpackage", "dateFormat", "escape"],
"licese": "ISC"
}
关于更多licese许可协议相关的内容,可参考https://www.jianshu.com/p/86251523e898
编写包的说明文档
包根目录中的README.md
文件,是包的使用说明文档
。通过它,我们可以事先把包的使用说明,以markdown的格式写出来。方便用户参考。
README文件中具体写什么内容,没有强制性的要求;只要能够清晰地把包的作用、用法、注意事项等描述即可。
我们所创建的这个包的README.md文档中,一般会包含以下内容:
安装方式、导入方式、功能函数的释义文档、开源协议等。
8.发布包
注册npm账号
- 访问https://www.npmjs.com网站 注册账号
- 填写账号相关的信息:Full Name、
Public Email
、Username
、Password
(标红的信息要注意发布包的时候会用到) - 登录邮箱,
点击验证链接
,进行账号到验证 (这一步很重要,不验证邮箱会发布失败)
登录npm账号
npm账号注册完成后,可以在终端执行npm login
命令,依次输入用户、密码、邮箱后,即可登录成功。
注意:在运行npm login命令之前,必须先把下包的服务器
地址切换为npm的官方服务器
。否则会导致发布包失败!
nrm ls 查看自己的使用源
nrm use npm 切换为npm源
npm login 然后登陆
登陆成功会提示 Logged in as xxxx on https://registry.npmjs.org/.
把包发布到npm上
将终端切换到包
的根目录之后,运行npm publish
命令,即可将包发布到npm上(注意:包名不能雷同,可以官网先搜一下有没有重名)。
发布后登录官网可以查看自己的包是否发布成功!