一份关于npm的新手指南

Node.js使得在服务器端使用JavaScript编写应用程序成为可能。它是基于V8Javascript运行时并且使用C++编写的,所以它的速度很快。最初,它旨在作为应用程序的服务器环境,但是开发人员使用它创建工具来帮助他们进行本地任务自动化。从那时起,一个全新的基于Node的工具生态系统(如Grunt,Gulp和Webpack)彻底改变了前端开发的面貌。

为了在Node.js中使用这些工具(或者包),我们需要能够以有效的方式安装和管理它们。这就是我们即将要讨论的:npm–Node的包管理器。它负责安装你需要使用的包,并且提供一个有用的界面让你与它们交互。

在本文中,我将介绍使用npm的基础知识。我将向你演示如何在本地和全局模式下安装包,以及删除,更新和安装某个版本的包。我还会告诉你如何使用package.json处理项目的依赖。如果你更喜欢看视频,请注册SitePoint Premium观看我们的免费录屏:什么是npm以及如何使用?。
在开始使用npm之前,首先需要在电脑中安装Node.js。

安装Node.js

去Node.js 下载页面获取你需要的版本。可以获得Windows和Mac环境的安装包和预编译的Linux二进制文件以及源代码。对于Linux环境,你还可以通过包管理器来安装Node,如这里所述。
本教程我们将使用v6.10.3稳定版本。在编写本文时,这是Node的当前长期支持(LTS)版本。
提示: 你也可以考虑使用版本管理器来安装Node。这将消除下面提出的权限问题。
我们来看一下Node的安装位置以及版本。
whichnode/usr/bin/node w h i c h n o d e / u s r / b i n / n o d e node –version
v6.10.3
使用Node的REPL(交互式解释器)检查安装是否成功。
$ node

