首页
技术分享
实用工具 发布文章 新浪微博 Github

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ mkdir ~/myproject
$ cd ~/myproject
$ npm init
name: (a) myapp
version: (1.0.0)
description: A very cool app
entry point: (index.js)
test command:
git repository:
keywords:
author: mrfoo@acme.com
license: (ISC)
About to write to /home/mrfoo/myproject/package.json:

{
"name": "myapp",
"version": "1.0.0",
"description": "A very cool app",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Mr Foo <mrfoo@acme.com>",
"license": "ISC"
}

Is this ok? (yes)

注意:如果你不希望把它存储在一个实际的库中,可以标记应用程序为私有,通过在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
2
3
4
5
"dependencies": {
"express": "*",
"grunt": "*",
"bower": "*"
}

要安装的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
2
3
4
5
6
7
8
9
10
11
12
"dependencies": {
"package1": "1.0.0", // 只接受1.0.0版本
"package2": "1.0.x", // 版本1.0的补丁版本
"package3": "*", // 最新版本,不推荐
"package4": ">=1.0.0", // 1.0.0 版本后的
"package5": "<1.9.0", // 1.9.0 版本前的
"package6": "~1.8.0", // >= 1.8.0 < 1.9.0
"package7": "^1.1.0", // >=1.1.0 < 2.0.0
"package8": "latest", // 最新版本的标签名称
"package9": "", // 同 * 最新版本
"packageX": "<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0"
}

更详细的方法查阅NPM语义版本文档

确保遵循最佳实践和补丁版本的包,使您的代码不会出现意外。

注意:如果你不确定使用哪个版本,只是添加* ,运行 npm update –save。它将安装模块并改变*按照^安装版本,允许轻微修改和补丁更新。

升级包

要查看所有本地安装的包列表,可以使用ls命令,并添加 -l 参数用来简短描述 和--depth=0用来简洁层级(如果你希望看到全局安装的包列表,增加 -g 参数):

要检查哪些包可以在本地和全局更新,分别运行:

1
2
npm 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
2
sudo npm install n -g 
sudo n stable

你可以只运行NPM来获取所有可用的命令列表和帮助,或咨询官方网站的文档

设置NPM脚本

NPM有一个内置的 run-script 命令(简写 npm run)。它的工作原理类似于一个操作系统中的别名。

将“别名”定义为脚本对象中的一个属性,该属性将在操作系统的默认shell中执行该属性的值。

你确定你在package.json中有类似这样自定义脚本(假设你已经列出并安装必要的依赖):

1
2
3
4
"scripts": {
"lint": "jshint **.js",
"test": "mocha test/"
}

如果我们现在在终端中运行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 prelintnpm run postlint。这给了我们一个机会来编写控制命令之前和之后发生的事情。

通过配置脚本你甚至可以消除对构建工具比如Grunt或Gulp这类的需求。你可以查看一篇关于如何使用NPM作为一个构建工具

Development only dependencies

您可以添加属性分别列出依赖,它仅用于开发:

1
2
3
devDependencies : {
"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提供了一个很好的说明 dependenciesdevDependencies之间的区别

发布 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