Nodejs四、npm与包

news2024/12/23 12:11:43

零、文章目录

Nodejs四、npm与包

1、包

(1)包是什么

  • Node.js 中的第三方模块又叫做。就像电脑计算机指的是相同的东西,第三方模块指的是同一个概念,只不过叫法不同

(2)包的来源

  • 不同于 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/ 的服务器,来对外共享所有的包,我们可以从这个服务器上下载自己所需要的包。

(5)如何下载包

  • npm, Inc. 公司提供了一个包管理工具,我们可以使用这个包管理工具,从 https://registry.npmjs.org/ 服务器把需要的包下载到本地使用。
  • 这个包管理工具的名字叫做 Node Package Manager(简称 npm 包管理工具),这个包管理工具随着 Node.js 的安装包一起被安装到了用户的电脑上。
  • 大家可以在终端中执行 npm -v 命令,来查看自己电脑上所安装的 npm 包管理工具的版本号
Microsoft Windows [版本 10.0.19045.2251]
(c) Microsoft Corporation。保留所有权利。

C:\Users\Administrator>npm -v
9.5.1

2、npm 初体验

(1)自己封装方式

  • 创建格式化时间的自定义模块

  • 定义格式化时间的方法

  • 创建补零函数

  • 从自定义模块中导出格式化时间的函数

  • 导入格式化时间的自定义模块

  • 调用格式化时间的函数

image-20230612104119447

(2)npm引入包方式

  • 使用 npm 包管理工具,在项目中安装格式化时间的 moment
  • 使用 require() 导入格式化时间的包
  • 参考 moment 的官方 API 文档对时间进行格式化

image-20230612104547402

(3)在项目中安装包的命令

  • 命令:npm install 包名
  • 简化:npm i 包名

(4)初次装包后多了哪些文件

  • node_modules 文件夹:用来存放所有已安装到项目中的包。require() 导入第三方包时,就是从这个目录中查找并加载包。
  • package-lock.json 配置文件:用来记录 node_modules 目录下的每一个包的下载信息,例如包的名字、版本号、下载地址等。

(5)安装指定版本的包

  • npm install 包:安装最新版本的包。
  • npm install 包@版本号:安装指定版本的包,例如:npm install moment@2.22.2

(6)包的语义化版本规范

  • 包的版本号是以“点分十进制”形式进行定义的,总共有三位数字,例如 2.24.0

  • 其中每一位数字所代表的的含义如下:

    • 第1位数字:大版本

    • 第2位数字:功能版本

    • 第3位数字:Bug修复版本

3、包管理配置文件

(1)package.json

  • 在项目根目录中,必须提供一个叫做 package.json 的包管理配置文件。用来记录与项目有关的一些配置信息。例如:
    • 项目的名称、版本号、描述等
    • 项目中都用到了哪些包
    • 哪些包只在开发期间会用到
    • 那些包在开发和部署时都需要用到

(2)多人协作的问题

  • 问题:第三方包的体积过大,不方便团队成员之间共享项目源代码。
  • 解决方案:共享时剔除node_modules,添加到 .gitignore 忽略文件中。拿到项目后,再根据package.json配置文件来还原包。包只在本地,不上仓库。

(3)快速创建 package.json

  • 命令:npm init -y
  • 说明:命令只能在英文的目录下运行!所以,项目文件夹不要使用中文不能出现空格
  • npm install 包名:运行 npm install 命令安装包的时候,npm 包管理工具会自动把包的名称和版本号,记录到 package.jsondependencies节点
  • npm i 包名 -Dnpm install 包名 --save-dev):如果某些包只在项目开发阶段用到,上线之后不会用到,则使用命令npm i 包名 -D把这些包记录到 devDependencies 节点中。

image-20230612133932474

(4)一次性安装所有的包

  • 当我们拿到一个剔除了 node_modules 的项目之后,需要先把所有的包下载到项目中才能将项目运行起来,否则找不到包报错。
  • 可以运行 npm install 命令(或 npm i)一次性安装所有的依赖包。

(5)卸载包

  • 可以运行 npm uninstall 命令,来卸载指定的包,比如npm uninstall moment
  • npm uninstall 命令执行成功后,会把卸载的包自动从 package.jsondependencies移除掉

4、解决下包速度慢的问题

(1)为什么下包速度慢

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

(2)淘宝 NPM 镜像服务器

  • 淘宝在国内搭建了一个服务器,专门把国外官方服务器上的包同步到国内的服务器,然后在国内提供下包的服务。从而极大的提高了下包的速度。
  • 镜像(Mirroring)是一种文件存储形式,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。

image-20230612145220890

