初学Nodejs(5):npm包管理器与包的发布

news2024/9/21 16:25:37

初学Nodejs

1、概念

  • 什么是包
    Nodejs中的第三方模块又叫做包。
  • 包的来源
    不同于Nodejs中的内置模块与自定义模块,包是由第三方个人或团队开发出来的,免费供人使用。(nodejs中的包都是免费且开源的,不需要付费即可免费下载使用)
  • 为什么需要包
    因为nodejs的内置模块仅仅提供了一些底层的API,这就导致在基于内置模块进行项目开发时,效率很低,包是基于内置模块封装起来的,提供了更高级、更方便的API,极大的提高了开发效率
  • 从哪下载包
    有一家IT公司,名叫npm,inc.这家公司其下有一个著名的网站,https://www.npmjs.com/,它是全球最大的包共享平台,可以从这里搜索到任何你所需要的包,同时可以进入包的官方文档看如何使用该包。但下载需要到这个地址https://registry.npmjs.org/的服务器下下载。
  • 如何下载包
    npm,inc公司提供了一个包管理工具npm(Node package Manager),从服务器把需要的包下载到本地使用。

下载包

npm install 包名 [options]

引入包

const 包名 = require('包名')
  • 如何卸载包
npm uninstall 包名
  • 初次装包之后多了哪些文件
    (1)node_modules的文件夹
    存放所有已安装到项目的包。require导入包时,就是从这个目录中查找并加载包。
    (2)package-lock.json的配置文件
    记录node_modules目录下的每一个包的下载信息,包括包的名字,版本号,下载地址等。

  • 安装指定版本的包

 npm i 包名@指定版本

2、包管理配置文件package_json

作用

用来记录与项目有关的一些配置信息,例如:
- 项目的名称、版本号、描述等
- 项目用到的包
- 哪些包只在开发期间会用到
- 哪些包在开发和部署时都会用到

node_modules体积远比项目源代码大,在多人联合开发项目时最好不要打包进项目

在接收到项目源代码时,通过package.json中存储的项目配置信息运行npm install命令下载所有需要的包,方便开发。

运行命令npm install安装所有的包,npm包管理工具会自动根据package.json中包的名称和版本号下载所有相应的包

快速创建package.json文件(初始化项目)

npm init -y

注意:上述命令只能在英文的目录下运行,目录中不要出现中文和空格

  • dependencies节点
    package.json文件中,有一个dependencies(依赖)节点,专门用来记录使用npm install命令安装了哪些包,在使用npm install 命令安装包时,也是根据这个依赖节点安装的。

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

// 安装指定的包,并记录到devDependencies节点中
npm i 包名 -D
// 等价于如下
npm install 包名 --save-dev

使用npm uninstall卸载包同时会删除dependencies节点中的包名和版本。

3、包的分类

3.1 项目包

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

项目包又分为两类

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

3.2 全局包

在执行npm install安装包时,如果提供了-g参数,表示将包安装到全局,全局包会被按转到C:\Users\用户目录\AppData\Roaming\npm\node_modules目录下

只有工具性质的包才有全局安装的必要性,因为他们提供了好用的终端命令
判断某个包是否需要全局安装后才能使用,可以参看官方提供的使用说明即可

3.3 i5ting_toc

i5ting_toc是一个可以把md文档转为html页面的小工具

// 安装为全局
npm install -g i5ting_toc

// 调用
i5ting_toc -f 要转换的md文件路径 -o

4、规范的包结构

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

5、开发自己的包

5.1 初始化基本包结构

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

  • package.json文件
{
    "name":"mytools-dxf",
    "version":"1.0.0",
    "main": "index.js",
    "description": "提供了格式化事件,HTMLEscape的功能",
    "keywords": ["dxf","myTools","dateFormat","escape"],
    "license": "ISC"
}

name:包名
version:版本号
main:包的入口文件
description:搜索时显示的描述信息
keywords:搜索关键词
license:开源协议

  • 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 `YYYY-MM-DD HH:mm:ss`
    return `${y}-${m}-${d}-${hh}-${mm}-${ss}`

}
// 定义一个补零函数
function padZero(n){
    return n > 9 ? n :'0' + n
}

// 定义转义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 = {
    dateFormat,
    htmlEscape,
    htmlUnEscape
}
  • README.md
## 安装 
npm install mytools-dxf
## 导入 
const dxf = require('mytools-dxf')
## 格式化时间 
const dtStr = dxf.dateFormat(new Date()) console.log(dtStr)  // 结果:2022-08-22-14-53-42

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

