nodejs-best-practices by claudiodearaujo/izacenter
npx skills add https://github.com/claudiodearaujo/izacenter --skill nodejs-best-practices2025 年 Node.js 开发的原则与决策指南。学会思考,而非死记代码模式。
此技能教授的是决策原则,而非固定的代码以供复制。
What are you building?
│
├── Edge/Serverless (Cloudflare, Vercel)
│ └── Hono (zero-dependency, ultra-fast cold starts)
│
├── High Performance API
│ └── Fastify (2-3x faster than Express)
│
├── Enterprise/Team familiarity
│ └── NestJS (structured, DI, decorators)
│
├── Legacy/Stable/Maximum ecosystem
│ └── Express (mature, most middleware)
│
└── Full-stack with frontend
└── Next.js API Routes or tRPC
| 因素 | Hono | Fastify | Express |
|---|
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
| 最适合 | 边缘计算,无服务器 | 性能 | 遗留系统,学习 |
| 冷启动 | 最快 | 快 | 中等 |
| 生态系统 | 增长中 | 良好 | 最大 |
| TypeScript | 原生支持 | 优秀 | 良好 |
| 学习曲线 | 低 | 中等 | 低 |
Node.js 22+: --experimental-strip-types
├── 直接运行 .ts 文件
├── 简单项目无需构建步骤
└── 考虑用于:脚本,简单 API
ESM (import/export)
├── 现代标准
├── 更好的 Tree-shaking
├── 异步模块加载
└── 用于:新项目
CommonJS (require)
├── 遗留兼容性
├── 更多 npm 包支持
└── 用于:现有代码库,某些边缘情况
| 运行时 | 最适合 |
|---|---|
| Node.js | 通用目的,最大的生态系统 |
| Bun | 性能,内置打包器 |
| Deno | 安全优先,内置 TypeScript |
Request Flow:
│
├── Controller/Route Layer
│ ├── 处理 HTTP 具体细节
│ ├── 在边界进行输入验证
│ └── 调用服务层
│
├── Service Layer
│ ├── 业务逻辑
│ ├── 与框架无关
│ └── 调用仓库层
│
└── Repository Layer
├── 仅数据访问
├── 数据库查询
└── ORM 交互
Pattern:
├── 创建自定义错误类
├── 从任何层抛出
├── 在顶层捕获(中间件)
└── 格式化一致的响应
Client gets:
├── 适当的 HTTP 状态码
├── 用于编程处理的错误代码
├── 用户友好的消息
└── 不包含内部细节(安全!)
Logs get:
├── 完整的堆栈跟踪
├── 请求上下文
├── 用户 ID(如适用)
└── 时间戳
| 情况 | 状态码 | 时机 |
|---|---|---|
| 错误输入 | 400 | 客户端发送了无效数据 |
| 未认证 | 401 | 缺少或凭据无效 |
| 无权限 | 403 | 认证有效,但不允许操作 |
| 未找到 | 404 | 资源不存在 |
| 冲突 | 409 | 重复或状态冲突 |
| 验证失败 | 422 | 模式有效但业务规则失败 |
| 服务器错误 | 500 | 我们的错误,记录所有信息 |
| 模式 | 使用时机 |
|---|---|
async/await | 顺序的异步操作 |
Promise.all | 并行的独立操作 |
Promise.allSettled | 并行操作,允许部分失败 |
Promise.race | 超时或首个响应胜出 |
I/O-bound (async helps):
├── 数据库查询
├── HTTP 请求
├── 文件系统
└── 网络操作
CPU-bound (async doesn't help):
├── 加密操作
├── 图像处理
├── 复杂计算
└── → 使用工作线程或卸载处理
Where to validate:
├── API 入口点(请求体/参数)
├── 数据库操作之前
├── 外部数据(API 响应,文件上传)
└── 环境变量(启动时)
| 库 | 最适合 |
|---|---|
| Zod | TypeScript 优先,类型推断 |
| Valibot | 更小的包体积(可 Tree-shake) |
| ArkType | 性能关键 |
| Yup | 已有 React Form 使用场景 |
Trust nothing:
├── 查询参数 → 验证
├── 请求体 → 验证
├── 请求头 → 验证
├── Cookies → 验证
├── 文件上传 → 扫描
└── 外部 API → 验证响应
| 类型 | 目的 | 工具 |
|---|---|---|
| 单元测试 | 业务逻辑 | node:test, Vitest |
| 集成测试 | API 端点 | Supertest |
| 端到端测试 | 完整流程 | Playwright |
node --test src/**/*.test.ts
├── 无需外部依赖
├── 良好的覆盖率报告
└── 支持监视模式
实施前:
记住:Node.js 最佳实践关乎决策,而非死记模式。每个项目都应根据其需求进行全新的考量。
每周安装量
1
代码仓库
GitHub 星标数
1
首次出现
1 天前
安全审计
安装于
zencoder1
amp1
cline1
openclaw1
opencode1
cursor1
Principles and decision-making for Node.js development in 2025. Learn to THINK, not memorize code patterns.
This skill teaches decision-making principles , not fixed code to copy.
What are you building?
│
├── Edge/Serverless (Cloudflare, Vercel)
│ └── Hono (zero-dependency, ultra-fast cold starts)
│
├── High Performance API
│ └── Fastify (2-3x faster than Express)
│
├── Enterprise/Team familiarity
│ └── NestJS (structured, DI, decorators)
│
├── Legacy/Stable/Maximum ecosystem
│ └── Express (mature, most middleware)
│
└── Full-stack with frontend
└── Next.js API Routes or tRPC
| Factor | Hono | Fastify | Express |
|---|---|---|---|
| Best for | Edge, serverless | Performance | Legacy, learning |
| Cold start | Fastest | Fast | Moderate |
| Ecosystem | Growing | Good | Largest |
| TypeScript | Native | Excellent | Good |
| Learning curve | Low | Medium | Low |
Node.js 22+: --experimental-strip-types
├── Run .ts files directly
├── No build step needed for simple projects
└── Consider for: scripts, simple APIs
ESM (import/export)
├── Modern standard
├── Better tree-shaking
├── Async module loading
└── Use for: new projects
CommonJS (require)
├── Legacy compatibility
├── More npm packages support
└── Use for: existing codebases, some edge cases
| Runtime | Best For |
|---|---|
| Node.js | General purpose, largest ecosystem |
| Bun | Performance, built-in bundler |
| Deno | Security-first, built-in TypeScript |
Request Flow:
│
├── Controller/Route Layer
│ ├── Handles HTTP specifics
│ ├── Input validation at boundary
│ └── Calls service layer
│
├── Service Layer
│ ├── Business logic
│ ├── Framework-agnostic
│ └── Calls repository layer
│
└── Repository Layer
├── Data access only
├── Database queries
└── ORM interactions
Pattern:
├── Create custom error classes
├── Throw from any layer
├── Catch at top level (middleware)
└── Format consistent response
Client gets:
├── Appropriate HTTP status
├── Error code for programmatic handling
├── User-friendly message
└── NO internal details (security!)
Logs get:
├── Full stack trace
├── Request context
├── User ID (if applicable)
└── Timestamp
| Situation | Status | When |
|---|---|---|
| Bad input | 400 | Client sent invalid data |
| No auth | 401 | Missing or invalid credentials |
| No permission | 403 | Valid auth, but not allowed |
| Not found | 404 | Resource doesn't exist |
| Conflict | 409 | Duplicate or state conflict |
| Validation | 422 | Schema valid but business rules fail |
| Server error | 500 | Our fault, log everything |
| Pattern | Use When |
|---|---|
async/await | Sequential async operations |
Promise.all | Parallel independent operations |
Promise.allSettled | Parallel where some can fail |
Promise.race | Timeout or first response wins |
I/O-bound (async helps):
├── Database queries
├── HTTP requests
├── File system
└── Network operations
CPU-bound (async doesn't help):
├── Crypto operations
├── Image processing
├── Complex calculations
└── → Use worker threads or offload
Where to validate:
├── API entry point (request body/params)
├── Before database operations
├── External data (API responses, file uploads)
└── Environment variables (startup)
| Library | Best For |
|---|---|
| Zod | TypeScript first, inference |
| Valibot | Smaller bundle (tree-shakeable) |
| ArkType | Performance critical |
| Yup | Existing React Form usage |
Trust nothing:
├── Query params → validate
├── Request body → validate
├── Headers → verify
├── Cookies → validate
├── File uploads → scan
└── External APIs → validate response
| Type | Purpose | Tools |
|---|---|---|
| Unit | Business logic | node:test, Vitest |
| Integration | API endpoints | Supertest |
| E2E | Full flows | Playwright |
node --test src/**/*.test.ts
├── No external dependency
├── Good coverage reporting
└── Watch mode available
Before implementing:
Remember : Node.js best practices are about decision-making, not memorizing patterns. Every project deserves fresh consideration based on its requirements.
Weekly Installs
1
Repository
GitHub Stars
1
First Seen
1 day ago
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
zencoder1
amp1
cline1
openclaw1
opencode1
cursor1
Android 整洁架构指南:模块化设计、依赖注入与数据层实现
1,100 周安装