降级es2020,实现 WeakRef Polyfill

This commit is contained in:
YHH
2025-10-11 00:25:10 +08:00
parent 7850fc610c
commit 9068a109b0
2 changed files with 57 additions and 8 deletions

View File

@@ -5,11 +5,60 @@ import { createLogger } from '../../Utils/Logger';
const logger = createLogger('ReferenceTracker'); const logger = createLogger('ReferenceTracker');
/**
* WeakRef 接口定义
*
* 用于 ES2020 环境下的类型定义
*/
interface IWeakRef<T extends object> {
deref(): T | undefined;
}
/**
* WeakRef Polyfill for ES2020 compatibility
*
* 为了兼容 Cocos Creator、Laya、微信小游戏等目标平台仅支持 ES2020
* 提供 WeakRef 的 Polyfill 实现。
*
* - 现代浏览器:自动使用原生 WeakRef (自动 GC)
* - 旧环境:使用 Polyfill (无自动 GC但 Scene 销毁时会手动清理)
*/
class WeakRefPolyfill<T extends object> implements IWeakRef<T> {
private _target: T;
constructor(target: T) {
this._target = target;
}
deref(): T | undefined {
return this._target;
}
}
/**
* WeakRef 构造函数类型
*/
interface IWeakRefConstructor {
new <T extends object>(target: T): IWeakRef<T>;
}
/**
* WeakRef 实现
*
* 优先使用原生 WeakRef不支持时降级到 Polyfill
*/
const WeakRefImpl: IWeakRefConstructor = (
(typeof globalThis !== 'undefined' && (globalThis as any).WeakRef) ||
(typeof global !== 'undefined' && (global as any).WeakRef) ||
(typeof window !== 'undefined' && (window as any).WeakRef) ||
WeakRefPolyfill
) as IWeakRefConstructor;
/** /**
* Entity引用记录 * Entity引用记录
*/ */
export interface EntityRefRecord { export interface EntityRefRecord {
component: WeakRef<Component>; component: IWeakRef<Component>;
propertyKey: string; propertyKey: string;
} }
@@ -18,7 +67,7 @@ export interface EntityRefRecord {
* *
* 使用全局Map记录每个Entity ID对应的Scene用于装饰器通过Component.entityId查找Scene。 * 使用全局Map记录每个Entity ID对应的Scene用于装饰器通过Component.entityId查找Scene。
*/ */
const globalEntitySceneMap = new Map<number, WeakRef<IScene>>(); const globalEntitySceneMap = new Map<number, IWeakRef<IScene>>();
/** /**
* 通过Entity ID获取Scene * 通过Entity ID获取Scene
@@ -52,7 +101,7 @@ export class ReferenceTracker {
/** /**
* 当前Scene的引用 * 当前Scene的引用
*/ */
private _scene: WeakRef<IScene> | null = null; private _scene: IWeakRef<IScene> | null = null;
/** /**
* 注册Entity引用 * 注册Entity引用
@@ -76,7 +125,7 @@ export class ReferenceTracker {
} }
records.add({ records.add({
component: new WeakRef(component), component: new WeakRefImpl(component),
propertyKey propertyKey
}); });
} }
@@ -229,7 +278,7 @@ export class ReferenceTracker {
* @param scene Scene实例 * @param scene Scene实例
*/ */
public setScene(scene: IScene): void { public setScene(scene: IScene): void {
this._scene = new WeakRef(scene); this._scene = new WeakRefImpl(scene);
} }
/** /**
@@ -239,7 +288,7 @@ export class ReferenceTracker {
* @param scene Scene实例 * @param scene Scene实例
*/ */
public registerEntityScene(entityId: number, scene: IScene): void { public registerEntityScene(entityId: number, scene: IScene): void {
globalEntitySceneMap.set(entityId, new WeakRef(scene)); globalEntitySceneMap.set(entityId, new WeakRefImpl(scene));
} }
/** /**

View File

@@ -1,10 +1,10 @@
{ {
"compilerOptions": { "compilerOptions": {
"target": "ES2021", "target": "ES2020",
"module": "ES2020", "module": "ES2020",
"moduleResolution": "node", "moduleResolution": "node",
"allowImportingTsExtensions": false, "allowImportingTsExtensions": false,
"lib": ["ES2021", "DOM"], "lib": ["ES2020", "DOM"],
"outDir": "./bin", "outDir": "./bin",
"rootDir": "./src", "rootDir": "./src",
"strict": true, "strict": true,