如下图所示,使用第三方的 Hooks 包,加速开发。(图中的包为示例代码,实际并不存在)
在 1.0 版中,服务启动时存在大量的编译工作,因此新项目首次启动时间 > 10 秒,并随着后端文件的增加,编译时间也会变长,从而导致了项目越大,开发速度越慢的问题。
1.0 启动流程
而在 2.0 版本中,得益于纯运行时方案,新项目启动与重启时间 < 2 秒,且文件数量的增长并不会影响启动时间。在大型项目中将有效减少等待时间。
同时,由于不再需要编译器,2.0 版本在运行时也不会产生 .faas_debug_tmp 此类的缓存文件夹,项目目录更加整洁。
▐ 单元测试
单元测试是 Midway Hooks 在函数式支持上的一块重要拼图。我们希望你能轻松愉悦的完成应用的测试,就像测试纯函数那么简单。
在新版本中,我们支持 runFunction 与 request 两种测试方式,帮助你快速完成接口的测试。
接口代码
export async function get () {
return { type: ‘GET’ }
}
export async function post (message: string) {
return { type: ‘POST’, message }
}
使用 runFunction 测试
import { createApp } from ‘@midwayjs/hooks-testing-library’;
import { get, post } from ‘./api’
it(‘GET’, async () => {
const app = await createApp();
expect(
await app.runFunction(get);
).toEqual({ type: ‘GET’ });
expect(
await app.runFunction(post, ‘2.0’);
).toEqual({ type: ‘POST’, message: ‘2.0’ });
});
使用 request 执行完整的 HTTP 测试
import { createApp } from ‘@midwayjs/hooks-testing-library’;
import { get, post } from ‘./api’
it(‘GET’, async () => {
const app = await createApp();
const response = await app.request(get)
expect(response.status).toEqual(200)
expect(response.type).toEqual(‘application/json’)
const postResponse = await app.request(post, ‘2.0’)
expect(postResponse.status).toEqual(200)
expect(postResponse.type).toEqual(‘application/json’)
});
对比与传统 Web 应用的测试,你无需关心单元测试的路径、入参、类型提示等。就像测试纯函数一样测试接口。
传统 Web 应用的测试
▐ 插件化与函数式配置
在 1.0 中,我们通过 faas-cli 的插件来为项目启用一体化功能。Midway Hooks 与项目是高度定制化且绑定的。
而在 2.0 中,我们将 Midway Hooks 变为了 Midway 的 Component,你可以在任何 Midway 新版本中,启用 Hooks 功能,而不受项目类型,部署模式的限制。
这也意味着,你不仅可以在一体化项目中使用 Hooks,也可以在纯接口开发或 Midway Web 应用开发时使用 Midway Hooks。
新版本的启用方式
import { hooks, createConfiguration } from ‘@midwayjs/hooks’;
export default createConfiguration({
imports: [hooks()]
});
同时我们也支持了 createConfiguration,支持以函数的方式创建 Midway Configuration,减少 Class 与函数式混用所带来的迷惑感。
▐ Hook 中间件
在 1.0 版本中,我们对单函数中间件做了支持,但中间件依然遵照 Koa 中间件的语法,也无法在内部使用 Hooks,会给使用者带来困扰。
而在 2.0 版本中,我们新增了 Hooks 中间件的支持,同时也支持了全局中间件与文件级中间件。
原有 1.0 版本的单函数中间件依然保持兼容,你可以手动重构从而使用新的语法。
中间件仅有 next 一个参数,ctx 需要通过 useContext 获得。你也可以在中间件中使用任意的 Hooks。
Logger 中间件
import { Context } from ‘@midwayjs/faas’;
import { useContext } from ‘@midwayjs/hooks’;
const logger = async (next: any) => {
const ctx = useContext();
console.log(<-- [${ctx.method}] ${ctx.url}
);
const start = Date.now();
await next();
const cost = Date.now() - start;
console.log([${ctx.method}] ${ctx.url} ${cost}ms
);
};
在 2.0 版本中,Midway Hooks 支持三种形式的中间件,用来覆盖不同的使用诉求。
-
2.0 全局,对所有 Api 调用都生效
-
2.0 文件,对文件内部所有 Api 生效
-
1.0 函数,仅对该 Api 函数生效
全局中间件在 configuration.ts 中定义,可以传入任何框架支持的中间件
import { hooks, createConfiguration } from ‘@midwayjs/hooks’;
import logger from ‘./logger’;
// Global Middleware
export default createConfiguration({
imports: [
hooks({
middleware: [logger],
}),
],
});
文件级中间件在 Api 文件中定义,通过导出 config.middleware,使得其对该文件内所有 Api 函数生效。
import { ApiConfig } from ‘@midwayjs/hooks’;
import logger from ‘./logger’;
// File Level Middleware
export const config: ApiConfig = {
middleware: [logger],
};
export default async (message: string) => {
return { type: ‘POST’, message }
};
▐ 新配置文件项目配置
在 2.0 版本中,我们开放了 Hooks 项目的配置,帮助用户来更好的开发代码。
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
我的面试宝典:一线互联网大厂Java核心面试题库
以下是我个人的一些做法,希望可以给各位提供一些帮助:
整理了很长一段时间,拿来复习面试刷题非常合适,其中包括了Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!
283页的Java进阶核心pdf文档
Java部分:Java基础,集合,并发,多线程,JVM,设计模式
数据结构算法:Java算法,数据结构
开源框架部分:Spring,MyBatis,MVC,netty,tomcat
分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等
微服务部分:SpringBoot,SpringCloud,Dubbo,Docker
还有源码相关的阅读学习
、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!
[外链图片转存中…(img-wAKLnwAQ-1711000453388)]
283页的Java进阶核心pdf文档
Java部分:Java基础,集合,并发,多线程,JVM,设计模式
数据结构算法:Java算法,数据结构
开源框架部分:Spring,MyBatis,MVC,netty,tomcat
分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等
微服务部分:SpringBoot,SpringCloud,Dubbo,Docker
[外链图片转存中…(img-8lODCJBb-1711000453388)]
还有源码相关的阅读学习
[外链图片转存中…(img-PD4ARz5P-1711000453389)]