Node——npm包管理器的使用

Node.js使用npm对包进行管理,其全称为Node Package Manager,开发人员可以使用它安装、更新或者卸载Node.js的模块

1、npm包管理器基础

1.1、npm概述

npm是Node.js的标准软件包管理器,其在2020年3月17日被GitHub收购,而且保证永久免费。在npm仓库中有超过130万个软件包,这使npm成为世界上最大的单一语言代码仓库,并且它几乎有可用于一切的软件包。使用npm可以解决Node.js代码部署上的很多问题,常见的使用场景有以下几种:

  • 允许用户从npm服务器下载第三方包到本地使用。
  • 允许用户从npm服务器下载并安装别人编写的命令行程序到本地使用。
  • 允许用户将自己编写的包或命令行程序上传到npm服务器供别人使用。

npm起初是作为下载和管理Node.js包依赖的方式,但其现在已经成为前端JavaScript中使用的通用工具。

1.2、查看npm的版本

伴随着Node.js的安装,npm是自动安装的。可以在系统的“命令提示符”对话框中通过以下命令查看当前npm的版本:

npm –v

在这里插入图片描述
虽然Node.js自带npm,但有可能不是最新的版本,这时可以使用下面的命令对npm的版本进行升级:

npm install npm -g

说明
上面命令中的-g表示安装到global目录中,即安装到全局环境中。

1.3、常用npm软件包

npm中有超过130万个软件包,可以极大限度地帮助开发人员提高开发效率,下表中列出了npm中常见的软件包及其作用:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、package.json基础

2.1、认识package.json

在WebStrom中创建Node.js项目后,会默认生成一个package.json文件,如下图所示:
在这里插入图片描述
package.json文件是项目的清单文件,其中可以做很多完全互不相关的事情。例如,上图中的package.json文件主要用来对项目进行配置,而在npm安装目录中,同样有一个package.json文件,存储了所有已安装软件包的名称和版本等信息。

对于Node.js程序,package.json文件中的内容没有固定要求,唯一的要求是必须遵守JSON格式,否则,尝试以编程的方式访问其属性的程序会无法读取它。

创建Node.js项目时默认生成的package.json文件如下:

{"name": "nodepro","version": "1.0.0","description": "","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"keywords": [],"author": "","license": "ISC"
}

上面的代码中包含很多属性,具体说明如下:

  • name:应用程序或软件包的名称。名称必须少于214个字符,且不能包含空格,只能包含小写字母、连字符(-)或下画线(_)。
  • description:应用程序/软件包的简短描述。如果要将软件包发布到npm,则这个属性特别有用,使用者可以知道该软件包的具体作用。
  • main:设置应用程序的入口点。
  • scripts:定义一组可以运行的Node.js脚本,这些脚本是命令行应用程序。可以通过调用npm run XXXX或yarn XXXX来运行它们,其中的XXXX是命令的名称。例如npm run dev。
  • keywords:包含与软件包功能相关的关键字数组。
  • author:列出软件包的作者名称。
  • license:指定软件包的许可证。

除了上面列出的属性,package.json文件中还支持其他的很多属性,常用的如下:

  • contributors:除作者外,该项目可以有一个或多个贡献者,此属性是列出他们的数组。
  • bugs:链接到软件包的问题跟踪器,最常用的是GitHub的issues页面。
  • homepage:设置软件包的主页。
  • repository:指定程序包仓库所在的位置。例如:
"repository": "github:nodejscn/node-api-cn",

上面的github前缀表示github仓库,其他流行的仓库还包括:

"repository": "gitlab:nodejscn/node-api-cn",
"repository": "bitbucket:nodejscn/node-api-cn",

开发人员可以显式地通过该属性设置版本控制系统,例如:

"repository": {"type": "git","url": "https://github.com/nodejscn/node-api-cn.git"
}

也可以使用其他的版本控制系统:

