From e76ffc36b68b015636f920783ea4a4909d9fd77d Mon Sep 17 00:00:00 2001 From: Prev Wong Date: Mon, 20 Nov 2023 16:21:33 +0000 Subject: [PATCH] fix: cache root template evaluation (#109) --- .changeset/angry-birds-attack.md | 5 +++++ packages/core/src/evaluator.ts | 34 ++++++++++++++++++++++++++------ 2 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 .changeset/angry-birds-attack.md diff --git a/.changeset/angry-birds-attack.md b/.changeset/angry-birds-attack.md new file mode 100644 index 00000000..4eaf3ba2 --- /dev/null +++ b/.changeset/angry-birds-attack.md @@ -0,0 +1,5 @@ +--- +'@rekajs/core': patch +--- + +Cache root template in component evaluation diff --git a/packages/core/src/evaluator.ts b/packages/core/src/evaluator.ts index 15f5659f..d73c2321 100644 --- a/packages/core/src/evaluator.ts +++ b/packages/core/src/evaluator.ts @@ -11,6 +11,7 @@ import { } from 'mobx'; import { ComponentViewEvaluator } from './component'; +import { DisposableComputation } from './computation'; import { EachDirectiveEvaluator } from './each'; import { Environment } from './environment'; import { computeExpression } from './expression'; @@ -42,6 +43,7 @@ export class Evaluator { private viewObserver: Observer | undefined; private rootTemplate: t.ComponentTemplate; private rootTemplateObserver: Observer; + private declare rootTemplateComputation: DisposableComputation; private tplToView: WeakMap = new WeakMap(); private tplKeyToClassListComputationCache: Map> = @@ -508,18 +510,34 @@ export class Evaluator { return computeExpression(expr, this.reka, env); } + computeRootTemplate() { + if (this.rootTemplateComputation) { + return this.rootTemplateComputation.get(); + } + + this.rootTemplateComputation = new DisposableComputation( + () => + this.computeTemplate(this.rootTemplate, { + path: ['frame'], + env: this.reka.head.env, + owner: null, + componentStack: [], + }), + { + keepAlive: true, + } + ); + + return this.rootTemplateComputation.get(); + } + computeView() { if (!this.reka.loaded) { return; } const _compute = () => { - const views = this.computeTemplate(this.rootTemplate, { - path: ['frame'], - env: this.reka.head.env, - owner: null, - componentStack: [], - }); + const views = this.computeRootTemplate(); return t.assert(views[0], t.RekaComponentView); }; @@ -543,6 +561,10 @@ export class Evaluator { this.viewObserver.dispose(); } + if (this.rootTemplateComputation) { + this.rootTemplateComputation.dispose(); + } + this.rootTemplateObserver.dispose(); this.disposeComponentEvaluators();