MidwayJS
约 1008 字大约 3 分钟
Node.jsMidwayJS后端框架
2026-04-08
什么是 MidwayJS
MidwayJS 是阿里巴巴淘系技术部开源的一款面向未来的 Node.js 全栈框架,基于 TypeScript 和依赖注入(IoC),为构建企业级 Node.js 应用(Web、RPC、Serverless、微服务、全栈应用)提供一体化解决方案。
它的核心定位可以概括为三点:
- 面向企业:内置 IoC、AOP、组件化体系,天然适配大型项目的架构约束
- 跨场景复用:同一份业务代码可运行于传统 Web 服务器、Serverless、微服务等多种形态
- 拥抱 TypeScript:从设计之初就以 TS 为第一公民,类型系统贯穿全链路
解决了什么问题
相比 Koa / Express 这类"薄"框架,以及 Egg.js 这类"约定式"框架,Midway 解决的痛点是:
- Node.js 缺少企业级架构范式:传统 Node 框架偏向"函数式"组织,大项目容易失控。Midway 引入 IoC/DI,让代码按能力分层,解耦清晰。
- 多运行时割裂:过去从 Web 服务器迁移到 Serverless/FaaS 需要重写大量代码。Midway 通过统一的运行时抽象,业务代码几乎无需改动。
- TypeScript 支持不完整:很多 Node 框架的 TS 只是"能用",而 Midway 则深度集成 TS 装饰器体系,带来更好的开发体验。
核心特性
IoC 容器与依赖注入
Midway 内置 IoC 容器,所有 Service / Controller / Middleware 都通过装饰器注册,通过 @Inject() 注入依赖。
import { Provide, Inject, Controller, Get } from '@midwayjs/core';
import { UserService } from '../service/user.service';
@Controller('/user')
export class UserController {
@Inject()
userService: UserService;
@Get('/:id')
async getUser(id: string) {
return await this.userService.findById(id);
}
}@Provide()
export class UserService {
async findById(id: string) {
return { id, name: 'ZhenYu' };
}
}组件化体系
Midway 把能力拆分为一个个可插拔的 Component,例如 @midwayjs/koa、@midwayjs/orm、@midwayjs/redis、@midwayjs/bull 等。通过在 configuration.ts 中 imports 即可启用。
import { Configuration } from '@midwayjs/core';
import * as koa from '@midwayjs/koa';
import * as orm from '@midwayjs/typeorm';
@Configuration({
imports: [koa, orm],
importConfigs: ['./config/'],
})
export class MainConfiguration {}多运行时统一
同一套业务代码可以运行在:
- Koa / Express / Egg 作为底层 Web 框架
- Serverless(阿里云函数计算、AWS Lambda、腾讯云 SCF)
- 微服务(gRPC、Dubbo.js)
- Socket.IO 实时服务
切换运行时只需替换入口组件,业务层代码无感。
装饰器驱动的开发体验
从路由、参数校验、AOP 拦截到日志、事务,Midway 都提供了对应的装饰器:
@Post('/create')
@Validate()
async create(@Body() body: CreateUserDTO) {
return await this.userService.create(body);
}快速上手
初始化项目
npm init midway@latest -y根据交互式选择 Web 脚手架(推荐 koa-v3),即可生成目录结构:
src/
├── config/
│ ├── config.default.ts
│ └── config.prod.ts
├── controller/
│ └── api.controller.ts
├── service/
├── middleware/
├── configuration.ts
└── interface.ts启动开发
npm run dev # 开发模式,自动监听
npm run build # 编译 TS
npm start # 生产模式启动编写一个接口
// src/controller/api.controller.ts
import { Controller, Get, Inject } from '@midwayjs/core';
import { Context } from '@midwayjs/koa';
@Controller('/api')
export class APIController {
@Inject()
ctx: Context;
@Get('/hello')
async hello() {
return { message: 'Hello Midway' };
}
}访问 http://localhost:7001/api/hello 即可看到返回结果。
生态与周边
Midway 官方维护了相当完整的组件生态:
| 类型 | 组件 |
|---|---|
| Web 框架 | @midwayjs/koa、@midwayjs/express、@midwayjs/egg |
| ORM | @midwayjs/typeorm、@midwayjs/sequelize、@midwayjs/prisma |
| 缓存 | @midwayjs/redis、@midwayjs/cache-manager |
| 任务 | @midwayjs/bull、@midwayjs/task |
| 校验 | @midwayjs/validate(基于 Joi) |
| RPC | @midwayjs/grpc、@midwayjs/rabbitmq |
| Serverless | @midwayjs/faas |
| 全栈 | @midwayjs/hooks(React + Midway 一体化) |
适用场景
- 中大型 Node.js 企业应用(需要清晰的分层和依赖管理)
- 同时需要部署到传统服务器与 Serverless 的项目
- 深度使用 TypeScript 的团队
- 需要构建微服务体系的 Node 后端
与同类框架对比
| 对比项 | Midway | NestJS | Egg.js | Koa |
|---|---|---|---|---|
| 语言 | TypeScript(原生) | TypeScript(原生) | JS/TS 皆可 | JS |
| 架构 | IoC + 组件化 | IoC + 模块化 | 约定式插件 | 中间件 |
| 多运行时 | ✅ 内置支持 Serverless | ❌ 需手动适配 | ❌ | ❌ |
| 生态 | 阿里系 + 自建组件 | 社区最大 | 蚂蚁内部生态 | 最小 |
| 学习成本 | 中 | 中 | 中 | 低 |
简单来说:
- 喜欢 Spring 风格、希望深度拥抱 TS → NestJS 或 Midway
- 需要 Serverless / 多运行时 → Midway
- 只做简单 Web 服务 → Koa / Express