"repository": {"type": "svn","url": "..."
}
  • private:如果设置为true,则可以防止应用程序/软件包被意外发布到npm上。
  • dependencies:设置作为依赖安装的npm软件包的列表。当使用npm或yarn安装软件包时,该软件包会被自动插入此列表中。
  • devDependencies:设置作为开发依赖安装的npm软件包的列表。它们不同于dependencies,因为它们只需安装在开发机器上,而无须在生产环境中运行代码。当使用npm或yarn安装软件包时,该软件包会被自动地插入此列表中。
  • engines:设置软件包/应用程序要运行的Node.js或其他命令的版本。

2.2、npm中的package-lock.json文件

在npm5以上的版本中,引入了package-lock.json文件,该文件旨在跟踪被安装的每个软件包的确切版本,以便产品可以以相同的方式被100%复制(即使软件包的维护者更新了软件包)。

package-lock.json文件的出现解决了package.json一直存在的特殊问题,在package.json中,可以使用semver(语义化版本)表示法设置要升级到的版本(补丁版本或次版本),例如:

  • 如果写入的是~0.13.0,则只更新补丁版本:即0.13.1可以,但0.14.0不可以。
  • 如果写入的是^0.13.0,则要更新补丁版本和次版本:即0.13.1、0.14.0……以此类推。
  • 如果写入的是0.13.0,则始终使用确切的版本。

无须将node_modules文件夹(该文件夹通常很大)提交到Git,当尝试使用npm install命令在另一台机器上复制项目时,如果指定了~语法并且软件包发布了补丁版本,则该补丁版本会被安装,^语法中的次版本也一样。

说明
如果指定确切的版本,例如示例中的0.13.0,则不会受到此问题的影响。这时如果多个人在不同时间获取同一个项目,使用npm install安装时,有可能安装的依赖包版本不同,这样可能会给程序带来不可预知的错误。而通过使用package-lock.json文件,可以固化当前安装的每个软件包的版本,当运行npm install时,npm会使用这些确切的版本,确保每个人在任何时间安装的版本都是一致的,从而避免使用package.json文件时可能出现的版本不同问题。

例如,在package.json文件中有如下属性:

"express": "^4.15.4"

在只有package.json文件时,如果后续出现了4.15.5版本、4.15.6版本等,则有可能每个人安装的依赖包就会不同,从而导致一些未知的兼容性问题。这时如果使用package-lock.json文件,则文件中的内容可以设置如下:

"express": {"version": "4.15.4","resolved": "https://registry.npmjs.org/express/-/express-4.15.4.tgz","integrity": "sha1-Ay4iU0ic+PzgJma+yj0R7XotrtE=","requires": {"accepts": "1.3.3","array-flatten": "1.1.1","content-disposition": "0.5.2","content-type": "1.0.2","cookie": "0.3.1","cookie-signature": "1.0.6","debug": "2.6.8","depd": "1.1.1","encodeurl": "1.0.1","escape-html": "1.0.3","etag": "1.8.0","finalhandler": "1.0.4","fresh": "0.5.0","merge-descriptors": "1.0.1","methods": "1.1.2","on-finished": "2.3.0","parseurl": "1.3.1","path-to-regexp": "0.1.7","proxy-addr": "1.1.5","qs": "6.5.0","range-parser": "1.2.0","send": "0.15.4","serve-static": "1.12.4","setprototypeof": "1.0.3","statuses": "1.3.1","type-is": "1.6.15","utils-merge": "1.0.0","vary": "1.1.1"}
},

上面的代码中,由于在package-lock.json文件中使用了校验软件包的integrity散列值,这样就可以保证所有人在任何时间安装的依赖包的版本都是一致的。

说明
在使用package-lock.json文件时,需要将其提交到Git仓库,以便被其他人获取(如果项目是公开的或有合作者,或者将Git作为部署源),这样,在运行npm update时,package-lock.json文件中的依赖版本就会被更新。

3、使用npm包管理器安装包

在Node.js项目中使用npm安装包时,常用的操作主要有:安装单个软件包,安装软件包的指定版本,一次安装所有软件包,更新软件包,另外还可以查看安装的软件包的位置、卸载安装的软件包。下面分别对上述操作进行详细讲解。

3.1、 安装单个软件包

