From efbbd039136c50b18e0d647e5bd6678d0b57835b Mon Sep 17 00:00:00 2001 From: hustcc Date: Sat, 24 May 2025 16:19:27 +0800 Subject: [PATCH 1/4] chore: v5.0.48 --- packages/g6/package.json | 2 +- packages/g6/src/version.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/g6/package.json b/packages/g6/package.json index c743a811818..bcc3415f0bb 100644 --- a/packages/g6/package.json +++ b/packages/g6/package.json @@ -1,6 +1,6 @@ { "name": "@antv/g6", - "version": "5.0.47", + "version": "5.0.48", "description": "A Graph Visualization Framework in JavaScript", "keywords": [ "antv", diff --git a/packages/g6/src/version.ts b/packages/g6/src/version.ts index 538e0d03898..f69ddab6ea8 100644 --- a/packages/g6/src/version.ts +++ b/packages/g6/src/version.ts @@ -1 +1 @@ -export const version = '5.0.47'; +export const version = '5.0.48'; From e99261b44a32520763045a618cd5db294335fe2a Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 10 Jun 2025 15:06:56 +0200 Subject: [PATCH 2/4] perf(bubble-sets): optimize path update with deferred execution logic --- packages/g6/src/plugins/bubble-sets.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/packages/g6/src/plugins/bubble-sets.ts b/packages/g6/src/plugins/bubble-sets.ts index 2d76f207403..e74c9127073 100644 --- a/packages/g6/src/plugins/bubble-sets.ts +++ b/packages/g6/src/plugins/bubble-sets.ts @@ -63,6 +63,10 @@ export class BubbleSets extends BasePlugin { private bubbleSetOptions: IBubbleSetOptions = {}; + private shallRunUpdateBubbleSetsPath = false; + + private pendingRunUpdateBubbleSetsPath = false; + static defaultOptions: Partial = { members: [], avoidMembers: [], @@ -125,6 +129,20 @@ export class BubbleSets extends BasePlugin { }; private updateBubbleSetsPath = (event: ElementLifeCycleEvent) => { + if (!this.shallRunUpdateBubbleSetsPath) { + if (!this.pendingRunUpdateBubbleSetsPath) { + this.pendingRunUpdateBubbleSetsPath = true; + setTimeout(() => { + this.shallRunUpdateBubbleSetsPath = true; + this.updateBubbleSetsPath(event); + }); + } + return; + } + + this.pendingRunUpdateBubbleSetsPath = false; + this.shallRunUpdateBubbleSetsPath = false; + if (!this.shape) return; const id = idOf(event.data); if (![...this.options.members, ...this.options.avoidMembers].includes(id)) return; From b9770dd2ec3f8a5f6617e7495c0768ea9f6bdc04 Mon Sep 17 00:00:00 2001 From: Matthias Date: Wed, 11 Jun 2025 11:42:14 +0200 Subject: [PATCH 3/4] fix(bubble-sets): restore original version number --- packages/g6/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/g6/package.json b/packages/g6/package.json index bcc3415f0bb..c743a811818 100644 --- a/packages/g6/package.json +++ b/packages/g6/package.json @@ -1,6 +1,6 @@ { "name": "@antv/g6", - "version": "5.0.48", + "version": "5.0.47", "description": "A Graph Visualization Framework in JavaScript", "keywords": [ "antv", From 40643c59c23ad2f9fe8dd553306d49959e6403e2 Mon Sep 17 00:00:00 2001 From: Aaron Date: Thu, 27 Nov 2025 15:23:54 +0800 Subject: [PATCH 4/4] fix(plugins): optimize bubble sets --- packages/g6/src/plugins/bubble-sets.ts | 64 +++++++++++++++----------- 1 file changed, 37 insertions(+), 27 deletions(-) diff --git a/packages/g6/src/plugins/bubble-sets.ts b/packages/g6/src/plugins/bubble-sets.ts index e74c9127073..f3a87e365f5 100644 --- a/packages/g6/src/plugins/bubble-sets.ts +++ b/packages/g6/src/plugins/bubble-sets.ts @@ -51,11 +51,11 @@ export interface BubbleSetsOptions extends BasePluginOptions, IBubbleSetOptions, * The principle is to represent sets by creating a shape similar to a bubble. Each set is represented by a unique "bubble", and the elements in the set are contained within this bubble. If two sets have an intersection, then the two bubbles will have an overlapping part, which represents the intersection of the two sets. */ export class BubbleSets extends BasePlugin { - private shape!: Contour; + private shape?: Contour; private bubbleSets!: BubbleSetsJS; - private path!: PathArray; + private path: PathArray | null = null; private members: Map = new Map(); @@ -63,10 +63,6 @@ export class BubbleSets extends BasePlugin { private bubbleSetOptions: IBubbleSetOptions = {}; - private shallRunUpdateBubbleSetsPath = false; - - private pendingRunUpdateBubbleSetsPath = false; - static defaultOptions: Partial = { members: [], avoidMembers: [], @@ -94,8 +90,9 @@ export class BubbleSets extends BasePlugin { private init() { this.bubbleSets = new BubbleSetsJS(this.options); - this.members = new Map(); - this.avoidMembers = new Map(); + this.members.clear(); + this.avoidMembers.clear(); + this.path = null; } private parseOptions() { @@ -129,20 +126,6 @@ export class BubbleSets extends BasePlugin { }; private updateBubbleSetsPath = (event: ElementLifeCycleEvent) => { - if (!this.shallRunUpdateBubbleSetsPath) { - if (!this.pendingRunUpdateBubbleSetsPath) { - this.pendingRunUpdateBubbleSetsPath = true; - setTimeout(() => { - this.shallRunUpdateBubbleSetsPath = true; - this.updateBubbleSetsPath(event); - }); - } - return; - } - - this.pendingRunUpdateBubbleSetsPath = false; - this.shallRunUpdateBubbleSetsPath = false; - if (!this.shape) return; const id = idOf(event.data); if (![...this.options.members, ...this.options.avoidMembers].includes(id)) return; @@ -157,8 +140,21 @@ export class BubbleSets extends BasePlugin { const currAvoidMembers = this.options.avoidMembers; const prevAvoidMembers = [...this.avoidMembers.keys()]; - if (!forceUpdateId && isEqual(currMembers, prevMembers) && isEqual(currAvoidMembers, prevAvoidMembers)) + if (currMembers.length === 0 && currAvoidMembers.length === 0) { + this.members.clear(); + this.avoidMembers.clear(); + this.path = [] as unknown as PathArray; + return this.path; + } + + if ( + !forceUpdateId && + this.path && + isEqual(currMembers, prevMembers) && + isEqual(currAvoidMembers, prevAvoidMembers) + ) { return this.path; + } const { enter: membersToEnter = [], exit: membersToExit = [] } = arrayDiff(prevMembers, currMembers, (d) => d); const { enter: avoidMembersToEnter = [], exit: avoidMembersToExit = [] } = arrayDiff( @@ -168,8 +164,17 @@ export class BubbleSets extends BasePlugin { ); if (forceUpdateId) { - membersToExit.push(forceUpdateId); - membersToEnter.push(forceUpdateId); + const isMemberNow = currMembers.includes(forceUpdateId); + const isAvoidNow = currAvoidMembers.includes(forceUpdateId); + + if (isMemberNow) { + membersToExit.push(forceUpdateId); + membersToEnter.push(forceUpdateId); + } + if (isAvoidNow) { + avoidMembersToExit.push(forceUpdateId); + avoidMembersToEnter.push(forceUpdateId); + } } const updateBubbleSets = (ids: ID[], isEntering: boolean, isMember: boolean) => { @@ -265,7 +270,7 @@ export class BubbleSets extends BasePlugin { */ public addAvoidMember(avoidMembers: ID | ID[]) { const avoidMembersToAdd = Array.isArray(avoidMembers) ? avoidMembers : [avoidMembers]; - if (avoidMembersToAdd.some((AvoidMember) => this.options.members.includes(AvoidMember))) { + if (avoidMembersToAdd.some((avoidMember) => this.options.members.includes(avoidMember))) { this.options.members = this.options.members.filter((id) => !avoidMembersToAdd.includes(id)); } this.options.avoidMembers = [...new Set([...this.options.avoidMembers, ...avoidMembersToAdd])]; @@ -312,7 +317,12 @@ export class BubbleSets extends BasePlugin { public destroy(): void { this.context.graph.off(GraphEvent.AFTER_RENDER, this.drawBubbleSets); this.context.graph.off(GraphEvent.AFTER_ELEMENT_UPDATE, this.updateBubbleSetsPath); - this.shape.destroy(); + + if (this.shape) { + this.shape.destroy(); + this.shape = undefined; + } + super.destroy(); } }