包与 npm 包管理器
# 包与 npm 包管理器
在 Node.js 中,包(package)是一个组织模块的标准方式,通常用于分发和共享代码。包管理是 Node.js 生态系统的重要组成部分,允许开发者轻松管理项目中的依赖关系和版本。
# 1. package 包
Node.js 的包遵循 CommonJS 规范,将一组相关的模块组合在一起,形成一个完整的工具集。包由两个主要部分组成:包结构和包描述文件。
- 包结构:用于组织包中的各种文件和资源。
- 包描述文件:描述包的相关信息,以供外部读取和分析。
# 1.1 包结构
一个 Node.js 包通常是一个压缩文件,解压后形成一个目录结构。符合 CommonJS 规范的目录通常包含以下文件和目录:
package.json
:包描述文件,包含包的元数据信息(必需)。bin
:可执行二进制文件目录(可选)。lib
:存放 JavaScript 代码的目录(可选)。doc
:文档目录,包括说明文档、变更日志等(可选)。test
:单元测试目录,包含测试代码(可选)。
[!TIP] 虽然这些目录结构是规范推荐的,但在实际开发中,只有
package.json
是必需的。
如何将文件夹变成一个包?
要将一个普通文件夹转换为 Node.js 包,需要在文件夹中创建一个合法的 package.json
文件。可以通过 npm 命令行工具来生成这个文件:
npm init
npm init
命令会启动一个交互式命令行,指导你创建package.json
文件,并填写必要的信息。
包名要求
- 包名不能包含中文字符。
- 包名不能包含大写字母。
- 包名尽量不要以数字开头。
- 包名不能与 npm 仓库上其他包同名。
# 1.2 包描述文件
package.json
是一个 JSON 格式的文件,用于描述包的元数据和依赖关系。它包含多个字段来表达包的详细信息:
字段名 | 说明 |
---|---|
name | 包的名称,必须唯一,不能包含大写字母或特殊字符。 |
version | 包的版本号,遵循语义化版本规范(semver),格式为 MAJOR.MINOR.PATCH 。 |
description | 对包的简短描述,帮助用户了解包的功能。 |
keywords | 关键字数组,用于描述包的相关内容,便于在 npm 中搜索。 |
author | 包的作者信息,通常包含姓名和电子邮件。 |
contributors | 包的贡献者列表,包含对项目有贡献的人员信息。 |
maintainers | 包的维护者信息,通常是负责维护包更新和管理的人。 |
license | 包的许可证信息,决定其他人如何使用和分发你的代码。 |
repository | 代码仓库地址,通常包含版本控制系统类型和 URL。 |
bugs | 提交 bug 的地址,通常为问题跟踪系统的 URL。 |
homepage | 包的主页 URL,通常是项目的官方网站或 GitHub 页面。 |
dependencies | 包的运行时依赖,列出所有必要的依赖包及其版本。 |
devDependencies | 包的开发时依赖,列出开发阶段需要的依赖包及其版本。 |
scripts | 定义可通过 npm 运行的脚本命令,例如测试、构建等。 |
bin | 定义包的可执行命令,便于在命令行使用。 |
main | 包的入口文件,当通过 require 加载包时,首先加载此文件。 |
directories | 定义包的目录结构,提供文档、测试等文件夹的指引。 |
engines | 指定包运行所需的 Node.js 版本,确保兼容性。 |
os | 指定支持的操作系统,限制包的安装环境。 |
cpu | 指定支持的 CPU 架构,限制包的运行环境。 |
package.json
文件示例
{
"name": "my-awesome-package", // 包名,必须是唯一的,不能包含大写字母或特殊字符
"version": "1.0.0", // 当前版本号,遵循语义化版本规范 (semver)
"description": "A simple Node.js package example", // 对包的简短描述
"main": "index.js", // 包的入口文件,require 时会加载这个文件
"scripts": { // 定义可通过 npm 运行的脚本命令
"test": "echo \"Error: no test specified\" && exit 1" // 测试脚本,默认显示错误信息
},
"repository": { // 存储库信息
"type": "git", // 版本控制系统类型
"url": "git+https://github.com/username/my-awesome-package.git" // 代码仓库地址
},
"keywords": [ // 关键词数组,有助于搜索和发现包
"nodejs", // 关键词1
"package", // 关键词2
"example" // 关键词3
],
"author": "John Doe <johndoe@example.com>", // 包的作者,包含姓名和电子邮件
"license": "MIT", // 使用的许可证类型
"bugs": { // Bug 跟踪信息
"url": "https://github.com/username/my-awesome-package/issues" // 提交 Bug 的 URL
},
"homepage": "https://github.com/username/my-awesome-package#readme", // 包的主页地址
"dependencies": { // 运行时依赖的包及其版本
"express": "^4.17.1" // 依赖 express 包,版本为 4.17.1 或更高
},
"devDependencies": { // 开发时依赖的包及其版本(不会在生产环境中安装)
"jest": "^26.6.0" // 依赖 jest 包,版本为 26.6.0 或更高
}
}
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
28
29
30
- name 和 version:定义包的名称和版本,这是必需字段。
- main:指定包的入口文件,当包被
require
时,会加载此文件。 - scripts:可以定义多个 npm 命令行脚本,例如
npm run test
。 - dependencies:列出所有包的运行时依赖,使用
npm install
安装。 - devDependencies:列出开发时需要的依赖,不包含在生产环境中。
# 2. NPM(Node Package Manager)
NPM 是 Node.js 的包管理器,提供了一个方便的途径来管理 Node.js 项目所需的依赖包。通过 NPM,开发者可以轻松地搜索、安装、更新和删除 Node.js 的第三方包。
# 2.1 NPM 是什么
- 全称:Node Package Manager。
- 关系:NPM 是 Node.js 的官方包管理器,随 Node.js 一起安装。安装 Node.js 时,NPM 会被自动安装。
# 2.2 NPM 能干什么
NPM 提供了对 Node.js 包的全面管理功能,包括:
- 搜索:在 NPM 仓库中查找第三方包。
- 安装:下载并安装所需的包。
- 更新:升级已安装的包到最新版本。
- 删除:移除不再需要的包。
- 发布:将自定义包上传到 NPM 仓库。
# 2.3 NPM 常用命令
# 1. 搜索包
npm search <package-name>
- 作用:在 NPM 仓库中搜索指定名称的包。
- 例子:
npm search express
会列出所有与express
相关的包。 - 网站搜索:直接在 NPM 官方网站进行搜索:https://www.npmjs.com (opens new window)
# 2. 安装包
# 2.1 局部安装
npm install <package-name> --save # 简写:npm i <package-name> -S 或 npm i <package-name>
- 作用:安装包到项目的
node_modules
目录中,并将其添加到package.json
的dependencies
。 - 备注:
- 局部安装的包只在项目目录下可用。
- 安装后会生成
package-lock.json
,用于锁定当前安装的包版本,以确保下次安装的一致性。 - NPM 版本在 5.x 及以后无需
--save
,会自动写入dependencies
。
# 2.2 开发依赖安装
npm install <package-name> --save-dev # 简写:npm i <package-name> -D
- 作用:将包安装为开发依赖,意味着该包只在开发环境中使用,不会被打包到生产环境中。
- 适用场景:开发依赖通常用于工具和库,比如代码打包工具(如 Webpack、Rollup)、测试框架(如 Mocha、Jest)、语法检查工具(如 ESLint)、CSS 预处理器(如 Sass、Less)等。
开发依赖与生产依赖的区别
- 开发依赖(
devDependencies
)- 用途:仅在开发过程中需要,不会在生产环境中使用。
- 示例:语法检查、代码压缩、测试框架。
- 安装命令:
npm install <package-name> --save-dev
- 生产依赖(
dependencies
)- 用途:项目在生产环境中运行所需的依赖。
- 示例:用于页面展示或功能实现的库,如
jQuery
、React
、Vue.js
。 - 安装命令:
npm install <package-name> --save
- 重叠依赖:
- 有些包在开发和生产环境中都需要,比如某些基础库(如
jQuery
),可以根据项目需求选择安装为dependencies
或同时安装为devDependencies
。
- 有些包在开发和生产环境中都需要,比如某些基础库(如
# 2.3 全局安装
npm install <package-name> -g
- 作用:将包安装为全局可用,一般用于命令行工具。
- 查看全局包的安装位置:
npm root -g
# 2.4 安装指定版本
npm install <package-name>@<version>
- 作用:安装指定版本的包。
# 2.5 批量安装
npm install
- 作用:根据
package.json
文件中声明的依赖,批量安装所有所需的包。
# 3. 移除包
npm remove <package-name> # 或者使用 npm uninstall <package-name>
- 作用:从项目的
node_modules
中移除包,并从package.json
中删除其声明。
注意
- 如果在项目中安装了多个版本的同一包,
npm remove
只会移除你当前项目中使用的版本。 - 移除包不会影响全局安装的包。要移除全局包,使用
npm remove -g <package-name>
。
# 4. 其他命令
检测修复:
npm audit fix
- 作用:检测项目依赖中的安全问题,并尝试修复。
查看版本信息:
npm view <package-name> versions
:查看远程 NPM 仓库中包的所有版本。npm view <package-name> version
:查看 NPM 仓库中包的最新版本。npm ls <package-name>
:查看本地安装的包的版本。
# 5. 关于版本号的说明
NPM 使用 语义化版本控制 (opens new window)(Semantic Versioning)来管理包的版本号:
"^3.x.x"
:锁定大版本,安装时保证包是3.x.x
版本,x
默认取最新的。"~3.1.x"
:锁定小版本,安装时保证包是3.1.x
版本,x
默认取最新的。"3.1.1"
:锁定完整版本,安装时包必须是3.1.1
版本。
# 3. cnpm 的简介与使用
# 3.1 国内使用 npm 存在的问题
访问延迟:由于 npm 的官方仓库服务器位于国外,从国内访问时可能会遇到网络延迟,导致包安装速度较慢。
连接不稳定:在某些网络环境下,访问 npm 官方仓库可能会出现连接超时或无法访问的情况。
查看当前 npm 仓库地址:可以使用以下命令查看当前配置的 npm 仓库地址:
npm config get registry
1解决方案:为了解决这些问题,国内用户可以使用淘宝提供的镜像服务。
# 3.2 使用淘宝的 cnpm 代替 npm
淘宝为国内用户搭建了一个 npm 镜像服务器,该服务器每隔 10 分钟同步一次官方 npm 仓库的内容。使用淘宝镜像可以显著提高包的下载速度和稳定性。
第一种(不建议):安装 cnpm
安装 cnpm:可以通过 npm 安装 cnpm,这是淘宝提供的一个命令行工具,使用它可以方便地从淘宝镜像下载 npm 包。
npm install -g cnpm --registry=https://registry.npmmirror.com/
1使用 cnpm:安装 cnpm 后,可以用
cnpm
命令代替npm
进行包的安装。cnpm install <package-name>
1注意:虽然
cnpm
提供了类似npm
的命令行接口,但一些npm
的高级特性可能不支持或行为略有不同。
第二种(建议):替换 npm 的仓库地址
替换仓库地址:将 npm 的默认仓库地址替换为淘宝的镜像地址,这样依然可以使用 npm 命令,但实际上是从淘宝镜像下载的。
npm config set registry https://registry.npmmirror.com/
1验证更改:可以通过以下命令验证仓库地址是否更改成功:
npm config get registry
1如果输出的是淘宝镜像地址,则表示更改成功。
使用 npm:替换仓库地址后,可以继续使用标准的
npm
命令来管理项目的依赖。npm install <package-name>
1由于仓库地址已经更改为国内镜像,安装速度将大幅提升。
总结
- cnpm 安装:适合那些需要频繁使用 npm 进行包管理且对安装速度有较高要求的用户,但不推荐作为唯一工具。
- 替换仓库地址:推荐所有国内用户使用这种方式,无需安装额外工具,保持
npm
的标准用法,同时提高下载速度和稳定性。
# 4. Yarn 的简介与使用
# 4.1 Yarn 是什么
Yarn 是一个由 Facebook、Google、Exponent 和 Tilde 联合推出的 JavaScript 包管理工具。Yarn 于 2016 年 10 月发布,自发布以来迅速获得了开发者的关注和使用。
- GitHub 星数:截至 2019 年 1 月,Yarn 在 GitHub 上的 Star 数量已超过 34.3k。
- 高效性:Yarn 使用本地缓存机制,可以在没有网络连接的情况下安装本地已缓存的依赖项,安装速度更快。
- 一致性:Yarn 在不同环境中安装相同的依赖时,保证版本一致性。
# 4.2 安装 Yarn
可以通过 npm 来安装 Yarn:
npm install -g yarn
# 4.3 配置环境变量
由于 Yarn 的全局安装位置与 npm 不同,因此需要将 Yarn 的全局安装路径配置到系统的环境变量中,以确保全局安装的包能够正常使用。
具体操作步骤
获取 Yarn 的全局安装目录:执行以下命令获取 Yarn 的全局安装目录:
yarn global dir
1获取 Yarn 的全局可执行文件目录:执行以下命令获取 Yarn 的全局可执行文件目录:
yarn global bin
1配置环境变量:将上述两步返回的路径添加到系统的环境变量中。
Windows:在系统属性 -> 环境变量 -> 系统变量中,找到
Path
变量,点击“编辑”并添加 Yarn 的路径。macOS/Linux:在终端中编辑
~/.bashrc
或~/.zshrc
文件,添加以下内容:export PATH="$PATH:`yarn global bin`"
1
# 4.4 Yarn 命令与 npm 命令的对应关系
Yarn 提供了与 npm 类似的命令行接口,以下是常用命令的对比:
操作 | Yarn 命令 | npm 命令 |
---|---|---|
初始化项目 | yarn init -y | npm init -y |
安装所有依赖 | yarn | npm install |
安装指定版本的运行时依赖包 | yarn add <package>@<version> | npm install <package>@<version> -S |
安装指定版本的开发时依赖包 | yarn add <package>@<version> -D | npm install <package>@<version> -D |
全局安装指定包 | yarn global add <package> | npm install <package> -g |
移除依赖包 | yarn remove <package> | npm remove <package> |
移除全局依赖包 | yarn global remove <package> | npm remove <package> -g |
查看某个包的信息 | yarn info <package> | npm info <package> |
设置淘宝镜像 | yarn config set registry https://registry.npmmirror.com | npm config set registry https://registry.npmmirror.com |
# 4.5 Yarn 的优点
- 速度快:由于 Yarn 使用本地缓存机制,安装相同的包时速度更快。
- 离线模式:已安装过的包可以在离线模式下再次安装。
- 版本锁定:Yarn 生成的
yarn.lock
文件确保项目在不同环境中安装相同的依赖版本。 - 更好的依赖管理:Yarn 提供了更好的依赖冲突解决机制和更清晰的输出信息。
总结
Yarn 是一个强大的包管理工具,提供了比 npm 更好的性能和一致性。在使用 Yarn 时,可以享受到更快的安装速度、更好的依赖管理和更一致的安装结果。通过将 Yarn 的全局安装路径添加到环境变量中,可以确保全局安装的包能够正常使用。
# 5. pnpm 的简介与使用
# 5.1 pnpm 是什么
pnpm 是一种高效、快速且节省磁盘空间的包管理工具。与 npm 和 Yarn 不同的是,pnpm 通过使用硬链接和符号链接的方式来管理包,避免了重复的依赖包下载,从而显著减少了磁盘空间的占用。
- 高效性:pnpm 通过共享依赖的方式,提高了安装速度并节省了磁盘空间。
- 一致性:pnpm 确保在不同的环境中安装的依赖版本一致。
- 隔离性:pnpm 使用符号链接和硬链接来管理包,避免了不同项目之间的依赖冲突。
# 5.2 安装 pnpm
可以通过 npm 来安装 pnpm:
npm install -g pnpm
# 5.3 pnpm 的工作原理
pnpm 通过创建硬链接和符号链接的方式来管理包。硬链接是文件系统中指向相同物理文件的不同文件名,因此在不同项目中,依赖的包只会被下载一次并存储在一个共享的存储中,从而节省了磁盘空间。
- 符号链接(symlink):在项目的
node_modules
中,创建指向全局存储中包的符号链接。 - 硬链接(hard link):在全局存储中,同一个包只存储一次,通过硬链接进行共享。
# 5.4 pnpm 命令与 npm 命令的对应关系
pnpm 提供了与 npm 和 Yarn 类似的命令行接口,以下是常用命令的对比:
操作 | pnpm 命令 | npm 命令 |
---|---|---|
初始化项目 | pnpm init | npm init |
安装所有依赖 | pnpm install | npm install |
安装指定版本的运行时依赖包 | pnpm add <package>@<version> | npm install <package>@<version> -S |
安装指定版本的开发时依赖包 | pnpm add <package>@<version> -D | npm install <package>@<version> -D |
全局安装指定包 | pnpm add -g <package> | npm install <package> -g |
移除依赖包 | pnpm remove <package> | npm remove <package> |
移除全局依赖包 | pnpm remove -g <package> | npm remove <package> -g |
查看某个包的信息 | pnpm info <package> | npm info <package> |
设置淘宝镜像 | pnpm config set registry https://registry.npmmirror.com | npm config set registry https://registry.npmmirror.com |
# 5.5 pnpm 的优点
- 节省磁盘空间:pnpm 通过硬链接和符号链接的方式,避免了重复下载相同的依赖包,从而显著减少了磁盘空间的占用。
- 安装速度快:由于依赖共享,pnpm 的安装速度通常比 npm 和 Yarn 更快。
- 隔离性好:pnpm 使用符号链接和硬链接来管理包,避免了不同项目之间的依赖冲突。
- 严格的版本控制:pnpm 确保在不同环境中安装相同的依赖版本,确保项目的一致性。
# 5.6 配置全局缓存路径
pnpm 在全局使用缓存路径来存储依赖包,因此可以通过以下命令配置缓存路径:
pnpm config set store-dir <path>
pnpm
将缓存存储在一个共享的全局目录中,通常位于用户的主目录下(C:\Users\<YourUser>\.pnpm-store
)。- 在某些情况下(如磁盘空间限制或需要特定的缓存管理策略时),可以通过设置自定义路径来满足项目需求。
总结
pnpm 是一种高效且节省磁盘空间的包管理工具,通过硬链接和符号链接的方式来管理包,避免了重复的依赖包下载。pnpm 提供了与 npm 和 Yarn 类似的命令行接口,使用起来非常方便。在使用 pnpm 时,可以通过配置全局缓存路径来优化包的管理和安装速度。
# 6. NVM 的简介和使用
nvm
(Node Version Manager)是一个用于管理 Node.js 版本的工具,可以方便地在多个 Node.js 版本之间切换。在 Windows 系统上,nvm-windows
是其对应的版本,允许你安装、卸载和管理不同版本的 Node.js。
# 6.1 安装与配置 NVM for Windows
卸载现有的 Node.js
在安装
nvm
之前,需要卸载当前已安装的 Node.js,因为nvm
会管理 Node.js 的安装路径和版本。下载 nvm-windows
从 GitHub 仓库下载 nvm-windows 安装包:
安装 nvm
- 运行下载的安装包。
- 在安装过程中,会提示选择
nvm
和node.js
的安装目录,请确保目录路径中不包含空格。 - 选用【以管理员身份运行】cmd 程序来执行 nvm 命令
设置镜像地址(可选)
为了加快下载速度,特别是在中国大陆地区,建议配置国内的镜像地址:
nvm node_mirror https://npmmirror.com/mirrors/node/ nvm npm_mirror https://npmmirror.com/mirrors/npm/
1
2说明:这些设置用于通过
nvm
下载 Node.js 和 npm 时使用镜像加速。
笔记
- 安装成功会自动将 NVM 的路径添加到系统环境变量中,因此你可以在命令提示符中直接使用
nvm
命令。 nvm-windows
会在安装和切换 Node.js 版本时自动管理node
和npm
的路径,确保系统能够正确使用当前版本。
验证安装
打开命令提示符(CMD),输入以下命令查看
nvm
版本,确认安装成功:nvm version # 显示 nvm 的版本号
1查看当前环境的 Node.js 版本(如果已经安装过):
node -v # 显示当前正在使用的 Node.js 版本
1
# 6.2 安装和切换 Node.js 版本
查看可用的 Node.js 版本:
nvm list available # 列出所有可用的 Node.js 版本
1- nvm list available出现空白解决办法(传送门 (opens new window))
安装特定版本的 Node.js:
nvm install 14.17.0 # 安装 Node.js 版本 14.17.0
1切换 Node.js 版本:
nvm use 14.17.0 # 切换到 Node.js 版本 14.17.0
1查看已安装的 Node.js 版本:
nvm list # 列出所有已安装的 Node.js 版本
1
# 6.3 如何验证和使用
每次切换 Node.js 版本后,可以使用以下命令验证当前使用的 Node.js 版本:
node -v # 显示当前正在使用的 Node.js 版本
1使用
nvm-windows
切换版本时,它会自动调整PATH
环境变量,以确保node
和npm
指向正确的安装路径。
注意事项
- 全局包的管理:切换 Node.js 版本后,所有全局安装的 npm 包也会发生变化,因为每个版本的 Node.js 都有自己的全局包存储。
- 环境变量:
nvm-windows
自动管理node
和npm
的路径,因此无需手动调整系统环境变量。
nvm-windows
提供了便捷的 Node.js 版本管理功能,使得在多个项目之间切换版本变得简单高效。通过 nvm-windows
的自动路径管理,您可以避免手动配置环境变量的麻烦,并确保不同项目能够使用适合的 Node.js 版本。