在Node.js项目中安装单个软件包使用如下命令:

npm install <package-name>

在npm install安装命令后还可以追加下面两个参数:

  • –save:安装并添加条目到package.json文件的dependencies。
  • –save-dev:安装并添加条目到package.json文件的devDependencies。

例如,使用npm install命令安装Bootstrap,并添加条目到package.json文件的devDependencies,命令如下:

npm install bootstrap --save-dev

在这里插入图片描述

说明
使用npm安装软件包后,就可以在程序中使用了,方法非常简单,使用require导入即可。例如,要使用安装的vue包,使用下面代码导入即可:

var vue=require("vue");                                //导入vue模块

3.2、安装软件包的指定版本

在使用npm install命令安装软件包时,默认安装的是软件包的最新版本,如果项目对软件包的版本有要求,可以使用@语法来安装软件包的指定版本,语法如下:

npm install <package>@<version>

例如,使用下面命令安装bootstrap包的3.4.1版本:

npm install bootstrap@3.4.1

安装npm软件包后,可以使用以下命令查看软件包的相关信息:

npm view <package>

例如,查看安装的bootstrap软件包的相关信息,效果如下图所示:
在这里插入图片描述
如果只查看安装的软件包的版本号,则使用下面命令:

npm view <package> version

例如,查看安装的bootstrap软件包的版本号,效果下图所示:
在这里插入图片描述

3.3、安装所有软件包

如果要在Node.js项目中一次安装所有软件包,则要求项目中必须存在package.json文件,并且在该文件中指定所有需要的软件包及版本,然后通过运行npm install命令即可安装。

例如,在一个Node.js项目中有如下package.json文件:

{"name": "nodepro","version": "1.0.0","description": "","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"keywords": [],"author": "","license": "ISC","dependencies": {"csv": "^5.5.0","react": "^17.0.2","sequelize": "^6.6.2","socket.io": "^4.1.2"}
}

此时如果在WebStorm的终端中执行npm install命令,即可同时安装csv、react、sequelize和socket.io这4个软件包,效果如下图所示:
在这里插入图片描述

3.4、更新软件包

如果要使用npm更新已经安装的软件包版本,可以使用下面命令:

npm update <package-name>

上面的命令只更新指定软件包的版本,如果要更新项目中所有软件包的版本,可以使用下面命令:

npm update

例如,使用上面的两个命令更新软件包版本的效果如下图所示:
在这里插入图片描述
说明
使用上面两个命令更新软件包版本时,只更新次版本或补丁版本,并且在更新时,package.json文件中的版本信息保持不变,但是package-lock.json文件会被新版本填充;如果要更新主版本,则需要全局地安装npm-check-updates软件包,命令如下:

npm install -g npm-check-updates

然后运行:

ncu -u

这样即可升级package.json文件的dependencies和devDependencies中的所有版本,以便npm可以安装新的主版本。

3.5、指定npm软件包的安装位置

当使用npm install命令安装软件包时,可以执行两种安装类型:

  • 本地安装。
  • 全局安装。

默认情况下,当输入npm install命令时,软件包会被安装到当前项目中的node_modules子文件夹下,如下图所示:
在这里插入图片描述
如果想要将软件包进行全局安装,可以在npm install命令中指定-g标识,语法如下:

npm install -g <package-name>

例如,全局安装bootstrap软件包,命令如下:

npm install -g bootstrap

执行上面命令后,软件包即进行全局安装,在Windows系统中,npm的全局安装位置为C:\Users\用户名\AppData\Roaming\npm\node_modules,如下图所示:
在这里插入图片描述
说明
在macOS或Linux上,npm软件包的全局安装位置是/usr/local/lib/node_modules。

3.6、 卸载npm软件包

对于已经安装的npm软件包,可以使用npm uninstall命令进行卸载,同时会移除package.json文件中的引用,语法如下:

npm uninstall <package-name>

例如,卸载安装的vue软件包,命令如下:

npm uninstall vue

但是,如果程序包是开发依赖项(列出在package.json文件的devDependencies中),则必须使用-D标志从文件中移除,语法如下:

