按Enter接受默认值,然后键入yes确认。这样将会在项目的根目录下创建一个package.json文件。内容如下:
{ "name": "project", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" }提示:你可以使用npm init --y命令以更快的方式生成package.json文件
除了main和scripts外,其他字段应该是一目了然的。main字段是你程序的主入口,scripts字段允许你指定在包的生命周期中的不同时间运行的脚本命令。我们暂时不讨论这些东西,但是如果你想了解更多相关信息,请参阅《npm中的package.json文档》和《使用npm作为构建工具》。
现在让我们来安装underscore包。
$ npm install underscore npm notice created a lockfile as package-lock.json. You should 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将安装最高版本的包,npm还可以找到主版本可以匹配的唯一位置(除非存在package-lock.json文件)。在我们的例子中,这是V2.0.0版本以下的所有版本。版本控制依赖(major.minor.patch)的这种方法被称为语义化版本控制。你可以在《语义化版本控制:为什么你应该使用它?》文章中了解更多相关知识。
还要注意,underscore被保存为dependencies字段的属性。这是最新版本npm的默认设置,用于运行应用程序所需的包(如underscore)。也可以通过指定--save-dev标志将包保存为devDependency。devDependencies是用于开发目的的包,例如运行测试或解析代码。
你也可以给package.json文件添加private: true以防止意外发布私有仓库并且阻止所有运行npm install时生成的警告。
其实使用package.json指定项目依赖的最大好处是可移植性。例如,当你克隆别人的代码时,你只需要在根目录运行npm i即可,然后npm将解析并获取所有运行该应用程序必需的包。稍后我们再来看这个。
在结束此部分内容之前,我们快速检查一下underscore是否正在工作。在项目根目录下创建名为test.js的文件并写入下列内容:
const _ = require('underscore'); console.log(_.range(5));使用node test.js运行文件,你应该看到[0, 1, 2, 3, 4]输出到了屏幕。
卸载本地安装包npm是一个包管理器,所以它肯定可以卸载一个包。我们假设当前的underscore包导致了兼容性问题。我们可以卸载这个包并安装旧版本,如下所示:
$ npm uninstall underscore removed 2 packages in 0.107s $ npm list project@1.0.0 /home/sitepoint/project └── (empty) 安装特定版本的包我们通过使用@符号加一个版本号来安装特定版本的underscore包。
$ npm install 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 Package Current Wanted Latest Location underscore 1.8.2 1.8.3 1.8.3 projectCurrent列告诉我们当前安装的版本。Latest列告诉我们包的最新版本。 Wanted列告诉我们在不破坏现有的代码的前提下可以升级到的最新版本的包。
还记得之前的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包,我们来安装它。
$ npm install 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 Directory created! 重新安装项目依赖我们先安装一个包:
$ npm install 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参数。