Node.js新手指南,使在服务器端使用JavaScript编写应用程序成为可能。它基于V8Javascript运行时并用C++编写,因此速度很快。最初,它旨在作为应用程序的服务器环境,但开发人员使用它来创建工具来帮助他们实现本地任务自动化。从那时起,Grunt、Gulp和Webpack等基于节点的工具的全新生态系统彻底改变了前端开发的面貌。为了在Node.js中使用这些工具(或包),我们需要能够以高效的方式安装和管理它们。这就是我们要讨论的内容:npm——Node的包管理器。它负责安装您需要使用的包,并提供一个有用的界面供您与它们交互。在本文中,我将介绍使用npm的基础知识。我将向您展示如何在本地和全局模式下安装包,以及删除、更新和安装包的某个版本。我还将向您展示如何使用package.json来处理项目依赖项。如果您想观看视频,请注册SitePointPremium以观看我们的免费截屏视频:什么是npm以及如何使用它?.在开始使用npm之前,您首先需要在计算机上安装Node.js。安装Node.js前往Node.js下载页面获取您需要的版本。安装包和预编译的Linux二进制文件和源代码可用于Windows和Mac环境。对于Linux环境,您还可以通过包管理器安装Node,如此处所述。对于本教程,我们将使用v6.10.3稳定版。在撰写本文时,这是Node.js的当前长期支持(LTS)版本。提示:您也可以考虑使用版本管理器来安装Node。这将消除下面提出的权限问题。我们先看一下Node.js的安装位置和版本。$whichnode/usr/bin/node$node--versionv6.10.3使用Node的REPL(交互式解释器)检查是否安装成功。$node>console.log('Nodeisrunning');Nodeisrunning>.help.break有时你会卡住,这会让你退出。clearAliasfor.break.exit退出repl.help显示repl选项。load将JS从一个文件加载到REPL会话中。save将这个REPL会话中所有执行的命令保存到一个文件中>.exitNode.js已经成功安装,现在我们可以关注npm,它已经与上面安装的Node集成。js。$whichnpm/usr/bin/npm$npm--version3.10.10节点包模块npm可以本地或全局方式安装包。在本地模式下,包安装在父工作目录的node_modules文件夹中。该位置归当前用户所有。安装在{prefix}/lib/node_modules/中的全局包归用户根目录所有({prefix}通常是/usr/或/usr/local)。这意味着你将不得不使用sudo来全局安装包,这可能会导致在解析第三方依赖项时出现权限错误,也可能会导致安全问题。让我们做一个改变:改变全局包的位置让我们看看运行npmconfiglist的输出是什么:$npmconfiglist;cli配置user-agent="npm/3.10.10node/v6.10.3linuxx64";userconfig/home/sitepoint/.npmrcprefix="/home/sitepoint/.node_modules_global";节点bin位置=/usr/bin/nodejs;cwd=/home/sitepoint;HOME=/home/sitepoint;“npmconfigls-l”显示所有默认值。输出为我们提供了有关npm安装的信息。现在,重要的是获得当前的全局位置。$npmconfiggetprefix/usr为了在主目录中安装全局包,我们需要更改这个前缀。为此,您可以在主文件夹中创建一个新目录。$cd~&&mkdir.node_modules_global$npmconfigsetprefix=$HOME/.node_modules_global通过这个简单的配置更改,我们将这个新目录位置设置为全局Node包的安装位置。此更改还在我们的主目录中创建了一个.npmrc文件。$npmconfiggetprefix/home/sitepoint/.node_modules_global$cat.npmrcprefix=/home/sitepoint/.node_modules_global我们仍然将npm安装在用户root拥有的位置。但是请注意,我们已经更改了配置中全局包安装的位置。我们需要再次安装npm,但这次是新用户所在的位置。当然,会安装最新版本的npm。$npminstallnpm--global└─┬npm@5.0.2├──abbrev@1.1.0├──ansi-regex@2.1.1....├──wrappy@1.0.2└──write-file-atomic@2.1.0最后,我们需要将.node_modules_global/bin添加到$PATH环境变量中,以便我们可以从命令行运行全局包。为此,您可以将以下行添加到您的.profile、.bash_profile或.bashrc文件并重新启动终端。exportPATH="$HOME/.node_modules_global/bin:$PATH"现在我们可以找到npm所在的目录了。node_modules_global/bin并使用适当的npm版本。$whichnpm/home/sitepoint/.node_modules_global/bin/npm$npm--version5.0.2在全局模式下安装包目前我们只有一个全局安装的包-那就是npm包本身。让我们安装UglifyJS包(一种JavaScript压缩工具)。我们使用--global标志,它也可以缩写为-g。$npminstalluglify-js--global/home/sitepoint/.node_modules_global/bin/uglifyjs->/home/sitepoint/.node_modules_global/lib/node_modules/uglify-js/bin/uglifyjs+uglify-js@3.0.15添加了4个包在5.836s的输出中可以看到,还安装了其他包,这些包是UglifyJS包的依赖。列出全局安装的包我们可以使用npmlist命令列出全局包。$npmlist--globalhome/sitepoint/.node_modules_global/lib├─┬npm@5.0.2│├──abbrev@1.1.0│├──ansi-regex@2.1.1│├──ansicolors@0.3.2│├──ansistyles@0.1.3.........└─┬uglify-js@3.0.15├─┬commander@2.9.0│└──graceful-readlink@1.0.1└──source-map@0.5.6但是,输出非常冗长。我们可以使用--depth=0选项进行优化。$npmlist-g--depth=0/home/sitepoint/.node_modules_global/lib├──npm@5.0.2└──uglify-js@3.0.15我们发现这更友好——只显示我们拥有的安装包及其版本号。我们可以从命令行使用任何全局安装的包。例如:以下命令显示了如何使用Uglify包将example.js压缩为example.min.js:$uglifyjsexample.js-oexample.min.js在本地模式下安装包在本地安装包时,通常package.json文件将用于安装。让我们创建这样一个文件。$npminitpackagename:(project)version:(1.0.0)description:demoofpackage.json入口点:(index.js)testcommand:gitrepository:keywords:author:license:(ISC)回车接受默认,然后输入yes确认。这将在项目的根目录下创建一个package.json文件。内容如下:{"name":"project","version":"1.0.0","description":"","main":"index.js","scripts":{"test":"echo\"Error:notestspecified\"&&exit1"},"author":"","license":"ISC"}提示:可以使用npminit--y命令生成package.jsoninafasterway除了main和scripts,文件的其他字段应该一目了然。main字段是程序的主要入口点,scripts字段允许您指定脚本命令以在程序包生命周期的不同时间运行。我们暂时不讨论这些东西,但如果你想了解更多关于它们的信息,请参阅《npm中的package.json文档》和《使用npm作为构建工具》。现在让我们安装下划线包。$npminstallunderscorenpm通知创建了一个锁文件作为package-lock.json。你应该提交这个文件。npmWARNproject@1.0.0没有描述npmWARNproject@1.0.0没有存储库字段。+underscore@1.8.3added1packagein0.344s注意这里创建了一个文件,我们会得到它之后。打开package.json文件,我们会看到文件中添加了dependencies字段:{..."dependencies":{"underscore":"^1.8.3"}}使用package.json来管理依赖您可以看到,underscorev1.8.3已安装到我们的项目中。版本号前面的(^)符号表示安装时npm会安装最高版本的包,npm也能找到唯一能匹配大版本的地方(除非有package-lock.json文件)).在我们的例子中,这是低于V2.0.0的所有版本。这种版本控制依赖项(major.minor.patch)的方法称为语义版本控制。您可以在《语义化版本控制:为什么你应该使用它?》文章中了解更多信息。另请注意,下划线被保存为dependencies字段的属性。对于运行应用程序所需的包(例如下划线),这是最近版本的npm中的默认值。也可以通过指定--save-dev标志将包保存为devDependency。devDependencies是用于开发目的的包,例如运行测试或解析代码。您还可以将private:true添加到package.json文件以防止意外发布私有存储库并防止在运行npminstall时生成所有警告。其实使用package.json指定项目依赖最大的好处就是可移植性。例如,当你克隆别人的代码时,你只需要在根目录下运行npmi,npm将解析并获取运行应用程序所需的所有包。我们稍后会再谈这个。在结束本节之前,让我们快速检查一下下划线是否正常工作。在项目根目录下创建一个名为test.js的文件,写入如下内容:const_=require('underscore');console.log(_.range(5));使用nodetest.js运行文件,你应该会看到[0,1,2,3,4]输出到屏幕。卸载本地安装的包npm是一个包管理器,所以它绝对可以卸载一个包。我们假设当前的underscore包导致了兼容性问题。我们可以卸载这个包并安装旧版本,如下所示:$npmuninstallunderscoreremoved2packagesin0.107s$npmlistproject@1.0.0/home/sitepoint/project└──(empty)安装特定版本的包我们通过使用@符号后跟版本号来安装下划线包的特定版本。$npminstallunderscore@1.8.2+underscore@1.8.2在1.574s添加了1个包$npmlistproject@1.0.0/home/sitepoint/project└──underscore@1.8.2updatedpackage让我们检查下划线包是否存在新版本:$npmoutdatedPackageCurrentWantedLatestLocationunderscore1.8.21.8.31.8.3projectCurrent列告诉我们当前安装的版本。Latest列告诉我们包的最新版本。Wanted列告诉我们可以在不破坏现有代码的情况下升级到的最新版本的包。还记得之前的package-lock.json文件吗?它是在npmv5中引入的,以确保安装在计算机上的所有项目的依赖项保持不变。它是在npm修改node_modules文件夹或package.json文件时自动生成的。如果你愿意,你可以继续尝试。删除node_modules文件夹并重新运行npmi。最新版本的npm将安装underscorev1.8.2(在package-lock.json文件中指定)。根据SemanticVersioning规范,v1.8.3将向后兼容早期版本。过去,包版本不一致是开发者头疼的问题。这个问题通常通过使用必须手动创建的npm-shrinkwrap.json文件来解决。现在,假设最新版本的underscore修复了我们之前提到的兼容性错误,我们想将包更新到那个版本。$npmupdateunderscore+underscore@1.8.3在0.236s更新了1个包$npmlistproject@1.0.0/home/sitepoint/project└──underscore@1.8.3提示:为了使上述命令正常工作,underscore必须被列为包.json依赖项。如果我们有更多过时的模块,我们也可以执行npm更新。搜索包我们在本教程中多次使用了mkdir命令。是否存在具有相同功能的软件包?让我们使用npmsearch命令看一下。$npm搜索mkdirNAME|说明|作者|日期|版本mkdir|目录创建...|=乔休伊特|2012-04-17|0.0.2fs-额外|fs-额外的内容...|1mkdirp|递归地mkdir,...|=子堆栈|2015-05-14|0.5.1...这是一个mkdirp包,让我们安装它。$npminstallmkdirp+mkdirp@0.5.1在3.357s中添加了2个包创建mkdir.js文件并复制粘贴此代码:constmkdirp=require('mkdirp');mkdirp('foo',function(err){if(err)console.error(err)elseconsole.log('Directorycreated!')});从终端运行这个文件:$nodemkdir.jsDirectorycreated!重新安装项目依赖我们先安装一个包:$npminstallrequest+request@2.81.0added54packagesin15.92s查看package.json文件。"dependencies":{"mkdirp":"^0.5.1","request":"^2.81.0","underscore":"^1.8.2"},注意依赖列表会自动更新。在以前的npm版本中,您必须执行npminstallrequest--save以将依赖项保存在package.json中。如果你想安装一个包而不将它保存在package.json中,只需使用--no-save参数。假设您将项目源代码克隆到另一台计算机,现在需要安装依赖项。我们先删除node_modules文件夹,执行npminstall。$rm-Rnode-modules$npmlistproject@1.0.0/home/sitepoint/project├──未满足的依赖mkdirp@^0.5.1├──未满足的依赖请求@^2.81.0└──未满足的依赖下划线@^1.8.2npm错误!缺少:mkdirp@^0.5.1,需要project@1.0.0npmERR!缺少:request@^2.81.0,project@1.0.0npm需要,错误!missing:underscore@^1.8.2,requiredbyproject@1.0.0$npminstalladded57packagesin1.595s注意node_modules文件夹,你会发现它已经重新创建了。像这样,您可以轻松地与他人共享您的代码,而不会膨胀您的项目和源依赖项存储库。管理缓存当npm安装包时,它实际上保留了一份副本。因此,下次安装此软件包时,您无需再次连接到Internet。这些副本缓存在您主路径的.npm目录中。$ls~/.npmanonymous-cli-metrics.json_cacache_locksnpmregistry.npmjs.org这个目录会随着时间的推移变得混乱,所以有时清理一下。如果要清理系统上的多个Node项目,$npmcacheclean还可以从工作区中清除所有node_module文件夹。寻找。-name"node_modules"-typed-execrm-rf'{}'+alias您可能已经注意到,有多种方法可以运行npm命令。以下是一些常用npm别名的简要列表:npmi
