今天,在Node.js手册翻译的第五部分中,我们将完成对npm功能的分析,特别是,我们将涉及诸如发现npm软件包的已安装版本,安装旧版本的软件包,更新依赖项,本地和全局卸载软件包等问题。 在这里,我们谈论npx。

找出已安装的npm软件包的版本
为了找出安装在项目文件夹中的所有npm软件包的版本,包括它们的依赖关系,请运行以下命令:
npm list
结果,例如,可能会导致以下结果:
> npm list /Users/flavio/dev/node/cowsay └─┬ cowsay@1.3.1 ├── get-stdin@5.0.1 ├─┬ optimist@0.6.1 │ ├── minimist@0.0.10 │ └── wordwrap@0.0.3 ├─┬ string-width@2.1.1 │ ├── is-fullwidth-code-point@2.0.0 │ └─┬ strip-ansi@4.0.0 │ └── ansi-regex@3.0.0 └── strip-eof@1.0.0
通过查看项目的
package-lock.json
您可以找到相同
package-lock.json
内容,但是上述命令显示的树结构更易于查看。
为了获得全局安装的软件包的类似列表,可以使用以下命令:
npm list -g
您只能显示有关本地顶级软件包(即,您自己安装的软件包以及在
package.json
中列出的软件包)的信息,如下所示:
npm list
结果,例如,如果仅安装了Cowsay软件包,将显示以下内容:
> npm list
要查找特定软件包的版本,请使用以下命令:
npm list cowsay
由于其实施,我们大致得到以下结果:
> npm list cowsay /Users/flavio/dev/node/cowsay └── cowsay@1.3.1
此命令还适用于找出所安装软件包的依赖版本。 在这种情况下,依赖程序包的名称将作为传递给它的程序包的名称,命令的输出将如下所示:
> npm list minimist /Users/flavio/dev/node/cowsay └─┬ cowsay@1.3.1 └─┬ optimist@0.6.1 └── minimist@0.0.10
在此结构中,有关依赖性包的条目将突出显示。
如果您想知道npm存储库中可用的软件包的最新版本号是多少,您将需要以下格式的命令:
npm view [package_name] version
作为回应,她发布了软件包的版本号:
> npm view cowsay version 1.3.1
安装旧版本的npm软件包
解决兼容性问题可能需要安装旧版本的npm软件包。 您可以使用以下结构从npm安装所需的软件包版本:
npm install <package>@<version>
以Cowsay软件包为例,npm
install cowsay
安装其最新版本(在撰写本文时为1.3.1)。 如果需要安装其版本1.2.0,请使用以下命令:
npm install cowsay@1.2.0
您可以通过安装全局软件包来指定版本:
npm install -g webpack@4.16.4
如果您需要找出npm中可用的软件包版本,可以在以下构造的帮助下进行操作:
npm view <package> versions
这是她的工作成果的一个例子:
> npm view cowsay versions [ '1.0.0', '1.0.1', '1.0.2', '1.0.3', '1.1.0', '1.1.1', '1.1.2', '1.1.3', '1.1.4', '1.1.5', '1.1.6', '1.1.7', '1.1.8', '1.1.9', '1.2.0', '1.2.1', '1.3.0', '1.3.1' ]
将项目依赖项更新到最新版本
使用
npm install <packagename>
类型的命令安装软件包时,将从存储库下载最新版本并将其放置在
node_modules
文件夹中。 在这种情况下,
package-lock.json
相应的条目添加到项目文件夹中的
package.json
和
package-lock.json
中。
另外,通过安装软件包,npm查找并安装其依赖项。
假设我们通过运行
npm install cowsay
安装熟悉的Cowsay软件包。 该软件包将安装在项目的
node_modules
文件夹中,并且以下条目将位于
package.json
文件中:
{ "dependencies": { "cowsay": "^1.3.1" } }
package-lock.json
也将包含有关此软件包的信息。 这是其中的一部分:
{ "requires": true, "lockfileVersion": 1, "dependencies": { "cowsay": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/cowsay/-/cowsay-1.3.1.tgz", "integrity": "sha512-3PVFe6FePVtPj1HTeLin9v8WyLl+VmM1l1H/5P+BTTDkMAjufp+0F9eLjzRnOHzVAYeIYFF5po5NjRrgefnRMQ==", "requires": { "get-stdin": "^5.0.1", "optimist": "~0.6.1", "string-width": "~2.1.1", "strip-eof": "^1.0.0" } } } }
从这两个文件中,您可以发现我们安装了Cowsay版本1.3.1,并且软件包更新规则指定为
^1.3.1
。 在本系列文章的第四部分中,我们已经讨论了语义版本控制的规则。 回想一下,该条目意味着npm可以在发布次要版本和修补程序版本时更新软件包。
例如,如果出现新的次要版本的软件包并运行
npm update
命令,则将更新软件包的已安装版本,并在
package-lock.json
文件中更新有关已安装软件包的信息,并且
package.json
文件保持不变。
为了确定是否已发布项目中使用的软件包的新版本,可以使用以下命令:
npm outdated
这是该项目的依赖项已长时间未更新的结果:
不推荐使用的项目依赖关系分析一些可用的软件包更新是其主要发行版,执行
npm update
命令时不会进行
npm update
。 该团队不会升级到主要版本,因为它们(根据定义)可能包含无法通过与以前的主要版本向后兼容来区分的主要更改,npm旨在使开发人员免受可能导致使用此类软件包的问题的困扰。
为了升级到所有使用过的软件包的新主要版本,请全局安装
npm-check-updates
软件包:
npm install -g npm-check-updates
然后运行他提供的实用程序:
ncu -u
该命令将更新
package.json
文件,并在
dependencies
和
devDependencies
更改适用的软件包版本的说明。 运行
npm update
命令后,这将允许npm将项目中使用的软件包更新到新的主要版本。
如果要为刚刚下载的项目安装最新的软件包版本,而该版本尚未具有
node_modules
文件夹,请运行
npm install
命令,而不是
npm update
。
本地或全局卸载软件包
要卸载以前在本地
install <package-name>
(使用
install <package-name>
命令),请运行如下所示的命令:
npm uninstall <package-name>
如果该软件包是全局安装的,则需要使用
-g
(--global
)标志将其删除。 例如,类似的命令可能如下所示:
npm uninstall -g webpack
执行这样的命令时,当前文件夹无关紧要。
关于在软件包的全局安装和本地安装之间进行选择
什么时候以及为什么最好在全球范围内安装软件包? 为了回答这个问题,让我们回顾一下软件包的本地安装和全局安装如何不同:
- 本地软件包安装在目录中,它们在其中执行
npm install <package-name>
格式的命令。 此类软件包位于此目录中的node_modules
文件夹中。 - 全局软件包安装在一个特殊的文件夹中(该文件夹取决于系统的特定设置),无论它们在何处执行
npm install -g <package-name>
格式的命令。
在代码中连接本地和全局程序包是相同的:
require('package-name')
那么安装软件包的最佳方法是什么?
通常,所有软件包都应在本地安装。 因此,即使您有数十个Node.js项目,也可以确保在必要时使用相同软件包的不同版本。
更新全局软件包会导致一个事实,即应用该软件包的所有项目都将使用其新版本。 很容易理解,就项目支持而言,这可能会导致一场真正的噩梦,因为某些软件包的新发行版可能与其旧版本不兼容。
如果每个项目都有其自己的本地版本的软件包,即使这看起来像是在浪费资源,但这也是一笔很小的费用,可以避免由于以项目代码集中更新的新版本软件包不兼容而造成的负面影响。
当软件包是在许多项目中使用的从命令行调用的某些实用程序时,应在全局安装软件包。
也可以通过运行它们使用npx提供的命令行实用程序在本地安装此类软件包,但是某些软件包在全球范围内仍可以更好地安装。 您可能非常熟悉的此类软件包包括,例如:
- npm
- 创建反应应用
- Vue-Cli
- 咕-声
- 摩卡咖啡
- 反应本机
- 盖茨比克利
- 永远
- Nodemon
您的系统可能已经全局安装了软件包。 要查找有关此问题,请使用以下命令:
npm list -g --depth 0
关于项目依赖
何时应将软件包视为确保其正常运行所必需的常规项目依赖项,以及何时将其视为开发依赖项?
使用
npm install <package-name>
类的命令
npm install <package-name>
它将作为常规依赖项安装。 在
package.json
文件的
dependencies
部分中记录了此类软件包(在npm 5之前,仅使用
--save
标志进行了记录,现在无需使用它)。
使用
--save-dev
标志可让您将软件包安装为开发依赖项。 同时,在
devDependencies
文件的
devDependencies
部分中进行了记录。
开发依赖项是在项目开发过程中所需的软件包;在其正常运行期间,不需要它们。 此类软件包包括例如测试工具Webpack,Babel。
当使用
npm install
命令在其文件夹中部署项目时,该文件夹中有一个包含
package.json
文件的文件夹,这将导致所有依赖项的安装,因为npm假定执行此类安装是为了处理该项目。
因此,如果需要在生产中部署该软件包,则在部署它时,需要使用npm
install --production
。 由于使用了
--production
标志,因此将不会安装
--production
依赖项。
Npx实用程序
现在,我们将讨论一个非常强大的团队
npx ,它出现在npm 5.2中。 它的功能之一是运行npm软件包中包含的可执行文件。 我们已经考虑过使用npx从Cowsay包中运行类似的文件。 现在让我们更详细地讨论这一点。
▍使用npx简化运行本地命令
Node.js开发人员以应该在全球范围内安装的软件包的形式发布了许多可执行文件(实用程序),这提供了对其功能的便捷访问,因为您只需输入相应命令的名称即可从命令行运行它们。 但是,如果需要安装同一软件包的不同版本,则在这样的环境中工作非常不舒服。
使用
node_modules
npx commandname
形式的命令
npx commandname
在项目文件夹
node_modules
自动搜索所需的文件。 这样就无需知道此类文件的确切路径。 这也使程序包的全局安装不再必要,从而可以通过使用
PATH
系统变量从文件系统中的任何位置对其进行访问。
utilities无需安装即可执行实用程序
Npx具有另一个有趣的功能,这是由于无需先安装即可启动实用程序。 这主要是有用的,原因如下:
- 无需安装实用程序。
- 通过使用
@version
构造指定所需的版本,可以运行相同实用程序的不同版本。
让我们看看如何使用已经知道的
cowsay
实用程序来使用这种机制。 因此,如果在全球范围内安装了cowsay软件包,则在命令行上执行
cowsay "Hello"
命令将向控制台输出一个“ talking” cow:
_______ < Hello > ------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||
如果Cowsay软件包未全局安装,则类似的命令将引发错误。
npx实用程序使您无需安装即可执行此类命令。 在我们的示例框架中,它看起来像这样:
npx cowsay "Hello"
这样的命令将起作用,但是尽管总的来说,“会说话的”母牛并没有带来太多好处,但是可以使用相同的方法来执行更多有用的命令。 以下是一些示例:
- 有一个用于创建和运行Vue应用程序的命令行工具。 使用npx可以这样称呼:
npx vue create my-vue-app
。 - 您可以使用
create-react-app
实用程序create-react-app
React应用程序。 她通过npx进行的呼叫如下所示: npx create-react-app my-react-app
。
下载并使用适当的npx代码后,它将被删除。
using使用各种版本的Node.js启动JavaScript代码
为了使用不同版本的Node.js运行某些代码,您可以使用npx访问npm包
node
,以指示其版本。 看起来像这样:
npx node@6 -v
这样就无需使用nvm或Node.js的其他版本管理器之类的工具。
▍开始在某个地址可用的任意代码片段
Npx不仅允许您运行npm中发布的代码。 特别是,如果您具有指向特定代码段的链接(例如,发布在
GitHub上的要点),则可以这样运行它:
npx https:
当然,在执行此类代码时,您不应忘记安全性。 Npx给开发人员带来了巨大的机会,但同时也意味着巨大的责任。
▍结果
今天,我们讨论了一些有用的npm机制和npx的用法。 至此,您应该对npm设备以及如何使用此软件包管理器有基本的了解。 如果您想更深入地了解npm,请查看项目的文档
页面并进行更多实验。
下次,我们将讨论一些基本的Node.js机制,对这一平台的成功应用程序开发而言,有必要了解它们。
亲爱的读者们! 您使用npx吗?
