Node.js笔记总结(day3)(一)

简介: Node.js笔记总结(day3)

今日目标

  • 能够使用 npm 管理包
  • 了解如何开发包
  • 了解如何发布包
  • 能够了解模块的加载机制
  • 熟悉 express基本操作


1. npm与包

1.1 包管理配置文件

npm 规定,在项目根目录中,必须提供一个叫做 package.json 的包管理配置文件。用来记录与项目有关的一些配置信息。

例如:

1、项目的名称、版本号、描述等

2、项目中都用到了哪些包

3、哪些包只在开发期间会用到

4、那些包在开发和部署时都需要用到

  • 多人协作的问题

f925cdf330a94cc0a744d260c364b3c6.png

  • 如何记录项目中安装了哪些包

在项目根目录中,创建一个叫做 package.json 的配置文件,即可用来记录项目中安装了哪些包。从而方便剔除 node_modules 目录之后,在团队成员之间共享项目的源代码。

注意:今后在项目开发中,一定要把 node_modules 文件夹,添加到 .gitignore 忽略文件中。

  • 快速创建 package.json
    npm 包管理工具提供了一个快捷命令,可以在执行命令时所处的目录中,快速创建 package.json 这个包管理


命令:

// 作用:在执行命令所处的目录中,快速新建 package.json 文件
npm init -y


注意:

1、上述命令只能在英文的目录下成功运行!所以,项目文件夹的名称一定要使用英文命名,不要使用中文不能出现空格

2、运行 npm install 命令安装包的时候,npm 包管理工具会自动把包的名称和版本号,记录到 package.json 中。


dependencies 节点

package.json 文件中,有一个 dependencies 节点,专门用来记录您使用 npm install 命令安装了哪些包。

3565a3e40db34e20a59c8acf740a51ef.png


一次性安装所有的包

当我们拿到一个剔除了 node_modules 的项目之后,需要先把所有的包下载到项目中,才能将项目运行起来。


否则会报类似于下面的错误:

Error: Cannot find module 'moment'


可以运行 npm install 命令(或 npm i)一次性安装所有的依赖包:

npm install 或 npm i


  • 卸载包

可以运行 npm uninstall 命令,来卸载指定的包:

npm uninstall moment


注意:npm uninstall 命令执行成功后,会把卸载的包,自动从 package.json 的 dependencies 中移除掉。

  • devDependencies 节点

如果某些包只在项目开发阶段会用到,在项目上线之后不会用到,则建议把这些包记录到 devDependencies 节点中。

与之对应的,如果某些包在开发和项目上线之后都需要用到,则建议把这些包记录到 dependencies 节点中。

您可以使用如下的命令,将包记录到 devDependencies 节点中:

// 安装指定的包,并记录到 devDependencies 节点中
npm i 包名 -D
// 注意:上述命令为简写形式,等价于下面完整写法
npm install 包名 --save-dev


1.2 解决下包速度慢的问题
  • 为什么下包速度慢
    在使用 npm 下包的时候,默认从国外的 https://registry.npmjs.org/ 服务器进行下载,此时,网络数据的传输需要经 过漫长的海底光缆,因此下包速度会很慢。


扩展阅读 - 海底光缆:


淘宝 NPM 镜像服务器

549588107b524c47aeca304fb85cd751.png


切换 npm 的下包镜像源

下包的镜像源,指的就是下包的服务器地址。

// 查看当前下包的镜像源
npm config get registry
// 将下包的镜像源切换成淘宝镜像源
npm config set registry=https://registry.npm.taobao.org/


解决下包速度慢的问题

为了更方便的切换下包的镜像源,我们可以安装 nrm 这个小工具,利用 nrm 提供的终端命令,可以快速查看和切换下 包的镜像源。


// 通过 npm 包管理工具,将 nrm安装为全局可用工具
npm i nrm -g
// 查看所有可用的镜像源
nrm ls
// 将下包的镜像源切换为淘宝镜像
nrm use taobao


1.3 包的分类

使用 npm 包管理工具下载的包,共分为两大类,分别是:

1、项目包

2、全局包


  • 项目包