(3)切换npm 的下包镜像源

  • npm config get registry:查看当前的下包镜像源
  • npm config set registry=https://registry.npm.taobao.org/:将下包的镜修源切换为淘宝镜像源
  • npm config set registry=https://registry.npmjs.org/:将下包的镜修源切换为官方镜像源

(4)nrm

  • 为了更方便的切换下包的镜像源,我们可以安装 nrm 这个小工具,利用 nrm 提供的终端命令,可以快速查看和切换下包的镜像源。
  • npm i nrm -g:通过npm包管理器,将nrm安装为全局可用的工具
  • nrm ls:查看所有可用的镜像源
  • nrm use taobao:将下包的镜源切换为taobao镜像

5、包的分类

(1)项目包

  • 那些被安装到项目node_modules 目录中的包,都是项目包。
  • 项目包又分为两类,分别是:
    • npm i 包名 -D开发依赖包(被记录到 devDependencies 节点中的包,只在开发期间会用到)
    • npm i 包名核心依赖包(被记录到 dependencies 节点中的包,在开发期间和项目上线之后都会用到)

(2)全局包

  • npm install 包名 -g:在执行 npm install 命令时,如果提供了 -g 参数,则会把包安装为全局包
  • 全局包会被安装到 C:\Users\用户目录\AppData\Roaming\npm\node_modules 目录下
  • 只有工具性质的包,才有全局安装的必要性。因为它们提供了好用的终端命令。判断某个包是否需要全局安装后才能使用,可以参考官方提供的使用说明即可。

6、规范的包结构

  • 一个规范的包,它的组成结构,必须符合以下 3 点要求:
    • 包必须以单独的目录而存在
    • 包的顶级目录下要必须包含 package.json 这个包管理配置文件
    • package.json 中必须包含 name,version,main 这三个属性,分别代表包的名字、版本号、包的入口

7、开发自己的包

(1)初始化包的基本结构

  • 新建 lytestutils 文件夹,作为包的根目录
  • lytestutils 文件夹中,新建如下三个文件:
    • package.json (包管理配置文件)
    • index.js (包的入口文件)
    • README.md (包的说明文档)

(2)package.json

  • 关于更多 license 许可协议相关的内容参考如图

5420598-95ed1ef9be4caf3f

{
  "name": "@bluecusliyou/lytestutils",
  "version": "1.1.1",
  "main": "index.js",
  "description": "提供了格式化时间、HTMLEscape相关的功能",
  "keywords": [
    "@bluecusliyou/lytestutils",
    "dateFormat",
    "escape"
  ],
  "license": "ISC"
}

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

  • 将格式化时间的功能,拆分到 src -> dateFormat.js
  • 将处理 HTML 字符串的功能,拆分到 src -> htmlEscape.js
  • index.js 中,导入两个模块,得到需要向外共享的方法
  • index.js 中,使用 module.exports 把对应的方法共享出去

(4)dateFormat.js

// 定义格式化时间的函数
function dateFormat(dateStr) {
  const dt = new Date(dateStr)

  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
}

(5)htmlEscape.js

// 定义转义 HTML 字符的函数
function htmlEscape(htmlstr) {
  return htmlstr.replace(/<|>|"|&/g, match => {
    switch (match) {
      case '<':
        return '&lt;'
      case '>':
        return '&gt;'
      case '"':
        return '&quot;'
      case '&':
        return '&amp;'
    }
  })
}

// 定义还原 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 '&'
    }
  })
}

module.exports = {
  htmlEscape,
  htmlUnEscape
}

(6)index.js

// 这是包的入口文件
const date = require('./src/dateFormat')
const escape = require('./src/htmlEscape')

// 向外暴露需要的成员
module.exports = {
  ...date,
  ...escape
}

(7)README.md

  • 包根目录中的 README.md 文件,是包的使用说明文档。通过它,我们可以事先把包的使用说明,以 markdown 的格式写出来,方便用户参考。
  • README内容,没有强制性的要求,我们的文档中包含以下内容:安装方式、导入方式、格式化时间、转义 HTML 中的特殊字符、还原 HTML 中的特殊字符、开源协议
## 安装
```
npm install @bluecusliyou/lytestutils
```

## 导入
```js
const lytool = require('@bluecusliyou/lytestutils')
```

## 格式化时间
```js
// 调用 dateFormat 对时间进行格式化
const dtStr = lytool.dateFormat(new Date())
// 结果  2020-04-03 17:20:58
console.log(dtStr)
```

## 转义 HTML 中的特殊字符
```js
// 带转换的 HTML 字符串
const htmlStr = '<h1 title="abc">这是h1标签<span>123&nbsp;</span></h1>'
// 调用 htmlEscape 方法进行转换
const str = lytool.htmlEscape(htmlStr)
// 转换的结果 &lt;h1 title=&quot;abc&quot;&gt;这是h1标签&lt;span&gt;123&amp;nbsp;&lt;/span&gt;&lt;/h1&gt;
console.log(str)
```

