什么是包?
Node.js
中的第三方模块又叫做包
为什么需要包?
-
由于
Node.js
的内置模块仅提供了一些底层的API
,导致在基于内置模块进行项目开发的时,效率很低 -
包是基于内置模块封装出来的,提供了更高级、更方便的
API
,极大的提高了开发效率 -
包和内置模块之间的关系,类似于
jQuery
和 浏览器内置API
之间的关系
包的分类:
项目包: 用require引入使用,被安装到项目的 node_modules
目录中的包.
项目包分为:
1.开发依赖包 :只在开发期间会用到 ;记录在devDependencies 节点
2.核心依赖包(生产依赖包):在开发期间和项目上线之后都会用到;记录在dependencies 节点
全局包: 通过命令行的方式存在,只有工具性质的包,才有全局安装的必要性。
npm root -g // 查看包安装在哪里,如何被使用
接下来,我们来开发属于自己的包.实现的功能有 格式化日期,转移 HTML
中的特殊字符,还原 HTML
中的特殊字符.
轻松拥有属于自己的包
一个规范的包,它的组成结构,必须符合以下 3 点要求:
1.必须以单独的目录而存在(一个包一个文件夹);
2.包的*目录下要必须包含 package.json;
package.json中必须包含
name(名字),
version(版本号),
main` (包的入口) 这三个属性;
第一步:初始化包的基础结构
-
新建
itheima-tools
文件夹,作为包的根目录 -
在
itheima-tools
文件夹中,新建如下三个文件:-
package.json
(包管理配置文件) -
index.js
(包的入口文件) -
README.md
(包的说明文档)
-
第二步:初始化 package.json
配置文件
npm init -y
// 快速创建package.json
第三步:在 index.js
中定义要实现的功能的方法
// 包的入口文件 index.js
// 定义格式化时间的函数
function dateFormat (dateStr) {
const dt = new Date(dateStr)
const y = padZero(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
}
测试代码能否正常运行
// 测试代码
const itheima = require('./flightloong-tools/index')
// 格式化时间的代码
const dtStr = itheima.dateFormat(new Date())
console.log(dtStr) // 2020-06-23 01:16:57
在 index.js
中定义转义 HTML 的方法
// index.js
// 定义转义 HTML 字符的函数
function htmlEscape(htmlstr) {
return htmlstr.replace(/<|>|"|&/g, match => {
switch (match) {
case '<':
return '&glt;'
case '>':
return '>'
case '"':
return '"'
case '&':
return '&'
}
})
}
// test.js
const itheima = require('./flightloong-tools/index')
// 转义 Html 字符串
const htmlStr = '<h4 title="abc">这是h4标签<span>123 </span></h4>'
const str = itheima.htmlEscape(htmlStr)
console.log(str)
在 index.js
中定义还原 HTML 的方法
// 定义还原 HTML 字符的函数
function htmlUnEscape(str) {
return str.replace(/&glt;|>|"|&/g, (match) => {
switch (match) {
case '&glt;':
return '<'
case '>':
return '>'
case '"':
return '"'
case '&':
return '&'
}
})
}
// 还原 Html 字符串
const resetHtml = itheima.htmlUnEscape(str)
console.log(resetHtml)
第四步:划分不同的模块
-
将格式化时间的功能,拆分到
src
->dateFormat.js
中 -
将处理
HTML
字符串的功能,拆分到src
->htmlEscape.js
中 -
在
index.js
中,导入两个模块,得到需要向外共享的方法 -
在
index.js
中,使用module.exports
把对应的方法共享出去
第五步:编写包的说明文档
README
文件中具体写什么内容,没有强制性的要求;只要能够清晰地把包的作用、用法、注意事项等描述清楚即可
我们现在所创建的这个包的 README.md
文档中,会包含以下 6 项内容
-
安装方式
-
导入方式
-
格式化时间
-
转义 HTML 中的特殊字符
-
还原 HTML 中的特殊字符
-
开源协议
### 安装
```
npm i flightloong-tools
```
### 导入
```js
const itheima = require('./flightloong-tools')
```
### 格式化时间
```js
// 调用 dateFormat 对时间进行格式化
const dtStr = itheima.dateFormat(new Date())
// 结果 2020-04-03 17:20:58
console.log(dtStr)
```
### 转义 HTML 中的特殊字符
```js
// 带转换的 HTML 字符串
const htmlStr = '<h1 title="abc">这是h1标签<span>123 </span></h1>'
// 调用 htmlEscape 方法进行转换
const str = itheima.htmlEscape(htmlStr)
// 转换的结果 <h1 title="abc">这是h1标签<span>123&nbsp;</span></h1>
console.log(str)
```
### 还原 HTML 中的特殊字符
```js
// 待还原的 HTML 字符串
const str2 = itheima.htmlUnEscape(str)
// 输出的结果 <h1 title="abc">这是h1标签<span>123 </span></h1>
console.log(str2)
```
### 开源协议
ISC
第六步:注册 npm
账号(已经有npm账号可以跳过这一步)
-
访问 (npm ) 网站,点击
sign up
按钮,进入注册用户界面 -
填写账号相关的信息:
Full Name
、Public Email
、Username
、Password
-
点击
Create an Account
按钮,注册账号 -
登录邮箱,点击验证链接,进行账号的验证
第七步:登录 npm
账号
注意:在运行 npm login
命令之前,必须先把下包的服务器地址切换为 npm
的官方服务器。否则会导致发布包失败!
// 查看当前镜像地址
nrm ls
// 切换到npm
nrm use npm
npm
账号注册完成后,可以在终端中执行 npm login
命令,依次输入用户名、密码、邮箱后,即可登录成功
第八步: 把包发布到 npm
上
将终端切换到包的根目录之后,运行 npm publish
命令,即可将包发布到 npm
上(注意:包名不能雷同)
拓展: 删除已发布的包
运行 下面的命令,即可从 npm
删除已发布的包
npm unpublish 包名 --force
注意事项
-
npm unpublish 命令只能删除 72 小时以内发布的包
-
npm unpublish 删除的包,在 24 小时内不允许重复发布
-
发布包的时候要慎重,尽量不要往
npm
上发布没有意义的包!