From: 三咲智子 Kevin Deng Date: Wed, 6 Dec 2023 17:09:03 +0000 (+0800) Subject: perf(compiler-vapor): combine effect X-Git-Tag: v3.6.0-alpha.1~16^2~736 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8786c076d9dbf584dcd484852d88e977bbe676e3;p=thirdparty%2Fvuejs%2Fcore.git perf(compiler-vapor): combine effect --- diff --git a/packages/compiler-vapor/__tests__/__snapshots__/compile.test.ts.snap b/packages/compiler-vapor/__tests__/__snapshots__/compile.test.ts.snap index 893ffc05b2..92164b0136 100644 --- a/packages/compiler-vapor/__tests__/__snapshots__/compile.test.ts.snap +++ b/packages/compiler-vapor/__tests__/__snapshots__/compile.test.ts.snap @@ -328,14 +328,8 @@ export function render(_ctx) { _on(n4, "click", (...args) => (_ctx.handleClick && _ctx.handleClick(...args))) _effect(() => { _setText(n1, undefined, _ctx.count) - }) - _effect(() => { _setText(n2, undefined, _ctx.count) - }) - _effect(() => { _setText(n3, undefined, _ctx.count) - }) - _effect(() => { _setAttr(n4, "id", undefined, _ctx.count) }) return n0 diff --git a/packages/compiler-vapor/src/transform.ts b/packages/compiler-vapor/src/transform.ts index 4496df6e6a..a5fa40ef27 100644 --- a/packages/compiler-vapor/src/transform.ts +++ b/packages/compiler-vapor/src/transform.ts @@ -113,11 +113,28 @@ function createRootContext( ) { return this.registerOperation(...operations) } - // TODO combine effects - effect.push({ - expressions: expressions as IRExpression[], - operations, - }) + const existing = effect.find((e) => + isSameExpression(e.expressions, expressions as IRExpression[]), + ) + if (existing) { + existing.operations.push(...operations) + } else { + effect.push({ + expressions: expressions as IRExpression[], + operations, + }) + } + + function isSameExpression(a: IRExpression[], b: IRExpression[]) { + if (a.length !== b.length) return false + return a.every( + (exp, i) => identifyExpression(exp) === identifyExpression(b[i]), + ) + } + + function identifyExpression(exp: IRExpression) { + return typeof exp === 'string' ? exp : exp.content + } }, template: '',