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.js

1.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

现在,当你修改 srcconfig 目录下的任何文件时,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

修改文件并观察自动重启:

  1. 运行 nodemon app.js 启动服务器
  2. 修改 app.js 文件中的响应内容,例如将 Hello, World! 改为 Hello, Nodemon!
  3. 保存文件,观察终端输出,Nodemon 会自动重启服务器
  4. 在浏览器中访问 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 有所帮助!

« 上一篇 Supertest 教程 下一篇 » PM2 教程