npm uninstall -D <package-name>

例如,卸载使用–save-dev标志安装的bootstrap软件包,命令如下:

npm uninstall -D bootstrap

上面的命令可以卸载项目中安装的软件包,如果要卸载的软件包是全局安装的,则需要添加-g标志,语法如下:

npm uninstall -g <package-name>

例如,卸载全局安装的bootstrap软件包,命令如下:

npm uninstall -g bootstrap

说明
可以在系统上的任何位置运行卸载全局软件包的命令,因为当前所在的文件夹无关紧要。

4、总结

npm包管理器是Node.js管理模块包的主要方式,在Node.js应用中,模块包的安装、更新、卸载等操作都需要使用npm包管理器去实现,因此,大家一定要熟练掌握npm的常用命令。

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

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

相关文章

机器学习笔记 - 3D对象检测技术路线调研(未完)

一、3D对象检测简述 3D对象检测是计算机视觉中的一项任务&#xff0c;其目标是根据对象的形状、位置和方向在 3D 环境中识别和定位对象。它涉及检测物体的存在并实时确定它们在 3D 空间中的位置。这项任务对于自动驾驶汽车、机器人和增强现实等应用至关重要。 1、基本流程 给定…

虾皮买手号怎么弄的

想要拥有虾皮买手号&#xff0c;可以使用shopee买家通系统进行自动化注册&#xff0c;这款软件目前支持菲律宾、泰国、马来西亚、越南、巴西、印度尼西亚等国家使用。 软件注册流程简单方便&#xff0c;首先我们需要先准备好手机号&#xff0c;因为现在注册虾皮买家号基本上都是…

C语言基础篇5:指针(一)

指针是C语言的核心、精髓所在&#xff0c;用好了指针可以在C语言编程中起到事半功倍的效果。指针一方面可以提高程序的编译效率和执行速度&#xff0c;而且还可以通过指针实现动态的存储分配&#xff0c;另一方面使用指针可使程序更灵活&#xff0c;便于表示各种数据结构&#…

LeetCode Hot100 236.二叉树的最近公共祖先

题目&#xff1a; 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节…

HT97220与HT97230耳机放大器芯片对比

HT97230有两个不同开启时间(tON)版本&#xff0c;版本A、C和E的导通时间tON为5.5ms&#xff0c;用于耳机驱动&#xff1b;B和D则具有130ms的tON&#xff0c;用于机顶盒设计&#xff08;目前仅提供A版本&#xff0c;其他版本需预定&#xff09;。内部电荷泵对输入电源反相&#…

accelerate的使用说明

1 多卡(GPU)使用方法 终端输入指令&#xff0c;生成问答页面 accelerate config 这个方法也是可以的 2 后面修改直接找到这个yaml文件进行修改即可 cd ~/.cache/huggingface/accelerate vim default_config.yaml 进入vim进行修改 3 单卡(GPU)使用方法 vim default_config.…

边缘计算网关:智能制造的“智慧大脑”

一、智能制造的崛起 随着科技的飞速发展&#xff0c;智能制造已经成为了制造业的新趋势。智能制造不仅能够提高生产效率&#xff0c;降低生产成本&#xff0c;还能够实现个性化定制&#xff0c;满足消费者多样化的需求。然而&#xff0c;智能制造的实现离不开大量的数据处理和分…

2023.11.25电商项目平台建设2 -四大业务之核销主题建模

1.数仓建模步骤 自下而上 ADS-DWS-DWM-DWD 2.DWD方案(清洗转换,降维拉宽) DWD层的表 dwd_sale_store_sale_dtl_i 门店销售明细宽表 维度dim 销售sale合成成的宽表 dwd_dim_date_f 日期表 store_sale_dtl 门店销售明细表 dwd_sale_store_sale_dtl_i 门店销售明细表 …

快速上手Banana Pi BPI-R4 MediaTek MT7988A 开源路由器开发板