```shell
## 开源协议 
ISC 

包优化:将不同的功能进行模块化拆分
(1)将格式化时间的功能拆分到mytools-dxf/src/dateFormat.js中
(2)将处理HTML字符串的功能拆分到mytools-dxf/src/htmlEscape.js中
(3)在index.js中导入两个魔魁啊,得到需要向外共享的方法
(4)在index.js中,使用module.exports把对应的方法暴露出去

  • mytools-dxf/src/dateFormat.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 `YYYY-MM-DD HH:mm:ss`
    return `${y}-${m}-${d}-${hh}-${mm}-${ss}`

}
// 定义一个补零函数
function padZero(n){
    return n > 9 ? n :'0' + n
}

module.exports = {
    dateFormat
}
  • mytools-dxf/src/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
}
  • mytools-dxf/index.js
// 这是包的入口文件

// 导入模块化文件
// format是一个对象,需要进行解构拿到里面的方法
const format = require('./src/dateFormat')

// escape同上
const escape = require('./src/htmlEscape')

// 暴露
module.exports = {
    ...format,
    ...escape
}

使用

const dxf = require('./mytools-dxf/index')

const dtStr = dxf.dateFormat(new Date())
console.log(dtStr);
console.log("------------------");

const htmlStr = '<h1 title="abc">这是h1标签<span>123&nbsp;</span></h1>'
const str = dxf.htmlEscape(htmlStr)
console.log(str);
console.log("------------------");

const str2 = dxf.htmlUnEscape(str)
console.log(str2);

结果
2022-08-22-14-53-42


<h1
title="abc">这是h1标签<span>123&nbsp;</span></h1>


< h1 title=“abc”>这是h1标签< span>123 < /span>< /h1>

5.2 发布npm包

前序工作:
1、安装nrm包

npm i -g nrm

nrm是一个npm源管理器,意思就是说npm包来源的网址,对它进行管理

2、nrm的使用

# 显示包的所有下载源
npx nrm ls

# 切换下载源
npx nrm use npm # 使用npmjs源地址
npx nrm use taobao # 使用淘宝下载源
  • 切换到包的根目录使用如下命令发布包
npm publish
  • 删除发布的包
npm unpublish 包名 --force

(1)npm Unpublish只能删除72小时以内发布的包
(2)npm unpublish删除的包,在24小时内不允许发布重复的包
(3)没意义的包不要发布
(4)如果发现包中有啥内容错误,那么可以先把包源码更改,再使用如下命令更新包

npm version patch
npm publish

6、nrm切换npm包的下载源

6.1 介绍

nrm是用于切换npm下载源的,例如,npm是用本身地址https://registry.npmjs.org/下载包呢,还是用淘宝镜像地址下载包呢,还是用哪个地址下载包

6.2 安装

npm install -g nrm

6.3 常用命令

  • 展示所有下载源
nrm ls

在这里插入图片描述

  • 切换下载源
nrm use 下载源
例如
nrm use taobao # 表示使用淘宝镜像的下载源
nrm use npm # 表示使用自身原本的下载源
  • 查看当前使用源
nrm current
  • 添加一个源地址
nrm add <registry> <url>

registry是源名,url是源地址

  • 删除源
nrm del 源名
  • 查看下载源速度
nrm test

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

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

相关文章

2022年33个最佳WordPress健康与医疗主题

欢迎来到我们针对健康和保健相关网站和博客的最佳WordPress医疗主题的列表。这些涵盖了一切。您可以将它们用于医生、牙医、医院、健康诊所、内科医生、物理治疗师、外科医生以及健康领域的其他任何事物。大家有什么共同点&#xff1f;优质、100% 可定制的布局和 0 编码策略。 …

【论文精读8】MVSNet系列论文详解-UCS-Net

UCS-Net&#xff0c;论文名为&#xff1a;Deep Stereo using Adaptive Thin Volume Representation with Uncertainty Awareness&#xff0c;CVPR2020&#xff08;CCF A&#xff09; 本文是MVSNet系列的第8篇&#xff0c;建议看过【论文精读1】MVSNet系列论文详解-MVSNet之后再…

机器学习之过拟合和欠拟合

文章目录前言什麽是过拟合和欠拟合?过拟合和欠拟合产生的原因&#xff1a;欠拟合(underfitting)&#xff1a;过拟合(overfitting)&#xff1a;解决欠拟合(高偏差)的方法1、模型复杂化2、增加更多的特征&#xff0c;使输入数据具有更强的表达能力3、调整参数和超参数4、增加训练…

Java项目:SSM游戏点评网站

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录…

jenkins-pipeline语法总结(最全)

1、jenkins总结之pipeline语法 jenkins总结之pipeline语法1、jenkins总结之pipeline语法1.1必要的Groovy知识1.2pipeline的组成1.2.1pipeline最简结构1.3post部分1.4pipeline支持的指令• environment&#xff1a;• tools&#xff1a;• input&#xff1a;• options&#xff…

大学网课查题接口

大学网课查题接口 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击跳…

项目管理逻辑:老板为什么赔钱的项目也做?为什么害怕你闲着?

目录 1.波士顿矩阵 2.为什么企业还要做没有市场占有率,也没有销售增长率的产品? 2.1项目层级划分 2.2项目集 2.3组合管理 2.4赔钱也做的项目案例 1.波士顿矩阵 项目经理没有资源, 公司不给足够的支持 在任何一个企业老板的脑子里,都会有这样一个矩阵, 纵向表示销售增长…

数据结构与算法,MySQL数据库面试专题及答案

文章目录数据结构面试题及答案数组问题字符串相关问题链表问题二叉树问题编程面试问题之杂项答案数据结构与算法时间复杂度 并不是计算程序具体运行的时间&#xff0c;而是算法执行语句的次数 O(2^n) 表示对 n 数据处理需要进行 2^n 次计算 多项式的时间复杂度 数据 n 在表达式…

Docker安装部署Redis集群

目录 概述 一、创建文件和目录 1.1 创建需要挂载的文件和目录 1.2 同步操作 二、随机从节点模式 2.1 创建master节点的redis容器 2.2 在同一台机器上创建另外2个节点 2.3 其他2台机器同步操作 2.4 配置主从集群 2.4.1 进入任意一个 Redis 实例 2.4.2 配置集群 2.4…

《未来简史:从智人到智神》笔记一——人类的新议题

目录 一、人类的旧议题演变 二、人类的新议题 1、长生不死 2、追求幸福快乐 3、努力把自己升级为神 三、研究历史的意义——不是为了重复过去&#xff0c;而是为了摆脱过去并从中获得解放 四、生命的意义 1、主观体验有两个基本特征 2、生命的意义&#xff1f; 一、人类…

C语言第十三课:初阶指针

目录 前言&#xff1a; 一、指针是什么&#xff1a; 1.那么指针到底是什么呢&#xff1f; 2.内存中的数据存储原理&#xff1a; 3.数据存储与指针使用实例&#xff1a; 4.存储编址原理&#xff1a; 二、指针和指针类型&#xff1a; 1.决定了指针的步长&#xff1a; 2.决定了…

【VSCode + Anaconda】VSCode [WinError 126]找不到指定模块

【VSCode Anaconda】VSCode [WinError 126]找不到指定模块问题解决一解决二问题 在 Anaconda Prompt 中的 python 环境测试&#xff0c;可以使用 import torch 命令 现在在 VSCode 中测试&#xff0c;发现相关异常 图中&#xff0c;已经选择了相应的 conda 环境的 python.exe…

分片集群中的分片集合

分片集群中的分片集合 MongoDB 中 分片集群有专门推荐的模式&#xff0c;例如 分片集合 它是一种基于分片键的逻辑对文档进行分组&#xff0c;分片键的选择对分片是非常重要的&#xff0c;分片键一旦确定&#xff0c;MongoDB 对数据的分片对应用是透明的 mongodb 分片中&#…

MySQL高级语句(三)

一、正则表达式&#xff08;REGEXP&#xff09; 1、正则表达式匹配符 字符解释举列^匹配文本的开始字符’ ^aa ’ 匹配以 aa 开头的字符串$匹配文本的结束字符’ aa$ ’ 匹配以aa结尾的字符串.匹配任何单个字符’ a.b 匹配任何a和b之间有一个字符的字符串*匹配零个或多个在它…

数据结构—树、有序二叉树

文章目录树的概述树的分类二叉树的遍历有序二叉树代码通过链表方式构建有序二叉树通过递归方式实现有序二叉树递归遍历有序二叉树中序遍历&#xff1a;先序遍历&#xff1a;后序遍历&#xff1a;删除节点1、删除叶子节点删除叶子节点总结图示2、删除只有一个子树的节点删除只有…

毕业设计-基于深度学习火灾烟雾检测识别系统-yolo

前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过…

Spring循环依赖源码解析(深度理解)

文章目录前言本章目标一、什么是循环依赖&#xff1f;1、那么循环依赖是个问题吗&#xff1f;2、但是在Spring中循环依赖就是一个问题了&#xff0c;为什么&#xff1f;二、Bean的生命周期2.1、在Spring中&#xff0c;Bean是如何生成的&#xff1f;2.2、那么这个注入过程是怎样…

GitLab CI/CD系列教程(一)

来自&#xff1a;GitLab CI/CD系列教程&#xff08;一&#xff09;&#xff1a;Docker安装GitLab_哔哩哔哩_bilibili 1. 创建虚拟机并连接Xterm 创建一个4G内存的虚拟机&#xff0c;否则很容易启动不了&#xff0c;报502 虚拟机的创建看这篇&#xff1a; VMware16的安装及VM…

基于java+ssm+vue+mysql的网上书店

项目介绍 本网上系统是针对目前网上的实际需求&#xff0c;从实际工作出发&#xff0c;对过去的网上系统存在的问题进行分析&#xff0c;结合计算机系统的结构、概念、模型、原理、方法&#xff0c;在计算机各种优势的情况下&#xff0c;采用目前最流行的B/S结构和java中流行的…

从0开始搭建vue2管理后台基础模板

网站主要完成&#xff1a;侧边菜单栏、页面标签卡、内容栏 源代码gitee地址&#xff1a;https://gitee.com/zhao_liangliang1997/navigation-bar 一、起步 1、创建vue项目 vue create 项目名2、引入element 3、其他安装 1、首先需要安装如下 cnpm install vuex cnpm install…