17611538698
webmaster@21cto.com

Node Package Manager – NPM入门指南

资讯 0 2209 2018-03-12 12:02:35

21CTO社区导读:Node.js与NPM越来越经常使用,除了使用Node.js开发服务器程序,另外React/React Native、Electron等都需要安装和管理NPM。所以管理好NPM可以让开发者在安装和调试环境时事半功倍。本文略长,大概需要30分钟阅读,欢迎发表评论。



1.png

 
Node.js是在服务器端JavaScript应用程序。 它是建立在Google V8 JavaScript运行环境之上的,使用C ++编写,因此,它的运行速度很快。 
 
最开始,它的目的是作为应用程序的服务器环境,后来不少开发者用它来创建本地任务自动化工具。 从此以后,一个全新的基于Node的工具(如Grunt , Gulp和Webpack )生态系统已经发展到改变前端开发的情况。
为了在Node.js中使用这些工具或包,我们需要能够以有用的方式安装和管理它们。 这就是Node Package Manager引入的原因,它帮助我们安装想要使用的包,并提供一个有用的界面来处理。
在本篇文章中,我们将介绍使用npm的基础知识,将向您展示如何以本地和全局模式安装软件包,以及删除,更新和安装软件包的特定版本。 还有一个重点是如何使用package.json来管理项目的依赖关系。 
在开始使用npm之前,我们首先必须在我们的系统上安装Node.js。 现在我们开始。
 
安装Node.js