基础开发 准备开发 * 准备8G以上TF卡、USB转串口线、Ubuntu系统* 使用 USB 串行电缆&#xff08;3.3V TTL&#xff0c;波特115200&#xff09;连接到 BPI-R4 上的调试控制台G接地&#xff1b;RXBPI-R4输入&#xff1b;TXBPI-R4输出* BPI-R4 引导程序和设备选择跳线设置* 例子…

【leetcode】62. 不同路径

题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff1f; …

基于SpringBoot的超市信息管理系

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着我国经济的不断发…

【Linux】第二十站:模拟实现shell

文章目录 一、shell的实现细节1.shell的一些细节2.用户名、主机名、工作目录2.输入命令3.改为循环4.切割字符串5.普通命令的执行6.内建命令的处理7.子进程的退出码8.总结 二、模式实现shell完整代码 一、shell的实现细节 1.shell的一些细节 shell操作系统的一个外壳程序。 s…

笔记:pycharm当有多个plt.show()时候,只显示第一个plt.show()

import matplotlib.pyplot as plt import numpy as np# 创建数据 x np.linspace(0, 10, 100) y1 np.sin(x) y2 np.cos(x) y3 np.tan(x) y4 np.exp(x)# 创建一个2x2的子图网格 # fig plt.figure() fig,((ax1, ax2), (ax3, ax4)) plt.subplots(nrows2, ncols2, figsize(8,…

【matlab程序】matlab画台风符号和实例应用

【matlab程序】matlab画台风符号和实例应用 没有看文献&#xff0c;不知道文献中的符号什么样子&#xff0c;据我理解为这样子的&#xff1a; 因此&#xff0c;按照自己的理解做了这期。 结果浏览&#xff1a; 台风符号一切可改&#xff0c;可细细改。可是我不发论文&#xf…

Oracle 中的操作符

1.union:对两个结果集进行并集操作&#xff0c;不包括重复行&#xff0c;同时进行默认规则的排序&#xff1b; SELECT * FROM emp WHERE sal < 1500 UNION SELECT * FROM emp WHERE sal BETWEEN 1000 AND 2000 order by 1 2.union All&#xff1a;对两个结果集进行并集操…

[C/C++]数据结构 堆排序(详细图解)

一:前言 在[C/C]数据结构 堆的详解中,介绍了什么是堆,并且完成了堆的实现和一系列接口,包括向上调整法和向下调整法等,接下来小编介绍一个有点量级的排序方法------堆排序,时间复杂度为O(n*lgn) 二:堆排序详解 2.1 方法介绍 1.首先将待排序数组建为大堆,此时堆顶元素就为数组…

给国外客户价格报低了怎么办

前一段时间有一个单子的货发出去了&#xff0c;被朋友提醒才发现自己报错了价格&#xff0c;造成了亏损&#xff0c;而报错价格的原因并不是自己看错了或者是抄错了价格&#xff0c;而是自己的脑子里记错了产品的价格列表。 如果不是朋友善意的提醒&#xff0c;大概我会一直错…

【心得】XXE漏洞利用个人笔记

XML中关于DTD类型(内部(SYSTEM)的和外部(PUBLIC)的区别) xxe的利用 XML Entity 实体注入 当程序处理xml文件时&#xff0c;没有禁止对外部实体的处理&#xff0c;容易造成xxe漏洞 危害 主流是任意文件读取 XML 文件 一般表示带有结构的数据 祖父 3个叔父 8个堂弟堂妹 …

python-opencv 人脸68点特征点检测

python-opencv 人脸68点特征点检测 不是很难&#xff0c;主要还是掉包&#xff0c;来看一下代码啊&#xff1a; # coding: utf-8 # 导包 import numpy as np import dlib import cv2class face_emotion(object):def __init__(self):# 人脸检测器对象&#xff0c;通过它拿到人…

Rust UI开发(三):iced如何打开图片(对话框)并在窗口显示图片?

注&#xff1a;此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库&#xff0c;用于为rust语言程序构建UI界面。 这是一个系列博文&#xff0c;本文是第三篇&#xff0c;前两篇的链接&#xff1a; 1、Rust UI开发&#xff08;一&#xff09;&#xff1a;使用iced构建…