框架不是作弊,而是专业工具
Node
const EventEmitter = require('events');
// 创建事件发射器实例
const emitter = new EventEmitter();
// 订阅事件
emitter.on('order', (order) => {
console.log('收到订单:', order);
});
// 发布事件
emitter.emit('order', { id: 1, amount: 100 });
- EventEmitter 是什么?
Node.js 中几乎所有异步操作的核心都是基于事件驱动的。EventEmitter 是实现发布-订阅模式的核心类。
真正实用的替代方案
- 观察者模式(更简单可控)
发布/订阅消息队列(生产级方案)
// 问自己这些问题:
// 1. 需要类型安全吗?
// 是 → 不要用 EventEmitter,用 TypeScript + 接口
// 2. 需要调试方便吗?
// 是 → 不要用 EventEmitter,用 Promise + async/await
// 3. 需要内存安全吗?
// 是 → 不要用 EventEmitter,用 Observable 模式
// 4. 需要跨进程/服务通信吗?
// 是 → 不要用 EventEmitter,用消息队列(Redis/RabbitMQ)
// 5. 只是简单的一次性通知?
// 是 → 可以用 EventEmitter(但考虑用 Promise 替代)
// 6. 与第三方库交互?
// 是 → 用 EventEmitter(因为是库的接口)
场景 旧方案 新方案 原因
组件通信 EventEmitter 观察者模式 更可控,类型安全
异步协调 事件回调链 Promise/Async 更清晰,错误处理更好
状态管理 事件通知 状态管理库 可预测,容易调试
跨服务通信 自定义事件 消息队列 可靠,支持持久化
简单通知 EventEmitter 回调函数/Promise 更直接,没有内存泄漏
记住:如果可以用 Promise,就不要用 EventEmitter。代码会更清晰、更安全、更容易维护。
File system Node.js 文件系统(fs)完全实战指南
🎯 一、核心概念:同步 vs 异步 vs Promise
- 三种 API 风格
Node.js 全局对象完全指南
框架选择
const frameworkRecommendations = {
// 🚀 快速开发/初创公司
'Express': {
goodFor: ['MVP', '简单API', '快速原型', '小团队'],
why: '学习曲线平缓,生态丰富,灵活',
npm: 'npm install express'
},
// ⚡ 高性能需求
'Fastify': {
goodFor: ['高频API', '微服务', '实时应用', '性能敏感'],
why: '性能接近原生,JSON序列化优化',
npm: 'npm install fastify'
},
// 🏢 企业级/大型团队
'NestJS': {
goodFor: ['大型项目', '企业应用', '需要TypeScript', '团队协作'],
why: 'Angular风格,依赖注入,架构规范',
npm: 'npm install @nestjs/core'
},
// 🎯 全栈框架
'AdonisJS': {
goodFor: ['全栈应用', '需要ORM', '类似Laravel体验'],
why: '一体化解决方案,内置很多功能',
npm: 'npm install @adonisjs/core'
},
// 🔧 特定场景
'Koa': {
goodFor: ['中间件开发', '需要更细粒度控制', '了解async/await'],
why: 'Express原班人马打造,更现代',
npm: 'npm install koa'
},
// 🐇 微服务框架
'Moleculer': {
goodFor: ['微服务架构', '需要服务发现', '分布式系统'],
why: '内置微服务所需的所有组件',
npm: 'npm install moleculer'
}
};
📝 什么时候真的需要原生?
真实案例1:WebSocket 网关
真实案例2:高性能代理服务器
const learningPath = {
初学者: [
'1. 先用Express做2-3个项目',
'2. 了解Express的中间件原理',
'3. 尝试用原生重写一个简单路由',
'4. 继续用框架做实际项目'
],
进阶者: [
'1. 掌握一种框架(如Express)',
'2. 学习原生HTTP模块原理',
'3. 尝试用Fastify(更高性能)',
'4. 大型项目考虑NestJS'
],
专家: [
'1. 深入理解Node.js核心',
'2. 可以写自己的中间件库',
'3. 特殊场景用原生优化',
'4. 日常开发依然用框架'
]
};
// 99% 的项目应该这样选择:
const bestPractice = {
webApplication: 'Express 或 Fastify',
enterpriseAPI: 'NestJS',
microservices: 'Fastify 或 Moleculer',
realtimeApp: 'Socket.io + Express',
cliTool: '原生 + commander.js',
learning: '先Express,后学原生',
production: '永远用成熟框架'
};
// 黄金法则:
// 1. 除非有明确理由,否则用框架
// 2. 框架的"性能损失"在大部分场景可忽略
// 3. 开发效率 > 运行效率
// 4. 可维护性 > 代码量少
// 5. 团队协作 > 个人偏好
💡 最后建议 从今天起:
新项目:直接用 Express 或 Fastify
学习:理解框架背后的原理
优化:遇到真实性能问题时再考虑原生
生产:永远选择有良好维护的框架
记住: 框架不是"作弊",而是专业工具。就像木匠不会从砍树开始做椅子,而是直接买加工好的木材。