Node.js 和 npm 之间的关系非常密切,它们通常一起使用,但它们是独立的工具,有不同的功能:
-
Node.js:Node.js 是一个运行时环境,它允许你在服务器端运行 JavaScript。传统上,JavaScript 是一种用于浏览器端的语言,但 Node.js 使得你可以使用 JavaScript 来编写后端应用程序、构建服务器、处理文件等。
-
npm(Node Package Manager):npm 是 Node.js 的包管理工具,它让你可以方便地下载、安装、管理、更新项目所需的各种 JavaScript 库和工具。npm 还包含一个在线的包注册表(npmjs.com),供开发者分享代码和复用现有的解决方案。
它们的关系:
- Bundled Together:npm 与 Node.js 是捆绑在一起的,当你安装 Node.js 时,会自动安装 npm。
- 依赖管理:npm 帮助管理 Node.js 项目所需的依赖库和工具。通过运行
npm install
,它可以下载项目中列出的所有依赖项。 - 脚本管理:npm 还用于管理和执行项目中的脚本。例如,你可以定义
npm run start
或npm run build
来启动项目或构建项目。
常用命令:
npm install [package]
:安装一个包并将其添加到node_modules
文件夹中。npm init
:初始化一个新的 Node.js 项目,创建package.json
文件。npm update
:更新项目中的依赖项。
总结来说,Node.js 是一个运行 JavaScript 的平台,而 npm 则是帮助管理和共享 JavaScript 代码的工具,它们相辅相成,构成了现代 JavaScript 开发的核心工具链。
npx
和 Node.js 以及 npm
的关系紧密,主要用于简化执行 Node.js 命令和管理项目依赖。具体来说:
1. npm (Node Package Manager):
npm 是 Node.js 的包管理工具,管理和安装项目依赖。npx
是 npm 提供的一个附加工具,通常随着 npm 一起安装。在 npm 5.2.0 及更高版本中自动安装了 npx
。
2. npx (Node Package eXecute):
npx
是一种帮助开发者方便执行 npm 包中可执行文件的工具,避免了全局安装的麻烦。它的主要目的是在 Node.js 项目中运行命令时更简便和高效,尤其是那些不想全局安装的工具或命令。
主要功能和作用:
-
直接运行未安装的包:
使用npx
,可以直接运行一个未安装的 npm 包,而不用先用npm install
来安装。例如,运行npx create-react-app my-app
时,不需要先全局安装create-react-app
包,npx
会自动从 npm 上下载并运行它,完成后也不会全局保存这个包。 -
避免全局安装:
通过npx
,可以避免过多的全局安装工具。例如,开发时只需要临时使用的工具可以通过npx
执行,避免污染全局环境。 -
执行本地依赖包中的命令:
npx
允许你运行本地安装的 npm 包中的可执行文件,而不需要将它们添加到系统的PATH
中。例如,在项目中本地安装了某个包后,可以通过npx package-name
来运行。
常用场景:
-
运行一次性命令:
不需要永久安装的工具可以通过npx
直接运行,比如npx http-server
,这会启动一个本地服务器,服务器关闭后不会留下额外的依赖。 -
快速生成项目模板:
npx
常用于快速创建项目,例如使用npx create-react-app
或npx vue create
来生成 React 或 Vue 项目的模板。 -
运行特定版本的命令:
可以通过npx
指定某个特定版本的包来运行命令,甚至可以跳过项目本地安装的版本。
总结:
- Node.js 是运行 JavaScript 的环境。
- npm 是包管理工具,负责安装和管理项目依赖。
- npx 则是一个执行工具,帮助简化命令的运行和包的管理,不需要提前安装包,也能运行它们。
npx
使得在 Node.js 项目中执行命令更加灵活和简便,特别适合那些不需要长期依赖的命令行工具。
在开发过程中,为了更好地管理和切换 Node.js 版本及 npm 包管理工具,有一些常用的工具可以帮助我们更加高效地管理它们。以下是关于 Node.js 和 npm 管理工具的介绍:
Node.js 的管理工具:
-
nvm (Node Version Manager):
- 功能:nvm 是最常用的 Node.js 版本管理工具,它允许你在同一台机器上安装和切换多个版本的 Node.js。
- 优点:
- 可以轻松安装、卸载和切换不同的 Node.js 版本。
- 针对不同的项目,可以使用不同的 Node.js 版本,而不影响全局环境。
- 常用命令:
nvm install <version>
:安装指定版本的 Node.js。nvm use <version>
:切换到指定版本。nvm ls
:列出已安装的 Node.js 版本。nvm uninstall <version>
:卸载指定版本的 Node.js。
- 安装:nvm GitHub
-
n (Node Version Manager 简化版):
- 功能:
n
是一个类似于nvm
的工具,但更为简化。它适用于需要快速切换和管理 Node.js 版本的场景。 - 优点:
- 安装和使用非常简便,只需要通过 npm 全局安装即可。
- 快速切换 Node.js 版本,无需重新开终端或执行其他命令。
- 常用命令:
n <version>
:安装并切换到指定版本的 Node.js。n latest
:安装并切换到最新的 Node.js 版本。n lts
:安装并切换到最新的长期支持 (LTS) 版本。
- 安装:通过 npm 全局安装
n
:npm install -g n
- 功能:
-
fnm (Fast Node Manager):
- 功能:
fnm
是一个快速的 Node.js 版本管理工具,特别适合那些需要在不同 Node.js 版本之间频繁切换的开发者。 - 优点:
- 速度非常快,切换 Node.js 版本时无需等待太久。
- 支持跨平台使用(macOS、Linux 和 Windows)。
- 常用命令:
fnm install <version>
:安装指定版本的 Node.js。fnm use <version>
:切换到指定版本的 Node.js。fnm list
:列出所有已安装的 Node.js 版本。
- 安装:fnm 官方文档
- 功能:
npm 的管理工具:
-
npm 自身的版本管理:
- npm 自带版本管理功能,允许你安装和切换 npm 版本。
- 常用命令:
npm install -g npm@<version>
:安装指定版本的 npm。npm ls -g npm
:查看全局安装的 npm 版本。npm update -g npm
:更新到最新版本的 npm。
-
yarn:
- 功能:Yarn 是 Facebook 推出的 npm 替代工具,旨在解决 npm 一些效率和一致性的问题。
- 优点:
- 更快的包安装速度:Yarn 可以并行化下载依赖,并且通过缓存减少重复的下载。
- 确定性依赖树:Yarn 使用
yarn.lock
文件,确保每次安装时都使用相同版本的依赖。 - 稳定性:Yarn 在处理大型项目时比 npm 更加稳定。
- 常用命令:
yarn install
:安装项目的所有依赖。yarn add <package>
:添加并安装依赖。yarn remove <package>
:卸载指定依赖。
- 安装:
npm install -g yarn
-
pnpm (Performant npm):
- 功能:
pnpm
是一个高效的包管理工具,与 npm 兼容,但能更快地安装依赖,并且通过硬链接方式节省磁盘空间。 - 优点:
- 磁盘空间节省:pnpm 通过共享相同的依赖,避免多次安装同一个依赖包。
- 快速的依赖安装:由于缓存机制和硬链接的实现,依赖安装速度更快。
- 常用命令:
pnpm install
:安装项目的依赖。pnpm add <package>
:添加一个依赖。pnpm remove <package>
:卸载一个依赖。
- 安装:
npm install -g pnpm
- 功能:
总结:
- Node.js 版本管理工具:nvm、n、fnm 等工具帮助你轻松管理多个 Node.js 版本,并在不同项目之间快速切换。
- npm 替代工具:yarn 和 pnpm 等工具提升了包管理的效率和稳定性,在某些情况下比 npm 表现更佳。
选择适合的工具可以根据你的开发场景以及项目需求来定,通常 nvm
和 yarn
是最常用的组合,但 pnpm 近年来也逐渐流行。
在 Node.js 开发中,管理 npm 源 和 npm 服务 是两个非常重要的环节。下面分别介绍如何管理 npm 的源(registry)和 npm 服务(scripts、包发布等)的运行。
一、管理 npm 源(Registry)
npm 使用一个中央注册表(registry)来管理所有的包和包的元数据。默认情况下,npm 使用 https://registry.npmjs.org/ 作为默认源,但有时可能需要使用不同的源,比如为了加快安装速度、访问私有包,或者切换到镜像源。
1. 常见 npm 源
- 官方源:
https://registry.npmjs.org/
(默认) - 淘宝镜像源:
https://registry.npmmirror.com/
(适合中国用户,加速 npm 安装) - 私有 npm 源:公司内部的私有注册表,比如
Verdaccio
等工具可以帮助搭建私有 npm 源。
2. 更换 npm 源
查看当前的 npm 源:
npm get registry
设置 npm 源:
可以通过以下命令将 npm 源设置为指定的 URL。
npm config set registry <registry-url>
示例:将 npm 源设置为淘宝的 npm 镜像源:
npm config set registry https://registry.npmmirror.com/
恢复为官方源:
npm config set registry https://registry.npmjs.org/
临时使用不同源:
在某些情况下,你可以临时使用不同的源执行安装命令,而无需全局修改。
npm install <package-name> --registry=<registry-url>
示例:
npm install lodash --registry=https://registry.npmmirror.com/
3. 管理多个源工具:nrm
nrm
是一个 npm 源管理工具,允许你方便地在不同的源之间切换。
安装 nrm
:
npm install -g nrm
查看可用的源:
nrm ls
切换源:
nrm use taobao
添加自定义源:
nrm add <source-name> <registry-url>
删除源:
nrm del <source-name>
测试 npm 源的速度:
nrm test
二、npm 服务的运行
npm 服务通常是通过 npm scripts
来定义和管理的。package.json
文件中的 scripts
字段定义了一些可以通过 npm run <script-name>
来执行的任务,例如启动开发服务器、构建项目、运行测试等。
1. npm scripts 简介
在 package.json
文件中,npm 会从项目的根目录开始执行指定的命令,scripts
字段可以包含各种自定义命令脚本。 例如:
{"scripts": {"start": "node server.js","build": "webpack --config webpack.config.js","test": "jest","build:ci": "node ./script/index.js"}
}
这些脚本可以通过 npm run
执行:
npm run start
:启动服务器。npm run build
:执行构建。npm run test
:运行测试。
2. 内置 npm 命令
除了自定义的 scripts
,npm 还提供一些常见的内置命令:
- npm start:如果
package.json
中有scripts.start
,则可以直接运行npm start
,不用写npm run start
。 - npm test:同样,如果有
scripts.test
,可以直接运行npm test
。 - npm stop:如果定义了
scripts.stop
,可以通过npm stop
停止服务。
3. 环境变量
通过 npm scripts
执行时,您可以使用 process.env
访问环境变量。
-
在脚本中使用环境变量:
在package.json
中,您可以这样定义环境变量:{"scripts": {"start": "NODE_ENV=production node server.js","build": "NODE_ENV=production webpack"} }
上述示例将在
start
和build
脚本中设置NODE_ENV
为production
。 -
跨平台环境变量设置:
对于跨平台项目(例如在 Windows 和 Linux 上运行),推荐使用cross-env
包来兼容设置环境变量:npm install cross-env --save-dev
在
package.json
中使用cross-env
:{"scripts": {"build": "cross-env NODE_ENV=production webpack"} }
4. npm 运行服务的最佳实践
-
使用
pre
和post
脚本:
npm 支持自动运行某些脚本之前或之后的钩子。例如,你可以定义一个prestart
脚本,它会在start
脚本之前自动运行:{"scripts": {"prestart": "echo 'Before start'","start": "node server.js","poststart": "echo 'After start'"} }
-
组合脚本:
在scripts
中可以组合多个命令。例如,使用&&
来顺序执行多个命令:{"scripts": {"start": "npm run build && node server.js"} }
-
并行执行脚本:
如果需要并行运行多个命令,可以使用npm-run-all
或concurrently
这样的工具:npm install npm-run-all --save-dev
然后在
package.json
中这样定义:{"scripts": {"build": "npm-run-all --parallel build:*","build:css": "sass styles.scss styles.css","build:js": "webpack --config webpack.config.js"} }
总结:
- npm 源的管理:可以通过
npm config set registry
命令或nrm
工具来方便地切换不同的 npm 源,以适应不同的网络环境和需求。 - npm 服务的运行:通过
npm scripts
来定义、管理和运行项目的各种任务脚本。灵活使用内置命令、环境变量和脚本组合工具,可以提升开发和运行效率。
在服务端,管理通过 npm 运行的 Node.js 程序需要考虑进程的生命周期、自动化部署、日志管理、故障恢复等问题。为了解决这些问题,开发者通常使用一些专门的工具来管理服务端运行的 npm 程序。这些工具不仅可以管理应用的启动和停止,还能提供更强大的监控和恢复能力。以下是一些常见的服务端 npm 程序管理工具:
1. PM2 (Process Manager 2)
PM2 是最流行的 Node.js 应用进程管理工具之一,广泛用于生产环境中。它支持进程管理、日志记录、负载均衡、集群模式等功能,并可以与容器和云环境集成。
PM2 的主要功能:
- 进程管理:可以启动、停止、重启和监控应用进程。
- 守护进程模式:在应用崩溃或异常退出时,PM2 能自动重启应用,确保服务保持在线。
- 集群模式:支持多核 CPU 的 Node.js 应用集群,提升应用性能和可用性。
- 日志管理:自动记录应用的 stdout 和 stderr 输出,可以通过
pm2 logs
查看日志。 - 内存管理:支持内存限制,当应用内存超出设定值时自动重启。
- 负载均衡:在集群模式下自动实现负载均衡。
- 监控:通过 PM2 Monitor 可以实时监控应用的 CPU 和内存使用情况。
- 持久化进程:PM2 可以将进程保存为 JSON 配置文件,并在系统重启后自动恢复所有应用。
常用命令:
-
安装 PM2:
npm install -g pm2
-
启动应用:
pm2 start app.js
或者启动指定 npm 脚本:
pm2 start npm --name "my-app" -- run start
-
查看运行的进程:
pm2 list
-
停止/重启应用:
pm2 stop <app-name/id> pm2 restart <app-name/id>
-
监控应用:
pm2 monit
-
查看日志:
pm2 logs
-
持久化应用配置:
将当前应用配置保存到一个文件中,在系统重启后自动恢复:pm2 save
-
重启所有保存的进程:
pm2 resurrect
集群模式启动:
PM2 可以在多核 CPU 上运行应用,充分利用硬件资源:
pm2 start app.js -i max
-i max
表示使用最大 CPU 核心数。
2. Forever
forever
是另一个 Node.js 应用进程管理工具,它的主要功能是确保服务在后台永远运行。虽然它功能较为简化,但对于需要简单保持服务长时间运行的项目来说非常适合。
Forever 的主要功能:
- 保持服务永远运行:如果服务崩溃或异常退出,forever 会自动重启应用。
- 日志管理:自动记录应用的输出日志,便于调试和分析。
- 轻量化:相比 PM2,forever 更加轻量级,配置和使用也相对简单。
常用命令:
-
安装 Forever:
npm install -g forever
-
启动应用:
forever start app.js
-
列出所有运行的应用:
forever list
-
停止应用:
forever stop <pid/index>
-
查看日志:
forever logs
3. Nodemon
nodemon
是一个开发时常用的工具,它在代码变动时自动重启 Node.js 应用,适合开发环境。虽然 nodemon
主要用于开发过程中,但在某些简单的生产环境中,它也可以作为服务管理工具。
Nodemon 的主要功能:
- 自动重启:当检测到文件变动时,自动重启 Node.js 应用。
- 监控特定文件:可以设置只监控特定的文件或目录。
- 兼容 PM2:在开发环境中,可以配合 PM2 或其他工具一起使用,提升开发效率。
常用命令:
-
安装 Nodemon:
npm install -g nodemon
-
启动应用:
nodemon app.js
-
指定监控的文件/目录:
nodemon --watch src/ app.js
适合场景:
- 开发时自动重启应用,提升开发效率。
- 较为简单的服务环境下,可以用来监控并重启应用。
4. StrongLoop Process Manager (slc)
StrongLoop 是 IBM 旗下用于构建和管理 Node.js API 微服务的工具链。StrongLoop 的 Process Manager (slc
) 可以管理 Node.js 进程,同时提供内置的监控和故障恢复功能,主要针对企业级应用。
主要功能:
- 进程管理和监控:实时查看应用的健康状态。
- 负载均衡:支持多核负载均衡,适用于高负载应用。
- 监控和调优:内置监控系统,可以调优 Node.js 应用的性能。
常用命令:
-
安装 StrongLoop CLI:
npm install -g strongloop
-
启动应用:
slc start app.js
-
监控应用:
slc ctl status
-
查看应用日志:
slc logs
适合场景:
StrongLoop 更适合企业级应用和微服务架构,它集成了 API 构建工具,适用于需要强大监控、调优和企业级支持的环境。
5. Supervisor
supervisor
是一个简化版的进程管理工具,功能类似 nodemon
,它能监视代码变化并自动重启服务。相比 nodemon
,它更为轻量,适用于小型项目或开发环境。
主要功能:
- 自动重启:在代码发生变更时自动重启服务。
- 适用于开发环境:适合在开发时监控代码变化。
常用命令:
-
安装 Supervisor:
npm install -g supervisor
-
启动应用:
supervisor app.js
总结:
- PM2 是功能最强大的服务端进程管理工具,适用于生产环境,提供进程守护、集群模式、负载均衡和日志管理等功能。
- Forever 是一个简化版的工具,适合需要简单保持服务运行的场景。
- Nodemon 和 Supervisor 更适合开发环境,能够监控代码变动并自动重启。
- StrongLoop 适合企业级应用,集成了更多高级监控和优化功能。
对于大部分生产环境,PM2 是最推荐的工具,因为它不仅功能丰富,而且易于使用。