前往Node.js (下载页面:https://nodejs.org),并获取需要的版本。 有Windows和Mac安装程序可用,以及预编译的Linux二进制文件和源代码。 对于Linux,您也可以通过软件包管理器来安装Node, 如下所述 。
在撰写本文时,我使用的v6.10.3 Stable,这是Node的当前长期支持(LTS)版本 。(目前的Node版本为8.9.4)
安装完成后,我们使用以下命令查看安装的Node版本。
 $ which node
 /usr/bin/node
 $ node --version v6.10.3
要验证您的安装是否成功,我们试试Node的REPL。
 $ node
 >console.log('Node is running');
Node isrunning
 > .help
.breakSometimes you get stuck, this gets you out
.clearAlias for .break
.exitExit the repl
.helpShow repl options
.loadLoad JS from a file into the REPL session
.saveSave all evaluated commands in this REPL session to a file
 > .exit
到目前为止,Node.js的安装工作已经完毕,所以我们现在可以把注意力集中在安装时已经包含的npm上。
 $ whichnpm
 /usr/local/bin/npm
 $ npm –version
 3.10.10

Node


npm可以私有本地或全局模式安装软件包。 在本地模式下,它将软件包安装项目目录的一个名叫node_modules文件夹中,该位置由当前用户所有。 全局模式安装的软件包安装在由根目录中(其中{prefix}通常是/usr/或/usr/local )拥有的{prefix}/lib/node_modules/中。 这意味着我们不得不用sudo来全局安装软件包,这可能会在解决第三方依赖性时导致权限错误,同时也面临安全问题。
让我们改变它:
2.jpg

花很多时间管理软件包

更改全局安装包位置


让我们看看npm config的输出。
 $ npm config list ;
cliconfigs user-agent ="npm/3.10.10 node/v6.10.3 linux x64"; userconfig/home/sitepoint/.npmrc prefix ="/home/sitepoint/.node_modules_global";
node binlocation = /usr/bin/nodejs
 ; cwd = /home/sitepoint
 ; HOME = /home/sitepoint
 ;"npm config ls -l" to show all defaults.
这个指令给了我们关于安装的详细信息,现在获取当前Node.js的全局位置非常重要。
 $ npm config get prefix /usr
这是我们想要改变的路径,以便在主目录中安装全局软件包。 要做到这一点,先在主文件夹中创建一个新目录。
 $ cd ~ &&mkdir.node_modules_global
$ npm config set prefix=$HOME/.node_modules_global
通过这个简单的配置更改,我们改变了安装全局节点包的位置。 这也会在我们的主目录中创建一个.npmrc文件。
$ npm config get prefix/home/sitepoint/.node_modules_global $ cat .npmrc prefix=/home/sitepoint/.node_modules_global
我们仍然在npm所拥有的位置安装npm。 但是因为我们改变了我们的全局包的位置,可以利用这一点。 需要再次安装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并重新启动终端来完成此操作。
 export PATH="$HOME/.node_modules_global/bin:$PATH"
现在我们的.node_modules_global/bin将被首先找到,并且会使用正确版本的npm。
 $ whichnpm
 /home/sitepoint/.node_modules_global/bin/npm
 $ npm--version 5.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.15added 4 packages in 5.836s
正如你从输出中看到的那样,安装了额外的软件包 - 这些都是UglifyJS的依赖。

列出全局件包


我们可以使用npm list命令npm list我们安装的全局包。
 $ npm list –global
home/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选项来改变它。
 $ npm list -g --depth=0
 /home/sitepoint/.node_modules_global/lib
 ├── npm@5.0.2
 └── uglify-js@3.0.15
这样会更好,只显示我们安装的软件包和版本号即可。
任何安装在全局的软件包都可以通过命令行使用。 例如,以下是如何使用Uglify包将example.js缩小为example.min.js :
 $ uglifyjs example.js -o example.min.js

以本地模式安装件包


在本地化安装软件包时,通常使用package.json文件进行安装。 我们继续创建一个。
 $ npm init
packagename: (project)
version:(1.0.0)
description:Demo of package.json
entrypoint: (index.js)test
command:git
repository:
keywords:
author:license: (ISC)
按Enter接受默认值,然后输入yes确认。 这会在项目的根目录下创建一个名为package.json文件。
 {
   "name":"project",
   "version":"1.0.0",
   "description":"",
   "main":"index.js",
   "scripts":{
  "test":"echo \"Error: notest specified\" && exit 1"
   },
   "author":"",
   "license":"ISC"
}
如果你想更快地生成一个package.json文件,可以使用:
npm init --y
main字段是程序的主入口,而scripts字段允许您指定在包的生命周期中的不同时间运行的脚本。我们现在可以保留它们,想了解更多信息,请参阅npm上的package.json文档以及使用npm作为构建的文章。
现在让我们尝试安装Underscore 。
 $ npm install underscore
npm notice created a lockfile aspackage-lock.json.
Youshould commit this file. npm WARN project@1.0.0 No description npm WARN project@1.0.0 No repository field.
 + underscore@1.8.3 added 1 package in 0.344s
请注意,锁定文件已创建。 现在,我们再看package.json会看到添加了dependencies字段:
 {..."dependencies":{"underscore":"^1.8.3"}}

使用package.json管理包依关系


正如您所看到的,Underscore v1.8.3被安装在我们的项目中。 版本号前面的插入符号( ^ )表示在安装时,npm会提取最高版本的软件包,并且主版本必须匹配(除非package-lock.json文件存在)。 在我们的情况下,任何低于v2.0.0的匹配都不会被安装。 这种版本依赖关系(major.minor.patch)的方法被称为版本语义化。 
另外请注意,Underscore被保存为dependencies字段的属性。 这已成为npm最新版本的默认设置,并且用于应用程序运行所需的软件包(如Underscore)。 也可以通过指定一个--save-dev标志将一个包保存为devDependency 字段。 devDependencies是用于开发目的的软件包,例如用于运行测试或转译代码。
我们还可以为package.json添加private:true以防止意外发布私有存储库,并抑制运行npminstall时输出警告信息。
到目前为止,使用package.json指定项目依赖关系的最大原因是可移植性。 例如,当你克隆别人的代码时,你所要做的就是在项目的根目录下运行npm i ,npm将解析并获取所有必要的包来运行应用程序。 我们稍后会更详细地介绍这一点。
在完成本节之前,让我们快速检查下划线工作。 在项目根目录下创建一个名为test.js的文件,并添加以下内容:
 const _ =require('underscore'); console.log(_.range(5));
使用node test.js运行文件,你应该看到[0, 1, 2,3, 4]输出到屏幕上。

本地件包


npm是一个软件包管理器,能安装就能删除一个软件包。 
假设当前的Underscore包导致我们兼容性问题。 我们可以删除软件包并安装旧版本,如下所示:
 $ npm uninstall underscore
removed2 packages in 0.107s
$ npm list project@1.0.0
/home/sitepoint/project
 └── (empty)

安装指定包版本


我们可以安装想要的Underscore包版本。可以通过使用@符号来追加版本号。如下命令:
 $ npminstall underscore@1.8.2
 + underscore@1.8.2 added 1 package in 1.574s
 $ npm list project@1.0.0
 /home/sitepoint/project
 └── underscore@1.8.2

更新件包


让我们检查一下Underscore包是否有更新:
 $ npm outdated
PackageCurrent Wanted Latest Location
 underscore 1.8.2 1.8.3 1.8.3 project
“ Current”列显示了本地安装的版本。 最新专栏告诉我们该软件包的最新版本。 而“ Notice”专栏告诉我们可以升级到最新版本的包,而不会破坏我们现有的代码。如果没有提示表示当前为最新版本。
还记得早些时候的package-lock.json文件吗? 这是在npm v5中引入的,这个文件目的是为了确保项目安装的所有机器上的依赖关系保持不变。 它会自动生成npm修改node_modules文件夹或package.json文件的任何操作。
如果您喜欢,可以继续尝试删除node_modules文件夹,之后重新运行npm i。 最新版本的npm将安装Underscore v1.8.2(因为这是在package-lock.json文件中指定的)。 由于语义版本的规则,较早的版本将在v1.8.3中引入。 在过去,不一致的软件包版本已经被证明是开发人员非常头疼的事情。 这一般是通过使用必须手动创建的npm-shrinkwrap.json文件来解决的。
现在让我们假设最新版本的Underscore修复了之前的错误,并且想要将我们的软件包更新到该版本。
 $ npm update underscore
 + underscore@1.8.3 updated 1 package in 0.236s
 $ npm list project@1.0.0
 /home/sitepoint/project
 └── underscore@1.8.3
提示 :为此,Underscore须被列为package.json的依赖项。 如果我们有很多过期的模块需要更新,我们也可以执行npm update 更新。

搜索包


我们在本教程中多次使用了mkdir命令。 想知道有没有一个节点的包相同? 让我们来用npm search 。
 $ npm search mkdir
NAME | DESCRIPTION | AUTHOR | DATE | VERSION
mkdir| Directory crea… |=joehewitt | 2012-04-17 | 0.0.2
fs-extra| fs-extra conta… |=jprichardson… | 2017-05-04 | 3.0.1
mkdirp | Recursively mkdir,… |=substack | 2015-05-14 | 0.5.1 ...
我们发现有( mkdirp ), 来安装它。
 $ npminstall mkdirp
 + mkdirp@0.5.1
 added 2 packages in 3.357s
现在创建一个文件mkdir.js并且复制粘贴这段代码:
 const mkdirp =require('mkdirp');
mkdirp('foo',function(err){
 if(err) console.error(err)
   else console.log('Directory created!')
 });
然后从终端运行它:
 $ node mkdir.js
Directorycreated!

重新安装目依赖项


首先,我们先安装一个包:
 $ npminstall request
 + request@2.81.0 added 54 packages in 15.92s
接下来检查package.json 文件:
 "dependencies":{
   "mkdirp":"^0.5.1",
   "request":"^2.81.0",
   "underscore":"^1.8.2"
},
请注意,依赖项列表会自动更新。 在以前的npm版本中,我们必须执行npm install request --save - 保存package.json的依赖关系。 如果只想安装一个软件包而不保存到package.json中 ,只需使用--no-save参数。
假设您已经将项目源代码克隆到另一台机器,并且想要安装依赖关系。 
需要先删除node_modules文件夹,然后执行npminstall
 $ rm -R node-modules
 $ npm list
 project@1.0.0 /home/sitepoint/project
 ├── UNMET DEPENDENCY mkdirp@^0.5.1
 ├── UNMET DEPENDENCY request@^2.81.0
 └── UNMET DEPENDENCY underscore@^1.8.2
npm ERR!missing: mkdirp@^0.5.1, required by project@1.0.0
npm ERR!missing: request@^2.81.0, required by project@1.0.0
npm ERR!missing: underscore@^1.8.2, required by project@1.0.0
$ npminstall added 57 packages in 1.595s
我们再看node_modules文件夹,会发现它已经被重新创建。通过这种方式,您可以轻松地与其他人分享代码,而不会使您的项目源代码库充满硬依赖。

管理


当使用npm安装一个软件包时,它会保留一份副本,当下一次想再次安装这个软件包时,就不需要访问网络。 这个缓存副本保存在主路径的.npm目录中。
 $ ls ~/.npm
anonymous-cli-metrics.json_cacache _locks npm registry.npmjs.org
随着时间推移,这个目录会随着旧的软件包变得混乱,所以偶尔去清理它是很有用的。我们使用如下命令:
 $ npm cache clean
[size=20]如果系统上有多个要清理的节点项目,也可以从工作区清除所有的node_module文件夹。[/size]
 find. -name "node_modules" -type d -exec rm -rf '{}' +


也许您可能留意到了,有多种运行npm命令的方法。 以下是一些常用npm别名的简明列表:
·      npm i  - 安装本地软件包
·      npm i -g  - 安装全局软件包
·      npm un  - 卸载本地软件包
·      npm up - npm更新软件包
·      npm t - 运行测试
·      npm ls - 列出已安装的模块
·      npm ll或npm la - 在列出模块时打印附加包的信息
 
您可以像这样一次安装多个软件包:
 $ npm i express momemt lodash mongoosebody-parser webpack
如果你想学习所有常见的npm命令,只需执行npm help来获得完整列表。

版本管理器


有几个工具可以让您在同一台机器上管理多个版本的Node.js。 
一个称为交互式管理工具是n(https://github.com/tj/n) 。另一个称为版本节点管理器的工具nvm (https://github.com/creationix/nvm.git)。
相关的说明可参考markdown文档。

小结


在本教程中,我们共同了解了使用npm的基础知识,我们演示了如何下载安装Node.js,如何改变全局包的位置(这样可以避免使用sudo和权限问题 )以及如何在本地和全局模式下安装软件包。 余下我们还介绍了删除,更新和安装特定版本的软件包,以及管理项目的依赖关系。 
随着更高版本的发布,npm在前端开发领域迈出了巨大的步伐。 根据其首席运营官的说话,npm用户群正在发生变化,大部分使用者并没有使用它来编写node。 相反,它正成为人们用来将JavaScript放在一起的工具(可以用它来安装任何东西),继而成为编写现代JavaScript不可分割的一部分。
您在项目中使用了npm吗? 如果没有,现在是开始的好时机。
 

作者:Peter Dierx
编译:21CTO社区 - 亢小龙
来源:https://www.sitepoint.com/begi ... ager/


评论