简介
在开发环境中,尤其是那些涉及大量迭代的环境中,我们不希望在更改源代码时手动重新启动服务器或后端应用程序。
这是 Nodemon 所要解决的问题。它用于跟踪服务器更改并自动重启动应用程序。
根据文档,Nodemon是基于Node.js开发的完美工具。事实上,它是在构建时考虑了 Node 的 CLI 命令的属性,因为它是 node 命令的包装器。
基本上,它的工作原理是检测当前目录中源代码的更改,并重新启动服务器以迎合这些新更改。
回想一下,为了运行 Node.js 应用程序,我们输入 node 命令并附加文件名。在使用 Nodemon 进行开发时,我们需要做的就是运行 Nodemon filename ,Nodemon 会为我们监视我们的文件。
但是,要使用 Nodemon,我们需要将其全局安装在我们的机器上,或者安装在每个项目上。
当按项目安装时,我们需要做的就是更新项目 package.json 文件中的 script 标签。要在开发模式下使用 Nodemon,我们可以在 script 标签中添加一 "dev": "nodemon app.js" 。
当全局安装时,Nodemon 在我们的系统路径上可用,并且开箱即用。
在本教程中,我将通过探索 Nodemon 的功能及其使用方式来解释 Nodemon 的工作原理。
我们将涵盖以下内容:
- 什么是Nodemon?
- 在本地和全局范围内安装 Nodemon
- Nodemon 配置和用法
- Nodemon的特点
为了能理解本教程,读者应该对 Node.js 和 Express 有基本的了解。
什么是Nodemon?
正如我之前提到的,Nodemon是一个实用程序或辅助工具,可以监视文件更改并自动重启我们的Node.js应用程序。它是开源的,维护良好,并被社区中的许多人使用。
要查看可用的 Nodemon 命令列表,我们可以使用 -h 标志或如下所示 --help 的标志。因此,我们可以运行:
nodemon -h
//or
nodemon --help
我们应该使用 Nodemon 开发基于 Node.js 的应用程序有几个原因。
首先,它非常容易设置。其次,一旦安装,它就会自动运行,因为它不需要任何实例来调用,最后,它有助于加快开发环境的迭代速度。
现在,让我们在下面探讨如何安装 Nodemon。
安装 Nodemon
正如我们之前提到的,Nodemon 可以全局安装在我们的系统路径上,也可以作为开发依赖项安装在本地。
要在我们的路径上全局安装 Nodemon,我们可以运行以下带有全局 -g 标志的命令:
npm install -g nodemon
这意味着可以从我们开发计算机上的系统路径使用和运行该包。
此外,我们也可以运行:
npm install --save-dev nodemon
上面的命令会将 Nodemon 本地安装在我们的机器上作为开发依赖项。请注意,我们在这里将 Nodemon 安装为带有标志的 --save-dev 开发依赖项,因为我们不希望它作为生产依赖项。
{
"name": "test-app",
"version": "1.0.0",
"description": "",
"main": "index.js",
}
"scripts": {
"test": "echo "Error: no test specified" && exit 1"
}
{
"author": "",
"license": "ISC",
"private": false,
"devDependencies": {
"nodemon": "^2.0.7"
},
}
作为开发依赖项,我们需要做的就是在 package.json 文件中添加一个 dev ,以便能够在本地设置中使用 Nodemon。现在让我们通过一个简单的 Node.js 应用程序来了解 Nodemon 的所有功能和配置选项。
让我们从 app.js 文件中的服务器设置开始。该文件的内容如下所示:
require('dotenv').config()
require('./mongoClient')
const express = require('express')
const config = require('./config')
const routes = require('./routes')
const app = express()
// add routes here
routes(app)
// catch 404 and forward to error handler
app.use((req, res, next) => {
const err = new Error('Not Found')
console.log(err)
err.status = 404
res.send('Route not found')
next(err)
})
app.listen(process.env.PORT || config.port, () => {
console.log(`${config.appName} listening on port ${config.port}!`)
})
module.exports = app
让我们也看看如何使用 Nodemon 运行这个服务器文件。在我们的项目中使用 Nodemon 的非常基本设置显在 package.json 的文件中:
{
"name": "nodemon_tutorial",
"version": "1.0.0",
"description": "A Tutorial for Understanding Nodemon",
"main": "app.js",
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js"
},
"directories": {
"model": "model",
"controllers": "controllers"
},
"repository": {
"type": "git",
"url": ""
},
"keywords": [
"Node.js",
"JavaScript"
],
"author": "Alexander Nnakwue",
"license": "MIT",
"devDependencies": {
"nodemon": "^2.0.4"
},
"dependencies": {
"bcrypt": "^5.0.1",
"debug": "^4.1.1",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"express-async-handler": "^1.1.4",
"mongoose": "^5.9.25",
"mongoose-paginate": "^5.0.3",
"path": "^0.12.7",
"uuidv4": "^6.2.0"
},
"engines": {
"node": "13.7.0",
"npm": "6.13.6"
}
}
从下面 scripts 标签中的设置中可以看出:
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js"
},
因此,当我们运行时 npm run dev ,它会运行 Nodemon 并监视文件。
我们使用 Nodemon 运行文件时的内容如下所示:
[nodemon] clean exit - waiting for changes before restart
[nodemon] restarting due to changes...
[nodemon] starting `node app.js`
(node:97775) ExperimentalWarning: Conditional exports is an experimental feature. This feature could change at any time
Nodemon_tutorial listening on port 5000!
mongodb connected
Mongoose: users.createIndex({ email: 1 }, { unique: true, background: true })
Mongoose: users.createIndex({ phoneNumber: 1 }, { unique: true, background: true })
使用 package.json 文件中的标志 --inspect ,我们运行时 npm run dev 的输出如下所示:
retina@alexander backend-server % npm run dev
> nodemon_tutorial@1.0.0 dev /Users/retina/Dropbox/My Mac (alexander)/Desktop/nodemon_tutorial/nodemon_tutorial
> nodemon --inspect app.js
[nodemon] 2.0.7
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node --inspect app.js`
Debugger listening on ws://127.0.0.1:9229/8618d563-210c-4070-bed5-b077016abae2
For help, see: https://nodejs.org/en/docs/inspector
(node:98970) ExperimentalWarning: Conditional exports is an experimental feature. This feature could change at any time
Nodemon_tutorial listening on port 5000!
从版本 1.1.x 开始,Nodemon 将在当前工作目录中的 package.json 文件中或 scripts.start main 属性,并为我们启动应用程序。
让我们试试这个:
(aba) retina@alexander backend-server % nodemon
[nodemon] 2.0.7
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node app.js`
(node:99661) ExperimentalWarning: Conditional exports is an experimental feature. This feature could change at any time
Nodemon_tutorial listening on port 5000!
mongodb connected
Mongoose: users.createIndex({ email: 1 }, { unique: true, background: true })
Mongoose: users.createIndex({ phoneNumber: 1 }, { unique: true, background: true })
从上面可以看出,我们的应用程序仍然可以正常工作。请注意,在这里,我已从 package.json 文件中删除了该 scripts 属性,并仅使用 nodemon 以下命令重新运行应用程序:
// delete the script tag and run nodemon afresh
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js"
}
为此,我们需要在系统中 nodemon 全局安装。当我们运行命令 npm i nodemon -g 全局安装 Nodemon 时的输出如下所示:
retina@alexander ~ % npm i nodemon -g
/usr/local/bin/nodemon -> /usr/local/lib/node_modules/nodemon/bin/nodemon.js
> nodemon@2.0.7 postinstall /usr/local/lib/node_modules/nodemon
> node bin/postinstall || exit 0
+ nodemon@2.0.7
added 120 packages from 57 contributors in 13.404s
Nodemon 配置和用法
Nodemon 支持本地和全局配置。
对于本地设置,我们可以在项目的当前工作目录中有一个 nodemon.json 文件,对于全局设置,我们可以在系中使用相同的文件。
此外,我们可以在项目 package.json 文件中设置一个 nodemonConfig ,供那些喜欢将所有配置保存在一个地方的人使用。
请注意,当涉及到执行哪些配置时,这些配置带有警告。如果我们指定文件 --config 或提供本地 nodemon.json 文件,则忽略任何 package.json 配置。
可能已经注意到,有三种方法可以配置 Nodemon 进行开发 - 本地、全局和通过 Node CLI。当我们键入 nodemon --help options 时,我们可以看到所有可用的 CLI 选项供我们使用。
有关配置 Nodemon 的可用方法的更多信息,我们也可以在我们的终端上输入 nodemon --help config。
通常,控制 Nodemon 的选项是通过 CLI 传入的,并且可以在我们运行 nodemon --help option 时列出。
现在,让我们检查一下可以通过将更多参数传递给 configuration( --config ) 文件或我们的 nodemon.json 文件来添加的几种配置中的一些。其中一些配置在开发项目时可能很有用。让我们来看看下面的一些。
监视多个目录
默认情况下,Nodemon 监视当前工作目录,但可以通过使用添加特定路径 --watch 的选项来更改此目录。
例如,我们可以通过运行以下命令来指示 Nodemon 只监视我们的 services 目录或 nodemon_tutorial 目录中 app.js 的文件中的更改:
nodemon --watch nodemon_tutorial/app.js --watch services
忽略文件
由于 Nodemon 默认在文件更改时重新启动 Web 服务器,因此我们可以通过将 Nodemon 配置为通过命令行忽略某些特定文件、目录。
请参阅下面的示例,我们忽略了 tests 文件夹:
nodemon --ignore tests/
上述命令在运行时将自动忽略 tests 文件夹中所做的任何更改。另请注意,默认情况下,Nodemon 会忽略 node_modules and .git 文件夹中的文件。太神奇了吧?让我们继续前进。
延迟重启
检查新文件更改的默认超时通常约为 1 秒。但是,在某些情况下,我们打算将 Nodemon 检查文件更改所需的时间推迟。
我们可以通过使用 --delay 命令来做到这一点。请参阅下面的代码示例:
nodemon --delay 3000ms index.js
3000ms 是应用重启前的延迟值(以毫秒为单位,也可能以秒为单位)。因此,Nodemon 只会在该时间过后重新启动 Web 服务器。
运行非 Node 代码
除了 Node 程序,Nodemon 还可用于监控其他程序。根据文件扩展名,Nodemon 将执行该命令。
有关运行非 Node 代码的更多详细信息,读者可以查看文档。
Nodemon的特点
通过管道输出到文件(或其他任何位置)
我们 stdout 可以通过指定一组规则来告诉 Nodemon 不要写入 。更多详细信息。
添加默认可执行文件
Nodemon 在 nodemon.json 配置文件的帮助下,可以声明一个默认的可执行文件。这反过来又使我们能够观察 node.js 具体的变化。
为此,我们可以使用该 execMap 属性。请注意,通常建议使用全局 nodemon.json 将 execMap 选项添加到我们的配置中。更多详细信息。
在状态更改时触发事件
我们可以在 Nodemon 重新启动时添加通知。此外,当事件发生时,可以触发操作。有关此内容的更多详细信息,请参阅文档。
可作为模块使用
从版本 1.0.0 开始,Nodemon 可以作为 Node.js 中的必需模块工作。通过这样做,我们可以扩展其功能并使其满足我们的其他需求。
更多详细信息可在此处的文档中找到。
结论
在 Node.js 中,Nodemon 可以比作魔杖,因为它能够在文件更改时自动重新启动 Web 应用程序。换句话说,Nodemon 只是消除了程序员在每次更改后反复手动停止和启动。
它是一种实用工具,可以使快速开发变得不那么麻烦。作为一种工具,它会持续监控您的 Node.js 应用程序,并在自动重新启动服务器之前静静地等待文件更改。要添加更多额外的配置,我们可以使用一个 nodemon.json 文件。
该文件可用于为我们的应用程序添加一些额外的配置,以允许我们监控多个目录、忽略文件和延迟重新启动等。
FAQ 文档还包含一些我们可以参考的其他提示和技巧,包括本教程中未提及或未涵盖的 Nodemon 的其他用例。