## 还原 HTML 中的特殊字符
```js
// 待还原的 HTML 字符串
const str2 = lytool.htmlUnEscape(str)
// 输出的结果 <h1 title="abc">这是h1标签<span>123&nbsp;</span></h1>
console.log(str2)
```

## 开源协议
ISC

8、发布包

(1)注册 npm 账号

  • 访问 https://www.npmjs.com/ 网站,点击 sign up 按钮,进入注册用户界面
  • 填写账号相关的信息:Full Name、Public Email、Username、Password
  • 点击 Create an Account 按钮,注册账号
  • 登录邮箱,点击验证链接,进行账号的验证

(2)登录 npm 账号

  • npm 账号注册完成后,可以在终端中执行 npm login 命令。
  • 在运行 npm login 命令之前,必须先把下包的服务器地址切换为 npm 的官方服务器。否则会导致发布包失败!
C:\Users\Administrator>npm login
npm notice Log in on https://registry.npmjs.org/
Login at:
https://www.npmjs.com/login?next=/login/cli/9f7115ed-dcac-4805-8dab-a22e72f9599d
Press ENTER to open in the browser...

Logged in on https://registry.npmjs.org/.

(3)把包发布到 npm 上

  • 先将终端切换到包的根目录,注意路径不要有空格中文。
  • 运行 npm publish 命令,即可将包发布到 npm 上(注意:包名不能雷同)。

image-20230612171421626

(4)删除已发布的包

  • npm unpublish 包名 --force:即可从 npm 删除已发布的包。
  • npm unpublish 命令只能删除 72 小时以内发布的包
  • npm unpublish 删除的包,在 24 小时内不允许重复发布
  • 发布包的时候要慎重,尽量不要往 npm 上发布没有意义的包!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/653096.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux SSH PublicKey 登录

前言 ssh 远程登录密码认证的方式有 Password、Keyboard Interactive 和 Public Key 三种主要方式。 前面两种方式就是密码认证&#xff0c;含义都是一样大同小异。第三种是登录方式最安全的一种&#xff0c;也是我们常用的云服务器默认使用的一种方式。 本文就如何配置并使用…

torchvision.ops.nms实现NMS

nms原理&#xff1a; 当目标检测模型对一个目标有多个检测框时&#xff0c;需要滤掉多余的框&#xff0c;留下最接近真实目标的框。 步骤是这样的&#xff1a; 1.先把目标框初筛一波&#xff0c;比如设阈值为0.25, 把预测概率 < 0.25的目标框滤掉。 2.把 每个类别的 目标框 …

DEVONthink 3:Mac文档管理工具,知识管理app

DEVONthink Pro是一款功能强大的文档管理软件&#xff0c;它可以帮助用户高效地组织、管理和查找各种类型的文件和信息。 下面是DEVONthink Pro的主要特点介绍&#xff1a; 多功能性&#xff1a;DEVONthink Pro支持多种文件类型和数据源&#xff0c;并提供全面的搜索、分类、过…

在 ZBrush、Substance 3D Painter 和 UE5 中创作警探角色(P1)

小伙伴们大家好&#xff0c;今天瑞云渲染小编给大家分享的是自由CG艺术家Jean Zoudi创建《极乐迪斯科》的警探角色的项目花絮&#xff0c;会解释身体和服装的建模方式&#xff0c;分享角色发型和面部毛发背后的工作流程&#xff0c;也会详细介绍渲染过程。 介绍 大家好&#…

性能测试怎么做?性能测试策略配套适用场景,打通性能测试...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、常见的测试策略…

直流对数放大器

Logarithmic Amplifiers 对数放大器的应用场合 在雷达和一些其他测距的场合&#xff0c;sensor输出的信号的动态范围比较宽&#xff0c;也就是要求sensor输出的弱信号时有比较大的放大倍数&#xff0c;强的信号有较小的放大倍数&#xff0c;以保证sensor输出的信号经过放大器后…

可移动硬盘无媒体是什么意思?移动硬盘显示无媒体数据如何恢复

案例分享&#xff1a;【最近我遇到了一个麻烦&#xff0c;我的移动硬盘突然显示“无媒体”。我不知道发生了什么&#xff0c;我很担心我的硬盘中存储的大量重要数据是否还能恢复。我该怎么解决移动硬盘显示无媒体问题呢&#xff0c;求大神帮帮我吧&#xff01;&#xff01;&…

浏览器是如何实现生成HTTP消息的

我们经常会使用浏览器访问各种网站&#xff0c;获取各种信息&#xff0c;帮助解决工作生活中的问题。那你知道&#xff0c;浏览器是怎么帮助我们实现对web服务器的访问&#xff0c;并返回给我们想要的信息吗&#xff1f; 1. 浏览器生成HTTP消息 我们平时使用的浏览器有很多种&…

