From 7519825303d8a569151b1156094af93263fc8aef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Tue, 18 Jun 2024 23:23:19 +0800 Subject: [PATCH] refactor: test --- src/common/utils/helper.ts | 81 +++++++++++++++++++++++--------------- vite.config.ts | 2 +- 2 files changed, 50 insertions(+), 33 deletions(-) diff --git a/src/common/utils/helper.ts b/src/common/utils/helper.ts index cb902299..5a984ff3 100644 --- a/src/common/utils/helper.ts +++ b/src/common/utils/helper.ts @@ -62,41 +62,58 @@ export function simpleDecorator(target: any, context: any) { // return CacheClassFuncDecoratorInternal; // } // } - -export function CacheClassFuncAsync(ttl: number = 3600 * 1000, customKey: string = ''): any { - const cache = new Map(); - - // 注意:在JavaScript装饰器中,我们通常不直接处理ClassMethodDecoratorContext这样的类型, - // 因为装饰器的参数通常是目标类(对于类装饰器)、属性名(对于属性装饰器)等。 - // 对于方法装饰器,我们关注的是方法本身及其描述符。 - // 但这里我们维持原逻辑,假设有一个自定义的处理上下文的方式。 - - return function (originalMethod: Function): any { - // 由于JavaScript装饰器原生不支持异步直接定义,我们保持async定义以便处理异步方法。 - async function decoratorWrapper(this: any, ...args: any[]): Promise { - const key = `${customKey}${originalMethod.name}.(${args.map(arg => JSON.stringify(arg)).join(', ')})`; - const cachedValue = cache.get(key); - // 遍历cache 清除expiry内容 - cache.forEach((value, key) => { - if (value.expiry < Date.now()) { - cache.delete(key); - } - }); - if (cachedValue && cachedValue.expiry > Date.now()) { - return cachedValue.value; - } - - // 直接await异步方法的结果 - const result = await originalMethod.apply(this, args); - cache.set(key, { expiry: Date.now() + ttl, value: result }); +export function CacheClassFuncAsync(ttl: number = 3600 * 1000, customKey: string = '') { + console.log('CacheClassFuncAsync', ttl, customKey); + function logExecutionTime(target: any, methodName: string, descriptor: PropertyDescriptor) { + console.log('logExecutionTime', target, methodName, descriptor); + const originalMethod = descriptor.value; + descriptor.value = function (...args: any[]) { + const start = Date.now(); + const result = originalMethod.apply(this, args); + const end = Date.now(); + console.log(`Method ${methodName} executed in ${end - start} ms.`); return result; - } - - // 返回装饰后的方法,保持与原方法相同的名称和描述符(如果需要更精细的控制,可以考虑使用Object.getOwnPropertyDescriptor等) - return decoratorWrapper; - }; + }; + } + return logExecutionTime; } +// export function CacheClassFuncAsync(ttl: number = 3600 * 1000, customKey: string = ''): any { +// const cache = new Map(); + +// // 注意:在JavaScript装饰器中,我们通常不直接处理ClassMethodDecoratorContext这样的类型, +// // 因为装饰器的参数通常是目标类(对于类装饰器)、属性名(对于属性装饰器)等。 +// // 对于方法装饰器,我们关注的是方法本身及其描述符。 +// // 但这里我们维持原逻辑,假设有一个自定义的处理上下文的方式。 + +// return function (originalMethod: Function): any { +// console.log(originalMethod); +// // 由于JavaScript装饰器原生不支持异步直接定义,我们保持async定义以便处理异步方法。 +// async function decoratorWrapper(this: any, ...args: any[]): Promise { +// console.log(...args); +// const key = `${customKey}${originalMethod.name}.(${args.map(arg => JSON.stringify(arg)).join(', ')})`; +// const cachedValue = cache.get(key); +// // 遍历cache 清除expiry内容 +// cache.forEach((value, key) => { +// if (value.expiry < Date.now()) { +// cache.delete(key); +// } +// }); +// if (cachedValue && cachedValue.expiry > Date.now()) { +// return cachedValue.value; +// } + +// // 直接await异步方法的结果 +// const result = await originalMethod.apply(this, args); +// cache.set(key, { expiry: Date.now() + ttl, value: result }); +// return result; +// } + +// // 返回装饰后的方法,保持与原方法相同的名称和描述符(如果需要更精细的控制,可以考虑使用Object.getOwnPropertyDescriptor等) +// return decoratorWrapper; +// }; +// } + /** * 函数缓存装饰器,根据方法名、参数、自定义key生成缓存键,在一定时间内返回缓存结果 * @param ttl 超时时间,单位毫秒 diff --git a/vite.config.ts b/vite.config.ts index 89cfd576..51fda028 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -40,7 +40,7 @@ if (process.env.NAPCAT_BUILDSYS == 'linux') { const baseConfigPlugin: PluginOption[] = [ // PreprocessorDirectives(), babel({ - filter: /.*\.(ts)$/, + filter: /.*\.(ts|js)$/, babelConfig: { babelrc: false, configFile: false,