console.log(‘Node is running’);
Node is running
.help
.break Sometimes you get stuck, this gets you out
.clear Alias for .break
.exit Exit the repl
.help Show repl options
.load Load JS from a file into the REPL session
.save Save all evaluated commands in this REPL session to a file
.exit
Node.js已经安装成功,现在我们可以把注意力集中在npm上,npm已经集成在上述安装的Node.js中。
whichnpm/usr/bin/npm w h i c h n p m / u s r / b i n / n p m npm –version
3.10.10
Node包模块
npm可以以本地或全局模式安装包。在本地模式下,将包安装在父工作目录中的node_modules文件夹中。该位置由当前用户所拥有。安装在{prefix}/lib/node_modules/中的全局包由根目录所拥有({prefix}通常是/usr/或 /usr/local)。这意味着你将不得不使用sudo全局安装包,这可能会在解决第三方依赖时导致权限错误,也可能导致安全问题。下面让我们更改一下:
更改全局包的位置
让我们看看运行npm config list输出了什么:
npmconfiglist;cliconfigsuseragent=npm/3.10.10node/v6.10.3linuxx64;userconfig/home/sitepoint/.npmrcprefix=/home/sitepoint/.nodemodulesglobal;nodebinlocation=/usr/bin/nodejs;cwd=/home/sitepoint;HOME=/home/sitepoint;npmconfiglsltoshowalldefaults.npm n p m c o n f i g l i s t ; c l i c o n f i g s u s e r − a g e n t = “ n p m / 3.10.10 n o d e / v 6.10.3 l i n u x x 64 ” ; u s e r c o n f i g / h o m e / s i t e p o i n t / . n p m r c p r e f i x = “ / h o m e / s i t e p o i n t / . n o d e m o d u l e s g l o b a l ” ; n o d e b i n l o c a t i o n = / u s r / b i n / n o d e j s ; c w d = / h o m e / s i t e p o i n t ; H O M E = / h o m e / s i t e p o i n t ; “ n p m c o n f i g l s − l ” t o s h o w a l l d e f a u l t s . 输 出 给 了 我 们 有 关 n p m 的 安 装 信 息 。 现 在 , 重 要 的 是 获 取 当 前 的 全 局 位 置 。 npm config get prefix
/usr
为了在主目录中安装全局包,我们需要更改这个前缀。为此,你可以在主文件夹中创建一个新目录。
cd ~ && mkdir .node_modules_global cd ~ && mkdir .node_modules_global npm config set prefix= HOME/.nodemodulesglobalNode.npmrc H O M E / . n o d e m o d u l e s g l o b a l 通 过 这 个 简 单 的 配 置 更 改 , 我 们 将 位 置 更 改 为 全 局 N o d e 包 安 装 的 位 置 。 这 个 更 改 同 时 会 在 我 们 的 主 目 录 中 创 建 了 一 个 . n p m r c 文 件 。 npm config get prefix
/home/sitepoint/.node_modules_global
cat.npmrcprefix=/home/sitepoint/.nodemodulesglobalnpmnpmnpm c a t . n p m r c p r e f i x = / h o m e / s i t e p o i n t / . n o d e m o d u l e s g l o b a l 我 们 仍 然 将 n p m 安 装 在 由 根 目 录 所 有 的 位 置 。 但 是 要 注 意 我 们 已 经 在 配 置 中 改 变 了 全 局 包 安 装 的 位 置 。 我 们 需 要 再 次 安 装 n p m , 但 是 这 一 次 是 安 装 在 新 用 户 所 在 的 位 置 。 当 然 , 安 装 的 将 是 n p m 的 最 新 版 本 。 npm install npm –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.bashprofile.bashrcexportPATH= P A T H 环 境 变 量 中 , 以 便 可 以 从 命 令 行 运 行 全 局 包 。 为 了 做 到 这 一 点 , 你 可 以 把 下 面 这 一 行 添 加 到 . p r o f i l e , . b a s h p r o f i l e 或 者 . b a s h r c 文 件 中 并 重 新 启 动 终 端 。 e x p o r t P A T H = ” HOME/.node_modules_global/bin: PATHnpm.nodemodulesglobal/bin使npm P A T H ” 现 在 我 们 可 以 找 到 n p m 的 所 在 目 录 . n o d e m o d u l e s g l o b a l / b i n 并 且 使 用 合 适 的 n p m 版 本 。 which npm
/home/sitepoint/.node_modules_global/bin/npm
npmversion5.0.2npmUglifyJSJavaScript使globalg n p m – v e r s i o n 5.0.2 在 全 局 模 式 下 安 装 包 目 前 我 们 只 有 一 个 安 装 在 全 局 的 包 − 那 就 是 n p m 包 本 身 。 下 面 我 们 来 安 装 U g l i f y J S 包 ( 一 个 J a v a S c r i p t 的 压 缩 工 具 ) 。 我 们 使 用 – g l o b a l 标 记 , 也 可 以 缩 写 为 − g 。 npm install uglify-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
added 4 packages in 5.836s
从输出可以看出,还安装了其他包, 这些包都是UglifyJS包的依赖项。
列出全局安装包
我们可以使用npm list命令列出全局包。
npmlistglobalhome/sitepoint/.nodemodulesglobal/libnpm@5.0.2abbrev@1.1.0ansiregex@2.1.1ansicolors@0.3.2ansistyles@0.1.3..uglifyjs@3.0.15commander@2.9.0gracefulreadlink@1.0.1sourcemap@0.5.6使depth=0 n p m l i s t – g l o b a l h o m e / s i t e p o i n t / . n o d e m o d u l e s g l o b a l / l i b ├ ─ ┬ n p m @ 5.0.2 │ ├ ─ ─ a b b r e v @ 1.1.0 │ ├ ─ ─ a n s i − r e g e x @ 2.1.1 │ ├ ─ ─ a n s i c o l o r s @ 0.3.2 │ ├ ─ ─ a n s i s t y l e s @ 0.1.3 … … … … … … . . └ ─ ┬ u g l i f y − j s @ 3.0.15 ├ ─ ┬ c o m m a n d e r @ 2.9.0 │ └ ─ ─ g r a c e f u l − r e a d l i n k @ 1.0.1 └ ─ ─ s o u r c e − m a p @ 0.5.6 然 而 , 输 出 十 分 冗 长 。 我 们 可 以 使 用 – d e p t h = 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:
uglifyjsexample.jsoexample.min.js使package.json u g l i f y j s e x a m p l e . j s − o e x a m p l e . m i n . j s 在 本 地 模 式 下 安 装 包 当 你 在 本 地 安 装 包 时 , 通 常 会 使 用 p a c k a g e . j s o n 文 件 进 行 安 装 。 下 面 让 我 们 创 建 这 样 的 一 个 文 件 。 npm init
package name: (project)
version: (1.0.0)
description: Demo of package.json
entry point: (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: no test specified\” && exit 1”
},
“author”: “”,
“license”: “ISC”
}
提示:你可以使用npm init –y命令以更快的方式生成package.json文件
除了main和scripts外,其他字段应该是一目了然的。main字段是你程序的主入口,scripts字段允许你指定在包的生命周期中的不同时间运行的脚本命令。我们暂时不讨论这些东西,但是如果你想了解更多相关信息,请参阅《npm中的package.json文档》和《使用npm作为构建工具》。
现在让我们来安装underscore包。
npminstallunderscorenpmnoticecreatedalockfileaspackagelock.json.Youshouldcommitthisfile.npmWARNproject@1.0.0NodescriptionnpmWARNproject@1.0.0Norepositoryfield.+underscore@1.8.3added1packagein0.344spackage.jsondependenciesdependencies:underscore:1.8.3使package.jsonunderscorev1.8.3npmnpmpackagelock.jsonV2.0.0major.minor.patch:使underscoredependenciesnpmunderscoresavedevdevDependencydevDependenciespackage.jsonprivate:truenpminstall使package.jsonnpminpmunderscoretest.jsconst=require(underscore);console.log(.range(5));使nodetest.js[0,1,2,3,4]npmunderscore n p m i n s t a l l u n d e r s c o r e n p m n o t i c e c r e a t e d a l o c k f i l e a s p a c k a g e − l o c k . j s o n . Y o u s h o u l d c o m m i t t h i s f i l e . n p m W A R N p r o j e c t @ 1.0.0 N o d e s c r i p t i o n n p m W A R N p r o j e c t @ 1.0.0 N o r e p o s i t o r y f i e l d . + u n d e r s c o r e @ 1.8.3 a d d e d 1 p a c k a g e i n 0.344 s 注 意 这 里 创 建 了 一 个 文 件 , 我 们 稍 后 会 讲 到 它 。 打 开 p a c k a g e . j s o n 文 件 我 们 会 看 到 d e p e n d e n c i e s 字 段 已 经 添 加 到 了 文 件 中 : … “ d e p e n d e n c i e s ” : “ u n d e r s c o r e ” : “ 1 .8 .3 ” 使 用 p a c k a g e . j s o n 管 理 依 赖 如 你 所 见 , u n d e r s c o r e v 1.8.3 安 装 到 了 我 们 的 项 目 中 。 版 本 号 前 面 的 ( ) 符 号 表 示 安 装 时 , n p m 将 安 装 最 高 版 本 的 包 , n p m 还 可 以 找 到 主 版 本 可 以 匹 配 的 唯 一 位 置 ( 除 非 存 在 p a c k a g e − l o c k . j s o n 文 件 ) 。 在 我 们 的 例 子 中 , 这 是 V 2.0.0 版 本 以 下 的 所 有 版 本 。 版 本 控 制 依 赖 ( m a j o r . m i n o r . p a t c h ) 的 这 种 方 法 被 称 为 语 义 化 版 本 控 制 。 你 可 以 在 《 语 义 化 版 本 控 制 : 为 什 么 你 应 该 使 用 它 ? 》 文 章 中 了 解 更 多 相 关 知 识 。 还 要 注 意 , u n d e r s c o r e 被 保 存 为 d e p e n d e n c i e s 字 段 的 属 性 。 这 是 最 新 版 本 n p m 的 默 认 设 置 , 用 于 运 行 应 用 程 序 所 需 的 包 ( 如 u n d e r s c o r e ) 。 也 可 以 通 过 指 定 – s a v e − d e v 标 志 将 包 保 存 为 d e v D e p e n d e n c y 。 d e v D e p e n d e n c i e s 是 用 于 开 发 目 的 的 包 , 例 如 运 行 测 试 或 解 析 代 码 。 你 也 可 以 给 p a c k a g e . j s o n 文 件 添 加 p r i v a t e : t r u e 以 防 止 意 外 发 布 私 有 仓 库 并 且 阻 止 所 有 运 行 n p m i n s t a l l 时 生 成 的 警 告 。 其 实 使 用 p a c k a g e . j s o n 指 定 项 目 依 赖 的 最 大 好 处 是 可 移 植 性 。 例 如 , 当 你 克 隆 别 人 的 代 码 时 , 你 只 需 要 在 根 目 录 运 行 n p m i 即 可 , 然 后 n p m 将 解 析 并 获 取 所 有 运 行 该 应 用 程 序 必 需 的 包 。 稍 后 我 们 再 来 看 这 个 。 在 结 束 此 部 分 内 容 之 前 , 我 们 快 速 检 查 一 下 u n d e r s c o r e 是 否 正 在 工 作 。 在 项 目 根 目 录 下 创 建 名 为 t e s t . j s 的 文 件 并 写 入 下 列 内 容 : c o n s t = r e q u i r e ( ‘ u n d e r s c o r e ′ ) ; c o n s o l e . l o g ( . r a n g e ( 5 ) ) ; 使 用 n o d e t e s t . j s 运 行 文 件 , 你 应 该 看 到 [ 0 , 1 , 2 , 3 , 4 ] 输 出 到 了 屏 幕 。 卸 载 本 地 安 装 包 n p m 是 一 个 包 管 理 器 , 所 以 它 肯 定 可 以 卸 载 一 个 包 。 我 们 假 设 当 前 的 u n d e r s c o r e 包 导 致 了 兼 容 性 问 题 。 我 们 可 以 卸 载 这 个 包 并 安 装 旧 版 本 , 如 下 所 示 : npm uninstall underscore
removed 2 packages in 0.107s
npmlistproject@1.0.0/home/sitepoint/project(empty)使@underscore n p m l i s t p r o j e c t @ 1.0.0 / h o m e / s i t e p o i n t / p r o j e c t └ ─ ─ ( e m p t y ) 安 装 特 定 版 本 的 包 我 们 通 过 使 用 @ 符 号 加 一 个 版 本 号 来 安 装 特 定 版 本 的 u n d e r s c o r e 包 。 npm install underscore@1.8.2
+ underscore@1.8.2
added 1 package in 1.574s
npmlistproject@1.0.0/home/sitepoint/projectunderscore@1.8.2underscore n p m l i s t p r o j e c t @ 1.0.0 / h o m e / s i t e p o i n t / p r o j e c t └ ─ ─ u n d e r s c o r e @ 1.8.2 更 新 包 让 我 们 检 查 一 下 u n d e r s c o r e 包 是 否 存 在 新 版 本 : npm outdated
Package Current Wanted Latest Location
underscore 1.8.2 1.8.3 1.8.3 project
Current列告诉我们当前安装的版本。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修复了我们之前提到的兼容性错误,我们希望将包更新为该版本。
npmupdateunderscore+underscore@1.8.3updated1packagein0.236s n p m u p d a t e u n d e r s c o r e + u n d e r s c o r e @ 1.8.3 u p d a t e d 1 p a c k a g e i n 0.236 s npm list
project@1.0.0 /home/sitepoint/project
└── underscore@1.8.3
提示:为了使上述命令工作正常,underscore必须被列为package.json的依赖项。如果我们有更多的过时模块,我们也可以执行npm update。
搜索包
在本教程中我们已经多次使用了mkdir命令。是否存在一个包做相同的事情呢?让我们使用npm search命令看一下。
npmsearchmkdirNAME|DESCRIPTION|AUTHOR|DATE|VERSIONmkdir|Directorycrea|=joehewitt|20120417|0.0.2fsextra|fsextraconta|=jprichardson|20170504|3.0.1mkdirp|Recursivelymkdir,|=substack|20150514|0.5.1mkdirp n p m s e a r c h m k d i r N A M E | D E S C R I P T I O N | A U T H O R | D A T E | V E R S I O N m k d i r | D i r e c t o r y c r e a … | = j o e h e w i t t | 2012 − 04 − 17 | 0.0.2 f s − e x t r a | f s − e x t r a c o n t a … | = j p r i c h a r d s o n … | 2017 − 05 − 04 | 3.0.1 m k d i r p | R e c u r s i v e l y m k d i r , … | = s u b s t a c k | 2015 − 05 − 14 | 0.5.1 … 这 里 有 一 个 m k d i r p 包 , 我 们 来 安 装 它 。 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!’)
});
从终端运行这个文件:
nodemkdir.jsDirectorycreated! n o d e m k d i r . j s D i r e c t o r y c r e a t e d ! 重 新 安 装 项 目 依 赖 我 们 先 安 装 一 个 包 : 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参数。
假设你将项目源代码克隆到了另一台计算机,现在需要安装依赖项。我们先删除node_modules文件夹然后执行npm install。
rmRnodemodules r m − R n o d e − m o d u l e s 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
npminstalladded57packagesin1.595snodemodulesnpm.npm n p m i n s t a l l a d d e d 57 p a c k a g e s i n 1.595 s 注 意 观 察 n o d e m o d u l e s 文 件 夹 , 你 会 发 现 它 已 经 被 重 新 创 建 。 像 这 样 , 你 就 可 以 轻 松 地 与 他 人 共 享 你 的 代 码 , 而 不 会 导 致 你 的 项 目 和 源 依 赖 仓 库 膨 胀 。 管 理 缓 存 当 n p m 安 装 一 个 包 时 , 其 实 它 保 存 了 一 个 副 本 。 所 以 下 次 你 安 装 这 个 包 的 时 候 就 不 需 要 再 连 接 网 络 。 这 些 副 本 缓 存 在 你 的 主 路 径 下 的 . n p m 目 录 中 。 ls ~/.npm
anonymous-cli-metrics.json _cacache _locks npm registry.npmjs.org
这个目录会随着时间的推移而变得乱七八糟,所以有时候要清理它。
npmcachecleanNodenodemodulefind.namenodemodulestypedexecrmrf+npmnpmnpminpmignpmunnpmupnpmnpmtnpmlsnpmllnpmla n p m c a c h e c l e a n 如 果 你 要 清 理 系 统 上 的 多 个 N o d e 项 目 , 还 可 以 从 工 作 区 清 除 所 有 n o d e m o d u l e 文 件 夹 。 f i n d . − n a m e “ n o d e m o d u l e s ” − t y p e d − e x e c r m − r f ‘ ′ + 别 名 可 能 你 已 经 注 意 到 , 运 行 n p m 命 令 有 多 种 方 式 。 以 下 是 一 些 常 用 的 n p m 别 名 的 简 要 列 表 : • n p m i − 安 装 本 地 包 • n p m i − g − 安 装 全 局 包 • n p m u n − 卸 载 本 地 包 • n p m u p − n p m 更 新 包 • n p m t − 运 行 测 试 • n p m l s − 列 出 已 安 装 的 模 块 • n p m l l 或 n p m l a − 在 列 出 模 块 时 打 印 附 加 包 信 息 你 也 可 以 一 次 安 装 多 个 软 件 包 : npm i express momemt lodash mongoose body-parser webpack
如果想要学习所有常见的npm命令,执行npm help获取完整的命令列表。你也可以在我的《10个技巧,使你成为npm忍者》文章中学到更多相关知识。
版本管理器
有几种有用的工具可以让你在同一台机器上管理多个版本的Node.js。其中一个就是n,另一个是nvm(Node 版本管理器)。如果这是你感兴趣的内容,可以看看我们的教程:《使用nvm安装多个版本的Node.js》。
总结
在本教程中,我介绍了使用npm的基础知识,演示了如何从下载页面安装Node.js,如何更改全局包的位置(所以我们可以避免使用sudo)以及如何在本地和全局模式下安装包。我还介绍了删除,更新和安装某个版本的包,以及管理项目的依赖。如果你想了解有关最新版本中的新功能的更多信息,可以访问npm Github发行页面。
随着版本5的发行,npm正在向前端开发的世界迈进。根据其首席运营官的介绍,npm用户基础正在发生变化,其中大多数开发者使用它们并没有使用它来编写Node。相反,它正在成为人们在前端开发中整合JavaScript的工具(你可以使用它来安装任何东西)并且它正在成为编写现代JavaScript的组成部分。你在你的项目中使用npm了吗?如果没有,现在是开始使用它的好时机。

来自 https://www.cnblogs.com/hedawei/p/7248833.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值