节点包管理器指南:安装npm +使用命令和模块
这个分步指南将向你展示如何安装npm,并掌握节点包管理器(npm)命令行界面中的常用命令。
Node.js使得在服务器上用JavaScript编写应用程序成为可能。它是建立在V8 JavaScript运行时而且是用c++写的,所以速度很快。最初,它的目的是作为应用程序的服务器环境,但开发人员开始使用它来创建工具来帮助他们本地任务自动化.从那时起,一个全新的基于node的工具生态系统(比如咕哝着说,狼吞虎咽地吃而且webpack)已逐步转变前端开发的面貌。
为了在Node.js中使用这些工具(或包),我们需要能够以一种有用的方式安装和管理它们。这就是npm (Node包管理器)的用武之地。它会安装您想要使用的包,并提供一个使用这些包的有用接口。
在本指南中,我们将了解使用npm的基础知识。我们将向您展示如何以本地和全局模式安装包,以及删除、更新和安装包的某个版本。我们还将向您展示如何使用package.json
管理项目的依赖项。如果你更喜欢视频,为什么不注册SitePoint Premium,观看我们的免费截屏:必威西盟体育网页登录什么是npm,我如何使用它?
但是在开始使用npm之前,我们首先必须在系统上安装Node.js。我们现在就开始吧。
使用Node.js安装npm
转向Node.js下载页面然后获取你需要的版本。有Windows和Mac的安装程序,以及预编译的Linux二进制文件和源代码。对于Linux,你也可以通过包管理器安装Node,如下所述.
对于本教程,我们将使用v12.15.0。在撰写本文时,这是当前的情况Node的长期支持(LTS)版本.
提示:你也可以考虑使用版本管理器安装Node.这就解决了下一节中提出的权限问题。
让我们看看节点安装的位置并检查版本:
$哪一个节点/usr/bin/node $ Node——v12.15.0版本
为了验证您的安装是否成功,让我们尝试一下Node的REPL:
美元的节点>console.log(“节点正在运行”);节点正在运行>有时你被困住了,这个可以让你出来。清除别名为.break .editor进入编辑模式。Exit退出repl。help打印此文件帮助加载JS从一个文件保存所有已评估的命令在这个REPL会话到a文件按^C终止当前表达式,按^D终止当前表达式退出repl
Node.js安装成功了,所以我们现在可以把注意力集中在npm上,它包含在安装中:
$哪一个npm/usr/bin/npm美元npm——版本6.13.7
安装npm更新
npm最初是Node.js的一个独立项目。它往往更新得更频繁。你可以检查最新可用的npm版本页面.如果您发现您使用的是较旧的版本,您可以按以下方式进行更新。
Linux和Mac用户执行如下命令:
npm安装- g npm@latest
对于Windows用户来说,这个过程可能会稍微复杂一些。上面是这么写的项目主页:
npm 3为Windows用户做了很多改进——如果你运行最新版本的npm,你会有更好的体验。要升级,要么使用微软的升级工具,下载Node的新版本,或参考安装/升级npm职位。
对于大多数用户来说,升级工具将是最好的选择。要使用它,您需要以管理员身份打开PowerShell并执行以下命令:
Set-ExecutionPolicy unlimited -Scope CurrentUser -Force
这将确保您可以在系统上执行脚本。接下来,您需要安装npm-windows-upgrade工具。在你安装了这个工具之后,你需要运行它,这样它就可以为你更新npm。在提升的PowerShell控制台中执行所有这些操作:
npm安装——global——production npm-windows-upgrade npm-windows-upgrade——npm-version latest
节点打包模块
NPM可以在本地或全局模式下安装包。在本地模式下,它将包安装在node_modules
父工作目录中的文件夹。此位置由当前用户拥有。
如果你不使用版本管理器(您可能应该这样做),在其中安装全局包{前缀}/ lib / node_modules /
,由root(其中{前缀}
通常是/usr/
或/usr/local
).这意味着你必须使用sudo
全局安装包,这可能会在解决第三方依赖关系时导致权限错误,同时也是一个安全问题。
让我们改变它!
改变npm全局包的位置
让我们看看输出是什么npm配置
给我们:
$npm配置列表;命令行配置metrics-registry=“https://registry.npmjs.org/”范围=""用户代理="npm/6.13.7 node/v12.15.0 Linux x64";节点bin位置=/usr/bin/nodejs;慢性消耗病=/home/必威西盟体育网页登录sitepoint;首页=/home/必威西盟体育网页登录sitepoint;“npm配置ls -l”显示所有默认值。
这为我们提供了关于安装的信息。现在,获取当前的全局位置是很重要的:
$npm配置get prefix /usr
这是我们想要更改的前缀,以便在我们的主目录中安装全局包。在你的主文件夹中创建一个新目录:
$cd~& &mkdir.node_modules_global美元npm配置集前缀=$ HOME/ .node_modules_global
通过这个简单的配置更改,我们改变了安装全局Node包的位置。这也创建了一个.npmrc
文件在我们的主目录:
$npm配置/home/sitepoint/前缀。必威西盟体育网页登录node_modules_global美元猫.npmrc前缀=/home/必威西盟体育网页登录sitepoint/.node_modules_global
我们仍然将npm安装在root用户拥有的位置。但是因为我们改变了全局包的位置,所以我们可以利用它。我们需要再次安装npm,但这一次是在用户拥有的新位置。这也会安装最新版本的npm:
npm安装npm@latest - g
最后,我们需要做加法.node_modules_global / bin
对我们的美元的路径
环境变量,这样我们就可以从命令行运行全局包。通过将以下行附加到您的. profile
,. bash_profile
或. bashrc
重新启动你的终端:
出口路径="$ HOME/ .node_modules_global / bin:美元的路径"
现在我们的.node_modules_global / bin
将首先找到并使用正确的NPM版本:
$哪一个npm/home/必威西盟体育网页登录sitepoint/.node_modules_global/bin/npm $npm——版本6.13.7
提示:如果使用Node版本管理器,可以避免所有这些问题。看看这篇教程,看看如何做到:使用nvm安装多个版本的Node.js.
在全局模式下安装npm包
目前,我们在全球范围内只安装了一个包——npm包本身。让我们改变它,然后安装UglifyJS(JavaScript缩小工具)。我们使用——全球
标志,但这可以缩写为- g
:
$npm安装Uglify-js——global /home/s必威西盟体育网页登录itepoint/。node_modules_global / bin / uglifyjs ->/home/必威西盟体育网页登录sitepoint/.node_modules_global/lib/node_modules/uglify-js/bin/uglifyjs + uglify-js@3.7.7 added3.包从38贡献者在0.259s
从输出中可以看到,安装了额外的包。这些是UglifyJS的依赖项。
列出npm的Installed Global Packages
方法列出已安装的全局包npm列表
命令:
$npmList -global home/s必威西盟体育网页登录itepoint/。node_modules_global/lib ├─┬ npm@6.9.0 │ ├── abbrev@1.1.1 │ ├── ansicolors@0.3.2 │ ├── ansistyles@0.1.3 │ ├── aproba@2.0.0 │ ├── archy@1.0.0....................└─┬uglify-js@3.5.3├──commander@2.19.0└──source-map@0.6.1
然而,输出相当冗长。我们可以用——深度= 0
选择:
$npmList -g——depth=0/home/必威西盟体育网页登录sitepoint/.node_modules_global/lib ├── npm@6.13.7 └── uglify-js@3.7.7
这是更好的;现在我们只看到已经安装的包及其版本号。
全局安装的任何包都可以从命令行获得。例如,下面是如何使用Uglify包来缩小example.js
成example.min.js
:
$ uglifyjs example.js -o example.min.js
在本地模式下安装npm包
在本地安装包时,通常使用package.json
文件。让我们继续创建一个:
$mkdir项目& &cd美元的项目npm初始化包名称:(项目)版本:(1.0.0)说明:软件包演示。Json入口点:(index.js)测验命令:git关键字:作者:许可证:(ISC)
新闻返回若要接受默认设置,请再次按下该键以确认您的选择。这将创建一个package.json
在项目的根文件:
{“名称”:“项目”,“版本”:“1.0.0”,“描述”:"",“主要”:“index.js”,“脚本”:{“测试”:"echo \"错误:没有指定测试\" && exit 1"},“作者”:"",“许可证”:“ISC”}
提示:如果您想要更快地生成package.json
文件使用NPM init——y
.
希望这些字段都是不言自明的,除了主要
而且脚本
.的主要
字段是程序的主要入口点,而脚本
字段允许您指定在包生命周期的不同时间运行的脚本命令。我们现在可以让它们保持原样,但如果您想了解更多,请参阅package.jsondocumentation on npm这篇文章使用NPM作为构建工具.
现在让我们尝试安装下划线:
$npm安装下划线npm注意创建了一个名为package-lock.json的锁文件。你应该提交这个文件。npmWARN project@1.0.0没有存储库字段。+ underscore@1.9.2新增1寄来的包裹1贡献者和审计1包在0.412s发现0漏洞
注意,这里创建了一个锁文件。我们稍后会回到这个问题。
现在如果我们看一下package.json
,我们会看到a依赖关系
新增字段:
{...“依赖”:{“下划线”:“^ 1.9.2”}}
使用package.json管理npm依赖项
可以看到,我们的项目中安装了Underscore v1.9.2。插入符号(^
)表示在安装时,NPM将拉入它能找到的包的最高版本,而只有主版本必须匹配(除非apackage-lock.json
文件存在)。在我们的例子中,这将是v2.0.0以下的任何内容。这种版本控制依赖关系(major.minor.patch)的方法称为语义版本控制.你可以在这里阅读更多信息:语义版本控制:为什么应该使用它.
类型的属性保存了Underscore依赖关系
字段。这已经成为npm最新版本的默认值,用于应用程序运行所需的包(如下划线)。还可以将包保存为devDependency
通过指定——save-dev
国旗。devDependencies
是用于开发目的的包—例如,用于运行测试或编译代码。
提示:你也可以添加私人:真
来package.json
防止意外发布私有存储库,以及抑制运行时产生的任何警告npm安装
.
无疑是使用的最大原因package.json
指定项目的依赖项就是可移植性。例如,当你克隆别人的代码时,你所要做的就是运行npm我
在项目根目录中,npm将解析并获取运行应用所需的所有包。稍后我们将更详细地讨论这个问题。
在完成本节之前,让我们快速检查下划线是否正常工作。创建一个名为. js
在项目根目录中添加以下内容:
常量_=需要(“下划线”);控制台.日志(_.范围(5));
使用node . js
你们应该看到[0,1,2,3,4]
输出到屏幕。
卸载npm本地包
NPM是一个包管理器,所以它必须能够删除一个包。让我们假设当前的下划线包给我们带来了兼容性问题。我们可以删除包并安装一个旧版本,如下所示:
$npm卸载下划线删除1包在0美元的原始npm列出project@1.0.0 /home/sit必威西盟体育网页登录epoint/project├──(空)
安装npm包的特定版本
我们现在可以在我们想要的版本中安装下划线包。我们使用@符号来附加一个版本号:
$npm安装underscore@1.9.1 + underscore@1.9.1新增1包在1.574s美元npm列出project@1.0.0 /home/sit必威西盟体育网页登录epoint/project├──underscore@1.9.1
更新一个npm包
让我们检查一下下划线包是否有更新:
$npm当前需要的最新位置下划线1.9.11.9.21.92项目
的当前的列显示本地安装的版本。的最新的列告诉我们包的最新版本。和想要列告诉我们在不破坏现有代码的情况下可以升级到的包的最新版本。
还记得package-lock.json
之前的文件?在npm v5中引入,这个文件的目的是确保依赖关系仍然存在完全在安装项目的所有机器上都是一样的。函数的任何操作都会自动生成node_modules
文件夹或package.json
文件。
如果你愿意,你可以尝试一下。删除node_modules
文件夹,然后重新运行npm我
(这是…的简称npm安装
).npm将重新安装v1.9.1,尽管我们刚刚看到v1.9.2是可用的。类中指定了1.9.1版本package-lock.json
文件:
{“名称”:“项目”,“版本”:“1.0.0”,“lockfileVersion”:1,“需要”:真正的,“依赖”:{“下划线”:{“版本”:“1.9.1”,“解决”:“https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz”,“诚信”:“sha512-5/4etnCkd9c8gwgowi5 / om / mYO5ajCaOgdzj噢+ 0 eqv9wxkbdzw5 + ycmKmeaTXjInS / W0BzpGLo2xR2aBwZdg = = "}}}
在出现之前package-lock.json
文件,不一致的包版本证明是一个让开发人员头疼的问题。这通常是通过使用npm-shrinkwrap.json
文件,必须手动创建。
现在,让我们假设最新版本的下划线修复了我们之前的错误,我们想要更新我们的包到那个版本:
$npm更新下划线+ underscore@1.9.2已更新1包在0去年美元npm列出project@1.0.0 /home/sit必威西盟体育网页登录epoint/project├──underscore@1.9.2
提示:要做到这一点,下划线必须被列为依赖项package.json
.我们也可以执行npm更新
如果我们有很多过时的模块,我们想要更新。
搜索npm包
我们用过mkdir
在本教程中多次使用命令。是否存在具有此功能的Node包?让我们使用npm搜索
:
$npm搜索mkdir的名字|描述|作者|日期mkdir|目录创建…|=joehewitt|201204-17 fs-extra|fs-extra包含…|=jprichardson……|201906-28 mkdirp|递归地mkdir,……|=艾萨克斯……|202001-24 make-dir|做一个目录…|=sindresorhus|201904-01...
有(mkdirp).让我们来安装它:
$npm安装Mkdirp + mkdirp@1.0.3添加1包装及审核2包在0.384s
现在创建一个mkdir.js
复制粘贴这段代码:
常量mkdirp=需要(“mkdirp”);常量使=mkdirp.同步(“/ tmp / foo / bar /巴兹”);控制台.日志(`制作目录,从$ {使}`);
接下来,从终端运行它:
$ node mkdir.js创建目录,以/tmp/foo开始
使用npm重新安装项目依赖项
让我们先安装另一个包:
$npm安装请求+ request@2.88.0已添加48包从59贡献者和审计65包在2收了0漏洞
检查package.json
:
“依赖”:{“mkdirp”:“^ 1.0.3”,“请求”:“^ 2.88.0”,“下划线”:“^ 1.9.2”},
注意,依赖项列表已自动更新。如果你想安装一个包而不保存它package.json
,只需使用——无豁免
论点。
让我们假设您已经将项目源代码克隆到另一台机器上,并且希望安装依赖项。让我们删除node_modules
文件夹,然后执行npm安装
:
$rm-R node_modules $npm列表——深度=0project@1.0.0 /home/必威西盟体育网页登录sitepoint/project├──UNMET DEPENDENCY mkdirp@1.0.3├─UNMET DEPENDENCY request@2.88.0...├──未满足的依赖underscore@1.9.2npm犯错!缺:mkdirp@1.0.3, project@1.0.0需要npm犯错!缺:request@2.88.0, project@1.0.0需要npm犯错!缺:underscore@1.9.2, project@1.0.0需要...$npm安装添加50包从60贡献者和审计65包在1.051s发现0漏洞
如果你看你的node_modules
文件夹,你会看到它再次被重新创建。通过这种方式,您可以轻松地与他人共享代码,而不会因依赖项而使项目和源代码存储库膨胀。
管理npm的缓存
当npm安装一个包时,它会保留一个副本,所以下次你想要安装这个包时,它不需要访问网络。副本缓存在.npm
主路径下的目录:
$ls~ /。npmanonymous-cli-metrics.json _cacache index-v5 _locks _logs node-sass
随着时间的推移,这个目录会被旧的包弄得乱七八糟,所以偶尔清理一下是很有用的:
$npm缓存清理——强制
您也可以清除所有node_module
如果您的系统上有多个节点项目,则需要清理工作区中的文件夹:
找到.- name“node_modules”-type d -execrm射频“{}”+
使用npm Audit扫描依赖关系以查找漏洞
你注意到这些了吗发现0个漏洞
分散在CLI输出中?原因是npm引入了一个新特性,允许开发人员扫描依赖关系以查找已知的安全漏洞。
让我们通过安装旧版本的表达
:
$npm安装express@4.8.0 express@4.8.0新增36包从24贡献者和审计123包在2.224s发现21漏洞(8低,9温和,4高)运行`npm审计修复`修理它们,或者`npm审计`为细节
一旦我们完成安装,我们就会得到一个快速报告,发现了多个漏洞。可以执行该命令npm审计
浏览详情:
$npm审计= ==npm审计安全报告= ==#运行npm install express@4.17.1来解决21个漏洞┌───────────────┬──────────────────────────────────────────────────────────────┐拒绝服务│││高正则表达式├───────────────┼──────────────────────────────────────────────────────────────┤│││包谈判代表├───────────────┼──────────────────────────────────────────────────────────────┤│││表达的依赖├───────────────┼──────────────────────────────────────────────────────────────┤││表达>接受>谈判代表│├───────────────┼──────────────────────────────────────────────────────────────┤https://nodesecurity.io/advisories/106│││更多信息└───────────────┴──────────────────────────────────────────────────────────────┘┌───────────────┬──────────────────────────────────────────────────────────────┐温和││计时攻击│├───────────────┼──────────────────────────────────────────────────────────────┤││包cookie-signature│├───────────────┼──────────────────────────────────────────────────────────────┤│││表达的依赖├───────────────┼──────────────────────────────────────────────────────────────┤││表达>cookie-signature│├───────────────┼──────────────────────────────────────────────────────────────┤https://nodesecurity.io/advisories/134│││更多信息└───────────────┴──────────────────────────────────────────────────────────────┘
您将获得包含漏洞的软件包的详细列表。如果你看路径
字段,它显示依赖项路径。例如,路径快递>接受>谈判员
表示Express依赖于接受
包中。的接受
包取决于谈判代表
包,其中包含漏洞。
解决所有这些问题有两种方法。我们可以执行命令NPM安装express@4.17.1
如建议,还是跑NPM审计修复
.让我们选择后者:
$npm审计修复+ express@4.17.1添加20.包从14贡献者,删除7软件包和更新29包在1.382s固定21的21漏洞在122扫描包
命令NPM审计修复
自动为易受攻击的依赖项安装任何兼容更新。虽然这看起来像魔术,但请注意,漏洞并不总是自动修复。如果您正在使用的包经历了重大更改,更新后可能会破坏当前项目,则可能会发生这种情况。对于这种情况,您必须检查代码并手动应用修复。
你也可以跑NPM审计修复——强制
如果您不介意升级带有破坏性更改的包。执行完命令后,运行npm审计
确保所有漏洞已被解决。
npm别名
正如你可能已经注意到的,运行npm命令有多种方式。下面是一些常用的npm别名的简要列表:
NPM I
:安装本地包NPM I -g
:安装全局包NPM UN
:卸载本地包npm起来
: NPM更新包npm t
:运行测试npm ls
:列出已安装的模块npm噢
或npm拉
:在列出模块时打印额外的包信息
你也可以像这样一次安装多个包:
$npm我表达momemt lodash猫鼬身体解析器webpack
如果你想查看所有常用的npm命令,只需执行npm帮助
完整的列表。你也可以在我们的文章中了解更多让你成为npm忍者的10个技巧.
使用npx执行包
你也可能在旅行中听到npx的说法。不要把它和npm混淆。正如我们所了解的,npm是用于管理你的包,而NPX是一个工具执行包。它与npm 5.2+版本捆绑在一起。
npx的典型用法是执行一次性命令。例如,假设您想启动一个简单的HTTP服务器。你可以安装http服务器包在您的系统中,如果您将使用http服务器
定期的。但是如果你只是想测试这个包,或者想让你的全局安装模块最小化,你可以切换到你想要运行它的目录,然后执行以下命令:
npx http服务器
这将启动服务器,而无需在全局上安装任何东西。
你可以点击这里阅读更多关于NPX的信息.
结论
在本教程中,我们已经介绍了使用npm的基础知识。我们已经演示了如何从项目的下载页面安装Node.js,如何改变全局包的位置(这样我们就可以避免使用sudo
),以及如何以本地和全局模式安装包。我们还介绍了删除、更新和安装包的特定版本,以及管理项目的依赖项。
从这里,你可能会比较npm和Yarn找出最适合你需要的。你可以处理更复杂的需求使用nvm,节点版本管理器,或学习如何托管和发布私有NPM包.如果您想探索下一代JavaScript运行时,可以尝试一下学习Deno仔细阅读Deno包管理如何工作.
随着每一个新版本的发布,npm都在向前端开发领域迈进一大步。据其联合创始人说它的用户群正在发生变化,大多数使用它的人根本不使用它来编写Node。相反,它正在成为人们用来把JavaScript放在前端的工具(说真的,你可以用它来安装任何东西),它正在成为编写现代JavaScript不可分割的一部分。