Nodemon 教程
1. 核心知识点讲解
1.1 Nodemon 简介
Nodemon 是一个用于开发 Node.js 应用的工具,它可以监控文件系统的变化,并在文件发生变化时自动重启 Node.js 应用。这大大提高了开发效率,因为你不需要在每次修改代码后手动重启服务器。
1.2 安装和配置
全局安装 Nodemon:
npm install -g nodemon项目本地安装:
npm install --save-dev nodemon配置 package.json:
{
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js"
}
}创建 nodemon.json 配置文件:
{
"watch": ["src", "config"],
"ext": "js,json",
"ignore": ["node_modules", "*.test.js"],
"exec": "node src/app.js"
}1.3 基本使用
基本命令:
# 启动应用并监控文件变化
nodemon app.js
# 使用本地安装的 nodemon
npx nodemon app.js
# 通过 npm 脚本运行
npm run dev监控特定文件或目录:
# 监控 src 目录
nodemon --watch src app.js
# 监控多个目录
nodemon --watch src --watch config app.js指定监控的文件扩展名:
# 只监控 js 和 json 文件
nodemon --ext js,json app.js
# 监控 js, json 和 ts 文件
nodemon --ext js,json,ts app.js忽略特定文件或目录:
# 忽略 node_modules 目录
nodemon --ignore node_modules app.js
# 忽略多个目录和文件
nodemon --ignore node_modules --ignore test app.js1.4 高级配置
使用 nodemon.json 配置文件:
{
"watch": ["src", "config"],
"ext": "js,json,ts",
"ignore": ["node_modules", "test", "*.log"],
"exec": "node --inspect src/app.js",
"restartable": "rs",
"env": {
"NODE_ENV": "development"
},
"verbose": true,
"delay": "2500"
}配置项说明:
watch- 要监控的目录或文件ext- 要监控的文件扩展名ignore- 要忽略的目录或文件exec- 要执行的命令restartable- 重启命令,默认为 "rs"env- 环境变量verbose- 是否显示详细信息delay- 重启延迟时间(毫秒)
在 package.json 中配置:
{
"name": "my-app",
"version": "1.0.0",
"scripts": {
"dev": "nodemon"
},
"nodemonConfig": {
"watch": ["src"],
"ext": "js,json",
"ignore": ["node_modules"],
"exec": "node src/app.js"
}
}1.5 环境变量
设置环境变量:
# 通过命令行设置
nodemon --env NODE_ENV=development app.js
# 通过 nodemon.json 设置
{
"env": {
"NODE_ENV": "development",
"PORT": "3000"
}
}
# 通过 package.json 设置
{
"nodemonConfig": {
"env": {
"NODE_ENV": "development"
}
}
}1.6 自定义启动命令
执行自定义命令:
# 执行 babel-node
nodemon --exec babel-node src/app.js
# 执行 ts-node
nodemon --exec ts-node src/app.ts
# 执行 npm 脚本
nodemon --exec "npm run build && node dist/app.js"在配置文件中设置:
{
"exec": "babel-node src/app.js"
}1.7 调试模式
启用 Node.js 调试模式:
# 启用调试模式
nodemon --inspect app.js
# 启用调试模式并暂停执行
nodemon --inspect-brk app.js
# 使用自定义调试端口
nodemon --inspect=0.0.0.0:9229 app.js在配置文件中设置:
{
"exec": "node --inspect src/app.js"
}2. 实用案例分析
2.1 基本使用案例
场景: 开发一个简单的 Express 应用,使用 Nodemon 自动重启服务器
实现:
// app.js
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello, World!');
});
app.get('/about', (req, res) => {
res.send('About Page');
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`服务器运行在 http://localhost:${PORT}`);
});
// package.json
{
"name": "my-express-app",
"version": "1.0.0",
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js"
},
"dependencies": {
"express": "^4.17.1"
},
"devDependencies": {
"nodemon": "^2.0.15"
}
}运行应用:
npm run dev现在,当你修改 app.js 文件时,Nodemon 会自动重启服务器,你可以立即在浏览器中看到修改后的效果。
2.2 高级配置案例
场景: 开发一个使用 TypeScript 的 Node.js 应用,需要监控 TypeScript 文件的变化并自动编译和重启
实现:
// src/app.ts
import express from 'express';
const app = express();
app.get('/', (req, res) => {
res.send('Hello, TypeScript!');
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`服务器运行在 http://localhost:${PORT}`);
});
// tsconfig.json
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true
},
"include": ["src/**/*"],
"exclude": ["node_modules"]
}
// nodemon.json
{
"watch": ["src"],
"ext": "ts,json",
"ignore": ["node_modules", "dist"],
"exec": "tsc && node dist/app.js"
}
// package.json
{
"name": "my-typescript-app",
"version": "1.0.0",
"scripts": {
"start": "node dist/app.js",
"build": "tsc",
"dev": "nodemon"
},
"dependencies": {
"express": "^4.17.1"
},
"devDependencies": {
"@types/express": "^4.17.13",
"nodemon": "^2.0.15",
"typescript": "^4.5.4"
}
}运行应用:
npm run dev现在,当你修改 src/app.ts 文件时,Nodemon 会自动编译 TypeScript 文件并重启服务器。
2.3 多文件监控案例
场景: 开发一个包含多个模块的 Node.js 应用,需要监控不同目录下的文件变化
实现:
// src/app.js
const express = require('express');
const app = express();
const routes = require('./routes');
const config = require('./config');
app.use('/api', routes);
const PORT = config.port || 3000;
app.listen(PORT, () => {
console.log(`服务器运行在 http://localhost:${PORT}`);
});
// src/routes.js
const express = require('express');
const router = express.Router();
router.get('/users', (req, res) => {
res.json([{ id: 1, name: '张三' }]);
});
module.exports = router;
// src/config.js
module.exports = {
port: 3000,
environment: 'development'
};
// nodemon.json
{
"watch": ["src", "config"],
"ext": "js,json",
"ignore": ["node_modules"],
"exec": "node src/app.js"
}
// package.json
{
"name": "my-multi-module-app",
"version": "1.0.0",
"scripts": {
"start": "node src/app.js",
"dev": "nodemon"
},
"dependencies": {
"express": "^4.17.1"
},
"devDependencies": {
"nodemon": "^2.0.15"
}
}运行应用:
npm run dev现在,当你修改 src 或 config 目录下的任何文件时,Nodemon 都会自动重启服务器。
3. 代码示例
3.1 基本使用示例
简单的 Node.js 应用:
// app.js
const http = require('http');
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello, World!\n');
});
const PORT = process.env.PORT || 3000;
server.listen(PORT, () => {
console.log(`服务器运行在 http://localhost:${PORT}/`);
});使用 Nodemon 启动:
nodemon app.js修改文件并观察自动重启:
- 运行
nodemon app.js启动服务器 - 修改
app.js文件中的响应内容,例如将Hello, World!改为Hello, Nodemon! - 保存文件,观察终端输出,Nodemon 会自动重启服务器
- 在浏览器中访问
http://localhost:3000,查看修改后的响应
3.2 配置文件示例
nodemon.json 配置示例:
{
"watch": ["src", "public", "config"],
"ext": "js,json,html,css",
"ignore": [
"node_modules",
"dist",
"*.log",
"*.test.js",
"*.spec.js"
],
"exec": "node src/server.js",
"restartable": "rs",
"env": {
"NODE_ENV": "development",
"PORT": "3000",
"DB_URL": "mongodb://localhost:27017/dev"
},
"verbose": true,
"delay": "1000",
"legacyWatch": false
}package.json 配置示例:
{
"name": "my-node-app",
"version": "1.0.0",
"description": "Node.js 应用",
"main": "src/server.js",
"scripts": {
"start": "node src/server.js",
"dev": "nodemon",
"test": "jest",
"build": "npm run test && echo \"Build completed\""
},
"nodemonConfig": {
"watch": ["src"],
"ext": "js,json",
"ignore": ["node_modules"],
"exec": "node src/server.js",
"env": {
"NODE_ENV": "development"
}
},
"dependencies": {
"express": "^4.17.1",
"mongoose": "^6.1.4"
},
"devDependencies": {
"nodemon": "^2.0.15",
"jest": "^27.4.5"
}
}3.3 高级使用示例
使用 Babel:
# 安装依赖
npm install --save-dev babel-node @babel/core @babel/preset-env
# 创建 .babelrc
{
"presets": ["@babel/preset-env"]
}
# 使用 nodemon 运行
nodemon --exec babel-node src/app.js
# 或在配置文件中设置
{
"exec": "babel-node src/app.js"
}使用 TypeScript:
# 安装依赖
npm install --save-dev ts-node typescript
# 创建 tsconfig.json
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"esModuleInterop": true
}
}
# 使用 nodemon 运行
nodemon --exec ts-node src/app.ts
# 或在配置文件中设置
{
"exec": "ts-node src/app.ts",
"ext": "ts,json"
}使用 ESLint:
# 安装依赖
npm install --save-dev eslint
# 创建 .eslintrc.json
{
"extends": "eslint:recommended",
"env": {
"node": true,
"es6": true
},
"rules": {
"indent": ["error", 2],
"linebreak-style": ["error", "unix"],
"quotes": ["error", "single"],
"semi": ["error", "always"]
}
}
# 使用 nodemon 运行并检查代码风格
nodemon --exec "eslint src && node src/app.js"
# 或在配置文件中设置
{
"exec": "eslint src && node src/app.js"
}3.4 与其他工具集成
与 Express 集成:
// app.js
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello, Express!');
});
app.get('/api/users', (req, res) => {
res.json([
{ id: 1, name: '张三' },
{ id: 2, name: '李四' }
]);
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`服务器运行在 http://localhost:${PORT}`);
});
// package.json
{
"scripts": {
"dev": "nodemon app.js"
}
}与 Koa 集成:
// app.js
const Koa = require('koa');
const app = new Koa();
app.use(async (ctx) => {
if (ctx.path === '/') {
ctx.body = 'Hello, Koa!';
} else if (ctx.path === '/api/users') {
ctx.body = [
{ id: 1, name: '张三' },
{ id: 2, name: '李四' }
];
}
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`服务器运行在 http://localhost:${PORT}`);
});
// package.json
{
"scripts": {
"dev": "nodemon app.js"
}
}与 MongoDB 集成:
// app.js
const express = require('express');
const mongoose = require('mongoose');
const app = express();
// 连接 MongoDB
mongoose.connect('mongodb://localhost:27017/test', {
useNewUrlParser: true,
useUnifiedTopology: true
});
// 定义模型
const User = mongoose.model('User', {
name: String,
email: String
});
// 路由
app.get('/users', async (req, res) => {
const users = await User.find();
res.json(users);
});
app.post('/users', express.json(), async (req, res) => {
const user = new User(req.body);
await user.save();
res.status(201).json(user);
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`服务器运行在 http://localhost:${PORT}`);
});
// package.json
{
"scripts": {
"dev": "nodemon app.js"
}
}4. 总结
Nodemon 是一个非常实用的 Node.js 开发工具,它可以监控文件系统的变化,并在文件发生变化时自动重启 Node.js 应用。本教程介绍了 Nodemon 的核心概念,包括:
- 安装和配置
- 基本使用方法
- 高级配置选项
- 环境变量设置
- 自定义启动命令
- 调试模式
- 与其他工具的集成
通过学习这些概念,你可以在开发 Node.js 应用时使用 Nodemon 来提高开发效率,避免手动重启服务器的繁琐过程。Nodemon 的配置非常灵活,可以根据不同的项目需求进行定制,支持监控特定文件或目录、忽略特定文件或目录、执行自定义命令等功能。
5. 进一步学习资源
希望本教程对你学习 Nodemon 有所帮助!