NPM 实用命令与快捷方式
在 JavaScript 中,无论是新手还是专家都可能在命令行中使用过 NPM。在本篇文章中,我将会整理超实用的 NPM 命令、快捷方式及技巧,帮助 JavaScript 开发人员提高生产力和效率。
在这篇文章中,我们将涵盖以下主题:
- npm 的定义。
- 使用 npm 包管理系统管理应用程序依赖项,来发布或取消发布包。
- 按版本号安装包。
package.json和package-lock.json文件之间的区别。- 使用 npm 命令审核包安全性。
在开始之前,让我们回顾一下什么是 NPM 以及如何使用它。
什么是 NPM?
从概念上讲,NPM(Node Package Manager)类似于PiP(Python),RubyGems(Ruby on Rails),apt-get(Debian),rpm / yum(Red Hat/Fedora),CPAN(Perl)或PEAR(PHP)等工具。NPM 于 2010 年发布,是 Node.js 的包管理和分发系统,Node 是一个用于构建服务器端应用程序的环境。其目的是使用简单的命令行界面在互联网上发布和分发 Node.js 包。近年来,它也被广泛用于分发前端库,如 React 或 TailwindCss。使用 npm,用户可以在 npm 的网站上快速找到用于特定目的的软件包、下载、安装或管理用户已安装的软件包。
如何使用 NPM
使用 NPM 很简单,可以理解为像 Node 一样从命令提示符运行的另一个命令。举个例子,现在创建一个名为 tester 的目录,并使用以下命令初始化项目:npm init-yes。此文件夹中自动生成一个名为 package.json 的文件,此文件包含有关项目的所有信息。之后,执行以下命令:
npm install ioredis
在这里,NPM 是命令行界面 (CLI) 程序,可以向其发出安装命令。 ioredis 是该命令的参数,这是用户与 NPM 的交互将采用的一般形式。通过执行上一个命令,我们将在 tester 文件夹中创建一个名为 node_modules 的新目录。这是构成 ioredis 模块的所有代码。
package.json 和 package-lock.json 之间的区别
通过使用命令:npm install ioredis,还会自动生成名为 package-lock.json 和 package.json 的两个文件。一般来说我们会认为 package.json 文件类似于 package-lock.json 文件。
实际上这两个文件确实区别不大。package.json 包含项目的所有信息,尤其是项目中使用的依赖项或模块及其本地版本。 package-lock.json 是 package.json 文件的副本、版本化的依赖树,它还包括用户使用的依赖项和开发依赖项。
NPM 全局与本地包
包可以在本地或全局模式下安装。在本文我们是以本地模式安装软件包。
- 本地软件包安装在运行
npm install的目录中,并放在此目录下的node_modules文件夹中。 - 全局软件包都放在系统中的一个位置(确切的位置取决于用户的设置),无论用户在哪里运行
npm install -g。通常,全局安装的包提供从 shell (CLI) 运行的可执行命令,并且跨项目重复使用该命令。全局模式包可从命令行界面 (CLI) 获得,而本地模式下的包安装在npm install目录下的node_modules文件夹中。全局软件包的例子有 nodemon,grunt-cli,forever,cross-env 等等。
按版本号安装软件包
npm 中的版本号匹配功能强大且灵活。有了它,用户可以定位给定包的特定版本或任何版本号范围。默认情况下,NPM 会安装命名包的最新版本,就像我们在上一节中所做的那样。无论是采用默认值还是指定版本号,NPM 都将确定要安装的内容。包版本在 package.json 文件中声明,因此让我们看一下相关字段:
{ …
“version”: “4.28.2”,
“dist-tags”: {
“latest”: “4.28.2”
},
… }
版本字段显然声明了当前包版本。dist-tags 包字段列出了软件包维护者可以用来帮助用户选择正确版本的符号标记。此字段由 npm dist 标记命令维护。npm install 命令支持以下变体:
$ npm install @tag
$ npm install @version
$ npm install @version-range
用户可以指定 ioredis@4.28.0 以定位精确版本,或指定 ioredis@“>3.1.0 < 4.0” 以定位一系列 ioredis V3 版本。版本匹配说明符包括以下选项:
- 完全版本匹配:4.28.0
- 至少版本 N:>4.28.0
- 最高版本 N:<4.28.0
- 两个版本之间:>=4.24.3 <4.28.3
@tag属性是一个符号名称,例如 @latest、@stable 或 @canary。包所有者将这些符号名称分配给特定的版本号,并可以根据需要重新分配它们。@latest 比较特殊,每当发布包的新版本时都会更新。
卸载包
如果你想下载安装过的包,使用以下指令:
$ npm uninstall <package-name>
更新包
项目建立之后,有时我们会需要更新它所依赖的包。这可以这么操作:
$ npm update
NPM 将关闭并将所有软件包更新到最新版本。如果要将包更新到特定版本,请使用以下命令:
$ npm update <package-name>@version
审核包的安全性
有时使用的软件包会被发现存在安全漏洞,NPM 团队构建了以下命令来处理这个问题:
$ npm audit
运行此命令将扫描用户的 package.json 文件,并将依赖项列表提交到默认 NPM 镜像仓库,请求有关其中任何已知漏洞的报告。此报告还将包含有关如何修正的信息。如果想要快速修复问题,请运行以下命令:
$ npm audit fix
通过执行这个命令, NPM 将使用未报告漏洞的最新可用版本,来更新易受攻击的软件包。如果要查看详细的审核报告,请执行:
$ npm audit –json
如果需要查看纯文本报告,请执行:
$ npm audit –readable
如果想看看 npm audit fix 怎么执行的,可以使用这个命令:
$ npm audit fix –dry-run
重复数据删除和修改
用户们常常抱怨的是 node_modules 目录的大小会突然增加。虽然现在磁盘空间很便宜,但是能够节省空间有什么不好呢?NPM 提供了两个命令来处理这种情况,第一个是:
$ npm dedupe
或:
$ npm ddp
此命令在 node_modules 中搜索 tree of packages,并查找可以在 tree 中向上移动并在依赖项之间共享的包,来减少冗余并节省空间。当安装 NPM 软件包时,packge tree 会随之被构建。尽管包之间会有共同的依赖项,但 package tree 有很多独立的分支,而通过该命令可以重新组织这些分支。
第二个命令:
$ npm prune
此命令将检查已安装的软件包并查找可能不再需要的任何软件包。这通常发生在卸载软件包时,特别是用户在某个时候重复进行数据删除。
发布和取消发布包
将包发布到镜像仓库很简单!当用户写好包之后,npm 会出初始化项目并将代码集中在一起,然后转到镜像仓库网站并创建一个新帐户。用户需要从命令行登录到该帐户。
$ npm login
输入用户名、密码和电子邮件地址。登录后,进行发布:
$ npm publish
使用此命令,将使用默认名称发布包。不过可能会出现包名称被占用的情况。因此建议在发布之前先对包名称进行搜索,如果名称没有被占用的话,包就会立即被发布并在镜像仓库中可用。
提示
如果所需的名称不可用,NPM 还允许用户发布到 scope。例如,用户可以将名称更改为 @/(或执行 npm init-scope=)。然后,还需要将 -access public 添加到发布命令中。这样,只要包名称在 scope 内是唯一的就可用了,该名称同样还可以在其他 scope 中使用。如果用户需要从镜像仓库中删除这个软件包,只需:
npm unpublish [<@scope>/]<package-name>[@<version>]
到现在为止,我们已经探索了一些非常高频实用的 NPM 命令。当然,NPM 还有许多其他实用命令我们还没有涉及到,你可以使用 command_npm help_ 获取帮助,或去 NPM 官方文档网站来探索更多命令。
接下来我将列举一些技巧和快捷方式,帮助你更有效地使用 NPM。
快捷方式和小tips
在删除包时我们总会有所顾虑,因为其他开发人员可能也依赖于这个包。在这个情况下可以使用以下命令:
npm deprecate <pkg>[@<version range>] <message>
这个命令将包标记为已弃用,可以选择应用可以指定有关发生的情况的消息。
将
private: true添加到package.json,以防止意外发布任何私有仓库。快速生成
package.json文件,请使用以下命令:npm init -y请不要删除
package.json,但可以在提交之前删除package-lock.json。在从 Git 存储库克隆项目后运行
npm install。不建议将
node_modules推送到源代码管理存储库(如 Git)。如果您使用 Git 作为版本控制,请在推送项目之前将node_modules添加到.gitignore文件。
NPM 实用命令与快捷方式的更多相关文章
- npm常用命令解析
npm是什么 NPM的全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载.安装.上传以及管理已经安装的包. npm ...
- npm常用命令学习(npm install -D,semver版本规范, npm进行版本管理的最佳实践用法)
什么是npm npm有两层含义.一层含义是Node的开放式模块登记和管理系统,网址为npmjs.org.另一层含义是Node默认的模块管理器,是一个命令行下的软件,用来安装和管理Node模块. npm ...
- 【原】npm 常用命令详解
今年上半年在学习gulp的使用,对npm的掌握是必不可少的,经常到npm官网查询文档让我感到不爽,还不如整理了一些常用的命令到自己博客上,于是根据自己的理解简单翻译过来,终于有点输出,想学习npm这块 ...
- npm常用命令
npm常用命令 环境:win7 npm 是什么 NPM(node package manager),通常称为node包管理器.顾名思义,它的主要功能就是管理node包,包括:安装.卸载.更新.查看.搜 ...
- npm常用命令小结
目录(更新于2016.09.23): 1.认识和使用NPM 2.npm包安装模式 3.npm包管理(package的安装.卸载.升级.查看.搜索.发布,其他等) npm install [-g] 本地 ...
- 安装mysql数据库中的技巧、错误排查以及实用命令(持续更新)
针对解压版本5.7.16(博主使用的这个版本.在某些低版本中部分命令失效) 一.初始化data目录(解压版解压后没有data目录) mysqld --initialize-insecure --use ...
- NoSQL之Redis高级实用命令详解--安全和主从复制
Android IOS JavaScript HTML5 CSS jQuery Python PHP NodeJS Java Spring MySQL MongoDB Redis NOSQL Vim ...
- npm使用过程中的一些错误解决办法及npm常用命令
node,npm在前端开发流程中提供了非常完善的自动化工具链,但是同样由于其复杂性导致有很多奇奇怪怪的问题.本文将记录使用过程中出现的一些问题及其解决方法备案. 国内由于gfw问题,导致很多国外的网站 ...
- npm常用命令总结
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: rgba(2 ...
- npm 常用命令详解[转]
npm是什么 NPM的全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载.安装.上传以及管理已经安装的包. npm ...
随机推荐
- STL妙用总结(持续更新)
1. map 自带排序功能.从小到大!把一堆东西按照要排序的键放在map里可以当二叉排序树使用.插入和检索都不错
- [C#] Func及Action的快速Demo
参考代码1: using System;using System.Collections.Generic;using System.Linq;namespace FuncActionDemo{ ...
- [cisco][LAB]OSPF in NBMA
NBMA為一種沒有廣播類型的的網路連接,這會使得OSPF建立需要手動設定 拓樸如下: R1# ! interface Loopback0 ip address 172.16.1.1 255.255.2 ...
- centos下vi 命令用法
vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相 ...
- MySql分库分表以及相关问题
为什么要分库分表? MySql是存在瓶颈的,数据量就是他最大的瓶颈,如果一张表或者一个数据库里面的数据量过大都会导致一些意料之外的问题,譬如查询过慢,难以维护等问题,这时候就要想出一个完美的解决办法. ...
- P1706 全排列问题(DFS)
全排列问题 题目描述 按照字典序输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入格式 一个整数n 输出格式 由1 ~ n组成的所有不重复的数字序列 ...
- 【BUUCTF]ACTF2020 新生赛Exec1write up
根据题目分析,俺们要用ping命令! 打开靶机,输入127.0.0.1尝试提交,直接出现无过滤: 尝试管道符执行命令,常见管道符: 1.|(就是按位或),直接执行|后面的语句 2.||(就是逻辑或), ...
- c++方便的输出vector和map_重载的应用 【python一样写c++、二】
写程序,尤其是调试的时候,会想着直接输出一个map或者vector来调错. 但本来的cout<<没有这种功能.我们就会想了,要是c++能和python一样,直接输出一个列表(vector) ...
- 解密Prompt系列3. 冻结LM微调Prompt: Prefix-Tuning & Prompt-Tuning & P-Tuning
这一章我们介绍在下游任务微调中固定LM参数,只微调Prompt的相关模型.这类模型的优势很直观就是微调的参数量小,能大幅降低LLM的微调参数量,是轻量级的微调替代品.和前两章微调LM和全部冻结的pro ...
- 深入理解 Python 虚拟机:元组(tuple)的实现原理及源码剖析
深入理解 Python 虚拟机:元组(tuple)的实现原理及源码剖析 在本篇文章当中主要给大家介绍 cpython 虚拟机当中针对列表的实现,在 Python 中,tuple 是一种非常常用的数据类 ...