NPM是Node.js官方的包管理工具。这篇文章将向你展示所有你需要了解它的重要事情,以便有效地使用它。
NPM是Node.js包管理工具,通过Node.js捆绑安装。它跟踪你的Node.js项目中的所有包依赖,让你能完全控制管理它们。
NPM使现有的成千上万的开源代码(软件包)重用变得很容易,解决了大量的常见问题,而且可以通过注册NPM在社区分享自己的代码。
由于JavaScript现在正在作为客户端和服务器端代码被同时使用,有很多不同的包:一些服务端的,一些命令行程序,还有一些是专为前端开发的。所有这些包都列在NPM官方网站和NPM注册表中,这个数据库包含所有可用的开源软件包。
本教程介绍你能用它做什么和NPM的常用命令。
初始化一个项目
当你利用Node.js开始一个新项目时,你需要创建一个package.json
文件。它是跟踪依赖关系的清单文件,它为项目提供一些元数据,并且可以选择性地定义一些项目特定的任务从命令行中执行。
如果你已经安装了Node.js,NPM命令将可用。要检查是否已安装只需运行:
1 | npm -v |
您可以手动创建package.json
文件或命令行交互方式创建它。这一过程将指导您完成一些关于该项目的常见问题,让你预览该文件,然后生成它。
1 | $ mkdir ~/myproject |
注意:如果你不希望把它存储在一个实际的库中,可以标记应用程序为私有,通过在package.json中添加的“私有”属性:
1 | "private": true |
官方文档提供了一个很好的package.json
中所有可用的属性概述。我们会触及一些最有用的。
你也可以查看一个完整的package.json
的例子。
安装依赖
你可以找到超过100,000个项目在NPM官方网站,它们按照由不同的标准排名。一个常见的排序方法是检测一个包是否积极维护。
您还可以通过命令行搜索包:
1 | npm search <search term> |
你可以通过运行命令在默认浏览器中访问该包的主页:
1 | npm home <package name> |
本地安装
现在你有一个package.json
,你可以添加一个依赖部分列出你需要的一切:
1 | "dependencies": { |
要安装的package.json
中列出的所有的包和它们的依赖,切换到项目目录并运行安装命令,这将创建一个node_modules
目录,并下载所有包:
1 | npm install |
你也可以安装新的包并记录它们,通过终端运行:
1 | npm install --save <package name> |
一些其他有用的选项:
- 卸载包并将其从
package.json
中删除:npm uninstall --save <packagename>
- 直接从git版本库安装:
npm install git://github.com/mrfoo/mypackage.git
- 安装指定版本的包:
npm install somepackage@1.1.0 or npm install somepackage@latest
重要的是要注意,上述方法将会在本地安装包,这意味着它们将被存储并且只能在这个项目中使用。这是好的,因为它允许每个项目定义模块,区分它们的特定版本,并单独下载。
全局安装
安装包的另一个方法是全局安装。它通常被用来提供的命令行功能, 比如 grunt
,bower
and yo
。
例如,全局安装 JSHint ,切换 root 权限运行安装命令加’-g’ 参数:
1 | sudo npm install -g jshint |
JShint现在应该作为一个全局安装的包,可以从任何地方在终端中 jslint 一个JavaScript文件。
1 | jshint hello.js |
这是不建议每一个包都要全局安装。这种方法主要用于命令行实用程序。
管理依赖
NPM允许你管理你的项目中包的依赖关系和需要的版本。开源项目通常快速迭代,并伴随着版本频繁更新。你可以通过控制package.json
文件中哪些类型的需要更新来达到控制项目得目的。
NPM使用 语义化版本,传达什么样的变化是在发布实施影响代码的稳定性标准。
一个发行版本通常包含三个元素:
- 主版本号:当你做了不兼容的 API 修改, 例如: 2.0.0
- 次版本号:当你做了向下兼容的功能性新增, 例如:1.1.0
- 修订号:当你做了向下兼容的问题修正, 例如:1.0.1
设置包版本
假设你开始利用某些版本的包做开发。你可以通过指定接受更新的范围得方法,更新这些包的版本,并保持兼容性。
1 | "dependencies": { |
更详细的方法查阅NPM语义版本文档。
确保遵循最佳实践和补丁版本的包,使您的代码不会出现意外。
注意:如果你不确定使用哪个版本,只是添加*
,运行 npm update –save。它将安装模块并改变*
按照^
安装版本,允许轻微修改和补丁更新。
升级包
要查看所有本地安装的包列表,可以使用ls
命令,并添加 -l
参数用来简短描述 和--depth=0
用来简洁层级(如果你希望看到全局安装的包列表,增加 -g
参数):
要检查哪些包可以在本地和全局更新,分别运行:1
2npm outdated
npm outdated -g --depth=0
要升级到可以接受的最高版本只在本地运行(在全局范围内更新只需要添加-g
标示,并以root身份运行):1
npm update
如果你从package.json删除了一个包,并想从node_modules目录中将它删除,只需要执行修剪命令:
1 | npm prune |
要升级NPM本身则需要再次安装它作为一个全局的模块。
1 | sudo npm install -g npm@latest |
你甚至可以更新Node.js和NPM本身通过安装一个特殊的模块 n,运行它可以在稳定版本和开发版中切换。
1 | sudo npm install n -g |
你可以只运行NPM来获取所有可用的命令列表和帮助,或咨询官方网站的文档。
设置NPM脚本
NPM有一个内置的 run-script
命令(简写 npm run
)。它的工作原理类似于一个操作系统中的别名。
将“别名”定义为脚本对象中的一个属性,该属性将在操作系统的默认shell中执行该属性的值。
你确定你在package.json中有类似这样自定义脚本(假设你已经列出并安装必要的依赖):
1 | "scripts": { |
如果我们现在在终端中运行npm run lint
,它将同我们执行jshint **.js
具有相同的效果。这使得脚本属性编程非常灵活,链接命令调用其他模块(使用系统命令或其他程序),就像你会做在一个普通的shell脚本。
NPM有一些快捷命令可以使用:npm test
, npm start
, npm stop
and npm restart
.
如果我们运行 npm test
和我们在系统默认的shell 中执行 npm run-script test
,或 npm run test
是一样的,即语法糖。
Start scripts 通常定义Node.js启动的主文件 app.js “start”: “node app.js”。
当我们运行npm run lint
(或任何其他自定义脚本属性)NPM也同时运行pre- (前置) 和 post-(后置)hook函数这样的命令:npm run prelint
,npm run postlint
。这给了我们一个机会来编写控制命令之前和之后发生的事情。
通过配置脚本你甚至可以消除对构建工具比如Grunt或Gulp这类的需求。你可以查看一篇关于如何使用NPM作为一个构建工具。
Development only dependencies
您可以添加属性分别列出依赖,它仅用于开发:1
2
3devDependencies : {
"packageX": "*"
}
devDependencies
是在开发过程中使用的一个包,像单元测试,linting、minification和similar。在大多数情况下,如果你是一个包的最终用户,你只需要 dependencies
。
默认情况下,当你运行在项目目录运行 npm install
安装的dependencies以及devdependencies(它假定你是在源目录,所以你必须开发者)。
如果您添加 --production
,它将安装 dependencies
1 | npm install --production |
如果你 npm install
为了在终端安装程序包后并将其添加到package.json下devDependencies中,加上–save-dev的标示。
1 | npm install --save-dev <package> |
Stackoverflow提供了一个很好的说明 dependencies
和devDependencies
之间的区别。
发布 Node.js 包
因为每个包仅仅是一个的package.json文件和其他一些文件的目录,你可以打包项目,与社区共享和协作。
首先,你需要在NPM注册表注册账号,并提供用户名,密码和电子邮件地址。
1 | npm adduser |
现在你有了一个帐户,到待发布项目的根目录执行:
1 | npm publish |
总结
NPM使得包易于安装,管理和发布。你通过创建一个package.json文件,列出所有的依赖和需要安装的包来开始一个新项目。对于命令行工具则需要在全局安装。
当您定期检查更新,增加新的依赖,并编写自定义脚本。你也可以将你的依赖分类成devDependencies和dependencies用以区分生产和开发环境。
完成后您可以在NPM注册表发布自己的项目供他人使用。
原文地址:https://semaphoreci.com/community/tutorials/npm-node-js-package-manager