diff --git a/packages/uni-app/__tests__/module.spec.ts b/packages/uni-app/__tests__/module.spec.ts index 74dc1738c87346be7500dba9a1d4e8ac6c04bb71..ca7018e825513f3ec56482ab81d2baf04728c85d 100644 --- a/packages/uni-app/__tests__/module.spec.ts +++ b/packages/uni-app/__tests__/module.spec.ts @@ -86,7 +86,7 @@ describe('uts-module', () => { const wifi = new WifiManager() wifi.preparePermission(1, 2, 3, () => {}) wifi.count - wifi.staticCount - wifi.staticPreparePermission(1) + WifiManager.staticCount + WifiManager.staticPreparePermission(1) }) }) diff --git a/packages/uni-app/dist/uni-app.cjs.js b/packages/uni-app/dist/uni-app.cjs.js index b19cae7118902c04f7869fdd7ff898726bacf59a..2b6cdbdd96f2aa33fac65b749a35c12cf83b3a6c 100644 --- a/packages/uni-app/dist/uni-app.cjs.js +++ b/packages/uni-app/dist/uni-app.cjs.js @@ -169,7 +169,7 @@ function resolveSyncResult(res) { function invokePropGetter(args) { return resolveSyncResult(getProxy().invokeSync(args, () => { })); } -function initProxyFunction(async, { package: pkg, class: cls, name: propOrMethod, id: instanceId, }) { +function initProxyFunction(async, { package: pkg, class: cls, name: propOrMethod, id: instanceId, companion, }) { const invokeCallback = ({ id, name, params, keepAlive, }) => { const callback = callbacks[id]; if (callback) { @@ -188,6 +188,7 @@ function initProxyFunction(async, { package: pkg, class: cls, name: propOrMethod package: pkg, class: cls, name: propOrMethod, + companion, }; return (...args) => { const invokeArgs = shared.extend({}, baseArgs, { @@ -222,7 +223,7 @@ function initUtsProxyClass({ package: pkg, class: cls, methods, props, staticPro package: pkg, class: cls, }; - return class ProxyClass { + const ProxyClass = class UtsClass { constructor(...params) { const target = {}; // 初始化实例 ID @@ -237,24 +238,33 @@ function initUtsProxyClass({ package: pkg, class: cls, methods, props, staticPro name, }, baseOptions)); } - else if (shared.hasOwn(staticMethods, name)) { - // 静态方法 - target[name] = initUtsStaticMethod(!!staticMethods[name].async, shared.extend({ name, companion: true }, baseOptions)); - } else if (props.includes(name)) { // 实例属性 return invokePropGetter({ id: instanceId, name: name }); } - else if (staticProps.includes(name)) { - // 静态属性 - return invokePropGetter(shared.extend({ name: name, companion: true }, baseOptions)); - } } return target[name]; }, }); } }; + const staticMethodCache = {}; + return new Proxy(ProxyClass, { + get(target, name, receiver) { + if (shared.hasOwn(staticMethods, name)) { + if (!staticMethodCache[name]) { + // 静态方法 + staticMethodCache[name] = initUtsStaticMethod(!!staticMethods[name].async, shared.extend({ name, companion: true }, baseOptions)); + } + return staticMethodCache[name]; + } + if (staticProps.includes(name)) { + // 静态属性 + return invokePropGetter(shared.extend({ name: name, companion: true }, baseOptions)); + } + return Reflect.get(target, name, receiver); + }, + }); } exports.getCurrentSubNVue = getCurrentSubNVue; diff --git a/packages/uni-app/dist/uni-app.es.js b/packages/uni-app/dist/uni-app.es.js index ccc9e600fb609e0b4d6e4809591846a226364d97..ecd7042504491005f945f5ccdf68565e327cb901 100644 --- a/packages/uni-app/dist/uni-app.es.js +++ b/packages/uni-app/dist/uni-app.es.js @@ -137,7 +137,7 @@ function resolveSyncResult(res) { function invokePropGetter(args) { return resolveSyncResult(getProxy().invokeSync(args, () => { })); } -function initProxyFunction(async, { package: pkg, class: cls, name: propOrMethod, id: instanceId, }) { +function initProxyFunction(async, { package: pkg, class: cls, name: propOrMethod, id: instanceId, companion, }) { const invokeCallback = ({ id, name, params, keepAlive, }) => { const callback = callbacks[id]; if (callback) { @@ -156,6 +156,7 @@ function initProxyFunction(async, { package: pkg, class: cls, name: propOrMethod package: pkg, class: cls, name: propOrMethod, + companion, }; return (...args) => { const invokeArgs = extend({}, baseArgs, { @@ -190,7 +191,7 @@ function initUtsProxyClass({ package: pkg, class: cls, methods, props, staticPro package: pkg, class: cls, }; - return class ProxyClass { + const ProxyClass = class UtsClass { constructor(...params) { const target = {}; // 初始化实例 ID @@ -205,24 +206,33 @@ function initUtsProxyClass({ package: pkg, class: cls, methods, props, staticPro name, }, baseOptions)); } - else if (hasOwn(staticMethods, name)) { - // 静态方法 - target[name] = initUtsStaticMethod(!!staticMethods[name].async, extend({ name, companion: true }, baseOptions)); - } else if (props.includes(name)) { // 实例属性 return invokePropGetter({ id: instanceId, name: name }); } - else if (staticProps.includes(name)) { - // 静态属性 - return invokePropGetter(extend({ name: name, companion: true }, baseOptions)); - } } return target[name]; }, }); } }; + const staticMethodCache = {}; + return new Proxy(ProxyClass, { + get(target, name, receiver) { + if (hasOwn(staticMethods, name)) { + if (!staticMethodCache[name]) { + // 静态方法 + staticMethodCache[name] = initUtsStaticMethod(!!staticMethods[name].async, extend({ name, companion: true }, baseOptions)); + } + return staticMethodCache[name]; + } + if (staticProps.includes(name)) { + // 静态属性 + return invokePropGetter(extend({ name: name, companion: true }, baseOptions)); + } + return Reflect.get(target, name, receiver); + }, + }); } export { getCurrentSubNVue, getSsrGlobalData, initUtsProxyClass, initUtsProxyFunction, onAddToFavorites, onBackPress, onError, onHide, onInit, onLaunch, onLoad, onNavigationBarButtonTap, onNavigationBarSearchInputChanged, onNavigationBarSearchInputClicked, onNavigationBarSearchInputConfirmed, onNavigationBarSearchInputFocusChanged, onPageNotFound, onPageScroll, onPullDownRefresh, onReachBottom, onReady, onResize, onSaveExitState, onShareAppMessage, onShareTimeline, onShow, onTabItemTap, onThemeChange, onUnhandledRejection, onUnload, requireNativePlugin, resolveEasycom, shallowSsrRef, ssrRef }; diff --git a/packages/uni-app/src/uts.ts b/packages/uni-app/src/uts.ts index b698885589565a4e929a70f57033a2128461ac1b..7637a59554a6c979cbd3fbd72683ba85cff38185 100644 --- a/packages/uni-app/src/uts.ts +++ b/packages/uni-app/src/uts.ts @@ -133,6 +133,10 @@ interface InitProxyFunctionOptions { * 属性名或方法名 */ name: string + /** + * 是否伴生对象 + */ + companion?: boolean /** * 实例 ID */ @@ -146,6 +150,7 @@ function initProxyFunction( class: cls, name: propOrMethod, id: instanceId, + companion, }: InitProxyFunctionOptions ) { const invokeCallback = ({ @@ -170,6 +175,7 @@ function initProxyFunction( package: pkg, class: cls, name: propOrMethod, + companion, } return (...args: unknown[]) => { const invokeArgs = extend({}, baseArgs, { @@ -198,6 +204,7 @@ function initUtsStaticMethod(async: boolean, opts: ProxyBaseOptions) { return initProxyFunction(async, opts) } export const initUtsProxyFunction = initUtsStaticMethod + export function initUtsProxyClass({ package: pkg, class: cls, @@ -210,7 +217,7 @@ export function initUtsProxyClass({ package: pkg, class: cls, } - return class ProxyClass { + const ProxyClass = class UtsClass { constructor(...params: unknown[]) { const target: Record = {} // 初始化实例 ID @@ -234,20 +241,9 @@ export function initUtsProxyClass({ baseOptions ) ) - } else if (hasOwn(staticMethods, name)) { - // 静态方法 - target[name] = initUtsStaticMethod( - !!staticMethods[name].async, - extend({ name, companion: true }, baseOptions) - ) } else if (props.includes(name as string)) { // 实例属性 return invokePropGetter({ id: instanceId, name: name as string }) - } else if (staticProps.includes(name as string)) { - // 静态属性 - return invokePropGetter( - extend({ name: name as string, companion: true }, baseOptions) - ) } } return target[name as string] @@ -255,4 +251,26 @@ export function initUtsProxyClass({ }) } } + const staticMethodCache: Record = {} + return new Proxy(ProxyClass, { + get(target, name, receiver) { + if (hasOwn(staticMethods, name)) { + if (!staticMethodCache[name as string]) { + // 静态方法 + staticMethodCache[name] = initUtsStaticMethod( + !!staticMethods[name].async, + extend({ name, companion: true }, baseOptions) + ) + } + return staticMethodCache[name] + } + if (staticProps.includes(name as string)) { + // 静态属性 + return invokePropGetter( + extend({ name: name as string, companion: true }, baseOptions) + ) + } + return Reflect.get(target, name, receiver) + }, + }) } diff --git a/packages/uts-darwin-arm64/uts.darwin-arm64.node b/packages/uts-darwin-arm64/uts.darwin-arm64.node index 3a2482035854a3ff9924edb583faa96d661cf688..667b58c095a602cb00ac906c92b17de09d117000 100755 Binary files a/packages/uts-darwin-arm64/uts.darwin-arm64.node and b/packages/uts-darwin-arm64/uts.darwin-arm64.node differ diff --git a/packages/uts-darwin-x64/uts.darwin-x64.node b/packages/uts-darwin-x64/uts.darwin-x64.node index 1d33b58bc6206bc87f55631aac7c218751404aa0..e7b40574159b031950758838e563bdca72d20567 100755 Binary files a/packages/uts-darwin-x64/uts.darwin-x64.node and b/packages/uts-darwin-x64/uts.darwin-x64.node differ