那些被安装到项目的 node_modules 目录中的包,都是项目包。

项目包又分为两类,分别是:

1、开发依赖包(被记录到 devDependencies 节点中的包,只在开发期间会用到)

2、核心依赖包(被记录到 dependencies 节点中的包,在开发期间和项目上线之后都会用到)


全局包

在执行 npm install 命令时,如果提供了 -g 参数,则会把包安装为全局包。

全局包会被安装到 C:\Users\用户目录\AppData\Roaming\npm\node_modules 目录下。

npm i 包名 -g   // 全局安装指定包
npm uninstall 包名 -g   // 卸载全局安装的包

注意:

1、只有工具性质的包,才有全局安装的必要性。因为它们提供了好用的终端命令。

2、判断某个包是否需要全局安装后才能使用,可以参考官方提供的使用说明即可


i5ting_toc

i5ting_toc 是一个可以把 md 文档转为 html 页面的小工具,使用步骤如下:

// 将 i5ting_toc 安装到全局
npm i i5ting_toc -g
// 调用 i5ting_toc 轻松实现 md 转换为 html 的功能
i5ting_toc -f 要转换的md文件路径 -o
1.4 规范的包结构

在清楚了包的概念、以及如何下载和使用包之后,接下来,我们深入了解一下包的内部结构。

一个规范的包,它的组成结构,必须符合以下 3 点要求:

1、包必须以单独的目录而存在

2、包的顶级目录下要必须包含 package.json 这个包管理配置文件

3、package.json 中必须包含 name,version,main 这三个属性,分别代表包的名字、版本号、包的入口。

注意:以上 3 点要求是一个规范的包结构必须遵守的格式,关于更多的约束,可以参考如下网址:

https://yarnpkg.com/zh-Hans/docs/package-json


1.5 开发属于自己的包
  • 需要实现的功能
  • 格式化日期

c2765b41e1214619bd9de9452ec1e0c8.png

转义 HTML 中的特殊字符

bdc169f0d13e4b50b7853da5799530cf.png

还原 HTML 中的特殊字符

376f94c351ba48a38e72a5d95a66374d.png

初始化包的基本结构

步骤:

1、新建 my_pkg_26 (可自定义)文件夹,作为包的根目录

2、在 my_pkg_26 文件夹中,新建如下三个文件:

  • package.json (包管理配置文件)
  • index.js (包的入口文件)
  • README.md (包的说明文档)
  • 初始化 package.json
{
  "name": "my_util",
  "version": "1.0.1",
  "main": "index.js",
  "description": "提供了格式化时间,转译html字符等功能",
  "keywords": ["util", "dateFormat", "escape"],
  "license": "ISC"
}
// 格式化时间方法
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;
}


在 index.js 中定义转义 HTML 的方法

// 转换 html 字符串函数
function htmlEscape(htmlStr) {
  return htmlStr.replace(/<|>|"|&/g, (match) => {
    switch (match) {
      case "<":
        return "&lt;";
      case ">":
        return "&gt;";
      case '"':
        return "&quot;";
      case "&":
        return "&amp;";
    }
  });
}


在 index.js 中定义还原 HTML 的方法

// 还原 html 函数
function htmlUnEscape(str) {
  return str.replace(/&lt;|&gt;|&quot;|&amp;/g, (match) => {
    switch (match) {
      case "&lt;":
        return "<";
      case "&gt;":
        return ">";
      case "&quot;":
        return '"';
      case "&amp;":
        return "&";
    }
  });
}


将不同的功能进行模块化拆分

  • 将格式化时间的功能,拆分到 src -> dateFormat.js 中
  • 将处理 HTML 字符串的功能,拆分到 src -> htmlEscape.js 中
  • 在 index.js 中,导入两个模块,得到需要向外共享的方法
  • 在 index.js 中,使用 module.exports 把对应的方法共享出去
  • 测试
// test.js
const itpeilibo= require('./my_pkg/index')
// 格式化时间的代码
const dtStr = itpeilibo.dateFormat(new Date())
console.log(dtStr)
// 转义 Html 字符串
const htmlStr = '<h4 title="abc">这是h4标签<span>123&nbsp;</span></h4>'
const str = itpeilibo.htmlEscape(htmlStr)
console.log(str)
// 还原 Html 字符串
const resetHtml = itpeilibo.htmlUnEscape(str)
console.log(resetHtml)


