Release 4.0.0
今天,我们正式发布 Midway 4.0。
这是一次跨度很大的版本升级。它不是一次“把版本号从 3 改成 4”的常规发布,而是一次面向未来几年 Node.js 服务研发方式的重新整理:更清晰的启动机制、更统一的函数式能力、更明确的组件边界,以及更适合现代全栈协作的开发体验。
今天,我们正式发布 Midway 4.0。
这是一次跨度很大的版本升级。它不是一次“把版本号从 3 改成 4”的常规发布,而是一次面向未来几年 Node.js 服务研发方式的重新整理:更清晰的启动机制、更统一的函数式能力、更明确的组件边界,以及更适合现代全栈协作的开发体验。
这是 Midway 4.0 的第十个 beta 版本。
本次版本新增一次性脚本执行组件与 commander 命令行组件,并补充了相关文档说明。
新增 @midwayjs/one-shot 组件,用于在应用启动后执行一次性脚本逻辑,支持在 onServerReady 生命周期中触发。
示例:
import { Configuration, Inject } from '@midwayjs/core';
import * as oneShot from '@midwayjs/one-shot';
import { Framework } from '@midwayjs/one-shot';
import { SyncUserScript } from './script/syncUser';
@Configuration({
imports: [oneShot],
})
export class MainConfiguration {
@Inject()
framework: Framework;
async onServerReady() {
await this.framework.runScript(SyncUserScript, { id: 42 });
}
}
更多说明请参考 单次执行组件文档。
新增 @midwayjs/commander 命令行组件,提供命令注册、参数解析、上下文创建与中间件链支持,并内置基于 enquirer 的交互式提问能力。
示例:
import { Command, CommandRunner } from '@midwayjs/commander';
@Command({ name: 'hello', arguments: '<name>' })
export class HelloCommand implements CommandRunner {
async run([name]: string[]) {
return `hello ${name}`;
}
}
更多说明请参考 Commander 组件文档。
这是 Midway 4.0 的第九个 beta 版本。
在这个版本中,我们新增了基于 piscina 的后台任务组件,支持 CPU 密集型任务的处理,同时升级 Zod 至 v4 版本,并修复了 Swagger UI 等问题。
我们新增了 @midwayjs/piscina 组件,基于 piscina 封装,提供了多线程后台任务处理能力。这使得 Midway 应用可以轻松处理 CPU 密集型任务,而不会阻塞主线程。
你可以使用装饰器快速定义一个后台任务:
import { IPiscinaTask, PiscinaTask } from '@midwayjs/piscina';
/**
* 计算任务
*/
@PiscinaTask('calculate')
export class CalculateTask implements IPiscinaTask {
async execute(payload: { a: number; b: number; operation: 'multiply' | 'add' }) {
const { a = 0, b = 0, operation = 'multiply' } = payload || {};
if (operation === 'multiply') {
return a * b;
} else {
return a + b;
}
}
}
并在服务中调用它:
@Inject()
piscinaFramework: PiscinaFramework;
// ...
const result = await this.piscinaFramework.runTask('calculate', {
a: 10,
b: 20,
operation: 'add'
});
更多详细用法请参考 Piscina 组件文档。
我们升级了验证组件以支持 Zod v4 版本,现在你可以使用 Zod v4 的新特性来进行参数校验。
displayOptions 渲染字符串的问题bullmq 至 v5.66.4express 至 v4.22.1grpc-js 至 v1.14.3这是全新的 Midway 4.0 的第二个 beta 版本。
在这个版本中,我们带来了一些重要的新功能和改进,主要包括 MCP 组件的全面支持以及 mock 组件的测试体验优化。
我们正式加入了对 MCP 的完整支持。MCP 是由 Anthropic 开发的开放标准协议,用于将 AI 模型与外部数据源和工具安全连接。
Midway 现在提供了:
使用 Midway 可以快速创建 MCP 服务,为 AI 应用程序提供标准化的数据访问和工具调用接口。
import { Tool, IMcpTool } from '@midwayjs/mcp';
import { z } from 'zod';
@Tool('databaes-tool', {
description: 'A tool to query user information from the database',
inputSchema: {
name: z.string().describe('name to query'),
}
})
export class DatabaseTool implements IMcpTool {
async execute(args: { name: string }) {
// 模拟数据库查询
return {
content: [{
type: 'text',
text: [{ id: 1, name: args.name }]
}],
}
}
}
更多关于 MCP 的详细使用方法和配置选项,请参考 MCP 组件文档。
针对开发者测试体验的优化,我们为 mock 组件的 createApp 方法增加了完整的生命周期支持:
onReady、onStop、onConfigLoad、onServerReady、onHealthCheck 等生命周期钩子这些改进让测试代码能够更准确地反映真实运行环境的行为,提升测试的可靠性。
const app = await createApp(join(__dirname, 'fixtures', 'base-app'), {
onReady: async () => {
console.log('应用准备就绪');
},
onStop: async () => {
console.log('应用停止');
}
});
这是全新的 Midway 4.0 的变化,这是一个非常重大的版本。
index.ts,configuration.ts,以及 package.json 中 main 定义的路径functional 路径,如 @midwayjs/core/functionalPipeline 相关的能力validate 或者 validation 组件开启时生效onReady 等生命周期现在增加了超时机制,默认 30s@Configuration 同样功能的 defineConfiguration 方法useContext, useLogger, useInject, useConfig, useApp, useMainApp 等functional 目录中,使用子模块方式导出DecoratorManager,增加新的 MetadataManager,增加了更加方便的聚合和拷贝元数据的能力@MainApp() 代替 @App() 空参数@Config(ALL) 替换为更为明确的 @AllConfig() 装饰器@Configuration 中的 conflictCheck 和 detectorOptions, 这些配置将移动到 detector 中DecoratorManager 中的 listPrelaodModules 调整为 listPreStartModule,savePreloadModule 调整为 savePreStartModule ,使其语义更加明确container.get 和 container.getAsync 的一部分无用的参数registerObject 的对象存储的位置一致了BaseFramework 移除了令人疑惑的 container 相关 hook 方法,现在都统一使用 applicationInitializeMidwayFrameworkType,以及对应的 getFrameworkType() 方法contextLoggerApplyLogger 和 contextLoggerFormat 配置,现在如果要配置框架特定的 logger,使用 setFrameworkLoggerName 方法ServiceFactory 和 DataSourceManager 现在启动可以通过 initClients 的参数 concurrent 支持并发,由组件自行控制是否支持DataSourceManager 原有的 cacheInstance 和 validateConnection 选项废弃MidwayConfigServce 在获取配置时可以增加默认值consul 、redis 、etcd 的实现@midwayjs/core,不再单独提供 4.x 版本axios 导出socket.io-redis@Rule 作为类装饰器的功能@Rule 参数传递类本身的功能createLegacyApp,createLegacyLightApp,createLegacyFunctionApp ,对应之前的 createApp,createLightApp, createFunctionAppcreateApp,createLightApp, createFunctionApp 方法的最后一个参数,现在额外指定组件可以写到 options.imports 中@BaseTablevalidateConnection,如有需求,可以在配置中单独开启