Skip to content

Commit 114ba6e

Browse files
authored
fix(ssr-compiler): only track attribute mutations during connectedCallback (#4680)
1 parent 402e70b commit 114ba6e

File tree

3 files changed

+29
-11
lines changed

3 files changed

+29
-11
lines changed

packages/@lwc/ssr-compiler/src/compile-js/generate-markup.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,15 @@ const bGenerateMarkup = esTemplate`
4141
});
4242
instance[__SYMBOL__SET_INTERNALS](props, __REFLECTED_PROPS__, attrs);
4343
instance.isConnected = true;
44-
instance.connectedCallback?.();
44+
if (instance.connectedCallback) {
45+
__mutationTracker.enable(instance);
46+
instance.connectedCallback();
47+
__mutationTracker.disable(instance);
48+
}
4549
const tmplFn = ${isIdentOrRenderCall} ?? __fallbackTmpl;
4650
yield \`<\${tagName}\`;
4751
yield tmplFn.stylesheetScopeTokenHostClass ?? '';
48-
yield *__renderAttrs(instance, attrs)
52+
yield* __renderAttrs(instance, attrs)
4953
yield '>';
5054
yield* tmplFn(props, attrs, slotted, ${1}, instance);
5155
yield \`</\${tagName}>\`;
@@ -55,6 +59,7 @@ const bGenerateMarkup = esTemplate`
5559
const bInsertFallbackTmplImport = esTemplate`
5660
import {
5761
fallbackTmpl as __fallbackTmpl,
62+
mutationTracker as __mutationTracker,
5863
renderAttrs as __renderAttrs,
5964
SYMBOL__SET_INTERNALS as __SYMBOL__SET_INTERNALS,
6065
} from '@lwc/ssr-runtime';

packages/@lwc/ssr-runtime/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export {
1111
LightningElementConstructor,
1212
SYMBOL__SET_INTERNALS,
1313
} from './lightning-element';
14-
export { MutationTracker } from './mutation-tracker';
14+
export { mutationTracker } from './mutation-tracker';
1515
// renderComponent is an alias for serverSideRenderComponent
1616
export {
1717
fallbackTmpl,

packages/@lwc/ssr-runtime/src/mutation-tracker.ts

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,31 @@
77

88
import { LightningElement } from './lightning-element';
99

10-
export class MutationTracker {
11-
mutationMap = new WeakMap<LightningElement, Set<string>>();
10+
class MutationTracker {
11+
#enabledSet = new WeakSet<LightningElement>();
12+
#mutationMap = new WeakMap<LightningElement, Set<string>>();
13+
1214
add(instance: LightningElement, attrName: string): void {
13-
let mutatedAttrs = this.mutationMap.get(instance);
14-
if (!mutatedAttrs) {
15-
mutatedAttrs = new Set();
16-
this.mutationMap.set(instance, mutatedAttrs);
15+
if (this.#enabledSet.has(instance)) {
16+
let mutatedAttrs = this.#mutationMap.get(instance);
17+
if (!mutatedAttrs) {
18+
mutatedAttrs = new Set();
19+
this.#mutationMap.set(instance, mutatedAttrs);
20+
}
21+
mutatedAttrs.add(attrName.toLowerCase());
1722
}
18-
mutatedAttrs.add(attrName.toLowerCase());
1923
}
24+
25+
enable(instance: LightningElement) {
26+
this.#enabledSet.add(instance);
27+
}
28+
29+
disable(instance: LightningElement) {
30+
this.#enabledSet.delete(instance);
31+
}
32+
2033
renderMutatedAttrs(instance: LightningElement): string {
21-
const mutatedAttrs = this.mutationMap.get(instance);
34+
const mutatedAttrs = this.#mutationMap.get(instance);
2235
if (mutatedAttrs) {
2336
return ` data-lwc-host-mutated="${[...mutatedAttrs].sort().join(' ')}"`;
2437
} else {

0 commit comments

Comments
 (0)