【强烈推荐】 十多款2023年必备国内外王炸级AI工具 (免费 精品 好用) 让你秒变神一样的装逼佬感受10倍生产力 (6) AI学习

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

【LLMs系列】90%chatgpt性能的小羊驼Vicuna模型学习与实战

一、前言 UC伯克利学者联手CMU、斯坦福等&#xff0c;再次推出一个全新模型70亿/130亿参数的Vicuna&#xff0c;俗称「小羊驼」&#xff08;骆马&#xff09;。小羊驼号称能达到GPT-4的90%性能 github 地址: GitHub - lm-sys/FastChat: An open platform for training, servi…

ChatGPT爆火网络背后的故事?

文章目录 前言一、ChatGPT的诞生背景二、ChatGPT的技术原理三、ChatGPT的推广策略四、ChatGPT的未来展望五、橙子送书第2期 前言 ChatGPT是一款基于人工智能技术的聊天机器人&#xff0c;它的出现引起了广泛的关注和热议。在短短的时间内&#xff0c;ChatGPT就成为了全球范围内…

实测|飞凌嵌入式OK3588-C开发板4G模组的使用与测试

本篇试用报告由发烧友 ouxiaolong提供&#xff0c;感谢ouxiaolong的支持。飞凌嵌入式会持续开展开发板有奖试用活动&#xff0c;更有京东E卡等着你&#xff01;欢迎大家的持续关注。 飞凌嵌入式OK3588-C开发板是一款性能强劲的旗舰产品&#xff0c;采用核心板底板的分体式设计…

linuxOPS系统服务_Linux下用户管理

用户概念以及基本作用 **用户&#xff1a;**指的是Linux操作系统中用于管理系统或者服务的人 一问&#xff1a;管理系统到底在管理什么&#xff1f; 答&#xff1a;Linux下一切皆文件&#xff0c;所以用户管理的是相应的文件 二问&#xff1a;如何管理文件呢&#xff1f; …

JDK、JRE、JVM三者的区别

JDK&#xff08;Java Development Kit&#xff09;&#xff1a;Java开发工具包 JRE&#xff08;Java Runtime Environment&#xff09;&#xff1a;Java运行环境 JVM&#xff08;Java Virtual Mechinal&#xff09;&#xff1a;Java虚拟机 &#xff08;1&#xff09;JDK和JRE 是…

Python海龟画图 几种基本图形

注&#xff1a;本文主要根据绘制步骤进行区分&#xff0c;实际使用时应当调节参数以绘制需要的图形。文中的步骤均为循环进行&#xff0c;循环50到100次&#xff0c;具体次数见代码示例。 1.前进小角度旋转 绘制效果如图&#xff0c;如果旋转角度为360的因数则绘制出多边形。 …

OJ Summation of Four Primes

1.题目 题目描述 Euler proved in one of his classic theorems that prime numbers are infinite in number. But can every number be expressed as a summation of four positive primes? I don’t know the answer. May be you can help!!! I want your solution to be v…

弹性盒子(display: flex)布局超全讲解|Flex 布局教程

文章目录 什么是弹性布局&#xff1f;弹性布局的特点&#xff1f;容器的属性justify-contentalign-itemsflex-directionflex-wrapflex-flowalign-contentorder属性flex-grow属性flex-shrink属性flex-basis属性flex属性align-self属性 什么是弹性布局&#xff1f; 弹性布局&…

我被今年就业难度震惊到了

随着毕业季到来&#xff0c;今年高校毕业生就业问题正在被越来越多的人关注。年年都是最难就业季&#xff0c;但今年却格外不同寻常的难。大家都知道 2022 年毕业生人数历史上首次突破千万。而今年毕业生人数&#xff0c;高达 1158 万人&#xff0c;史无前例的多。加上海外留学…

【Unity Shader】从入门到着魔(2)用C#画一个立方体

文章目录 一、构成一个立方需要多少个顶点?二、定义三角面的索引数组:三、定义UV坐标数组:四、最后构建Mesh:五、完整代码:一、构成一个立方需要多少个顶点? 这个问题是面试经常被问到的题。如上图,我们知道在几何中立方体有6个面,8个顶点。但在图形学中,顶点指的是模…

项目管理:制定项目计划,这些作用不可忽视

做任何事&#xff0c;做计划不可缺少&#xff0c;没有计划&#xff0c;就没有控制&#xff0c;编制计划可帮助项目管理团队提前进行思考。 制定计划后&#xff0c;还需要对项目计划进行跟踪&#xff0c;这样才不会让计划白做。 你知道项目计划进行跟踪&#xff0c;有哪些不可…