编写包的说明文档

包根目录中的 README.md 文件,是包的使用说明文档。通过它,我们可以事先把包的使用说明,以 markdown 的 格式写出来,方便用户参考。

README 文件中具体写什么内容,没有强制性的要求;只要能够清晰地把包的作用、用法、注意事项等描述清楚即可。

我们所创建的这个包的 README.md 文档中,会包含以下 6 项内容:

安装方式、导入方式、格式化时间、转义 HTML 中的特殊字符、还原 HTML 中的特殊字符、开源协议

## 安装
```
npm install my_utils
```
## 导入
```js
const utils = require('my_utils')
```
## 格式化时间
```js
// 调用 dateFormat 对时间进行格式化
const dt = m.dateFormat(new Date())
console.log(dt);
// 输出:2021-12-23 17:09:11
```
## 转译 html 中特殊字符
```js
// 待转换的 html 字符串
const htmlStr = '<h1 class="red">你好!<span>123&nbsp;</span></h1>';
const newStr = m.htmlEscape(htmlStr);
console.log(newStr);
// 输出: &lt;h1 class=&quot;red&quot;&gt;你好!&lt;span&gt;123&amp;nbsp;&lt;/span&gt;&lt;/h1&gt;
```
## 还原 html 中的特殊字符
```js
// 待还原的字符
const str = '&lt;h1 class=&quot;red&quot;&gt;你好!&lt;span&gt;123&amp;nbsp;&lt;/span&gt;&lt;/h1&gt;'
const htmlStr = m.htmlUnEscape(str)
console.log(htmlStr);
// 输出:<h1 class="red">你好!<span>123&nbsp;</span></h1>
```
## 开源协议
ISC







目录
相关文章
|
7月前
|
JavaScript 前端开发
JavaScript随手笔记 --- 对数据进行判断最大位数是否超过八位
JavaScript随手笔记 --- 对数据进行判断最大位数是否超过八位
|
2月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
44 0
|
23天前
|
自然语言处理 JavaScript 前端开发
[JS]同事看了我做的this笔记,直摇头,坦言:我还是参考启发博文吧
本文介绍了JavaScript中`this`关键字的重要性和使用规则。作者回顾了早期笔记,总结了`this`指向的各种情况,并分享了最新的理解。文章强调了`this`在不同上下文中的指向,包括对象方法、全局函数、箭头函数等,并提供了改变`this`指向的方法。适合JavaScript开发者参考。
42 2
|
3月前
|
JavaScript 前端开发 Java
JavaScript笔记(回顾一,基础知识篇)
JavaScript基础知识点回顾,包括语言定义、ECMAScript规范、字面量、变量声明、操作符、关键字、注释、流程控制语句、数据类型、类型转换和引用数据类型等。
JavaScript笔记(回顾一,基础知识篇)
|
4月前
|
存储 缓存 自然语言处理
深入理解JS | 青训营笔记
深入理解JS | 青训营笔记
41 0
|
6月前
|
JavaScript vr&ar 数据库
技术笔记:Js获取当前日期时间及其它操作
技术笔记:Js获取当前日期时间及其它操作
138 1
|
6月前
|
数据采集 存储 编解码
技术笔记:Node.jsmm131图片批量下载爬虫1.01增加断点续传功能
技术笔记:Node.jsmm131图片批量下载爬虫1.01增加断点续传功能
97 0
|
6月前
|
Web App开发 JavaScript iOS开发
技术笔记:js数组定义和方法(包含ES5新增数组方法)
技术笔记:js数组定义和方法(包含ES5新增数组方法)
|
6月前
|
JavaScript BI
技术笔记:JS获取子节点、父节点和兄弟节点的方法实例总结
技术笔记:JS获取子节点、父节点和兄弟节点的方法实例总结
87 0
|
6月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的笔记记录分享网站附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的笔记记录分享网站附带文章源码部署视频讲解等
33 0