From 0206c10f8e112d3b29bbe57aaa7c9d66f0f7e2d7 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Sun, 22 May 2022 10:42:28 +0200 Subject: [PATCH] refactor(core): minor ComponentDef improvements (#46093) Makes the following improvements in the runtime: * Uses the unique ID of the component definition to keep track of its injector in the `StandaloneFeature`, instead of the definition itself. This reduces the amount of memory we can leak, if something doesn't get cleaned up. * Changes the naming and description of the `ComponentDef.id` to reflect what it is used for. PR Close #46093 --- packages/core/src/render3/definition.ts | 8 ++++---- packages/core/src/render3/features/standalone_feature.ts | 8 ++++---- packages/core/src/render3/interfaces/definition.ts | 3 ++- .../test/bundling/animations/bundle.golden_symbols.json | 4 ++-- .../bundling/cyclic_import/bundle.golden_symbols.json | 4 ++-- .../bundling/forms_reactive/bundle.golden_symbols.json | 4 ++-- .../forms_template_driven/bundle.golden_symbols.json | 4 ++-- .../test/bundling/hello_world/bundle.golden_symbols.json | 4 ++-- .../core/test/bundling/router/bundle.golden_symbols.json | 4 ++-- .../standalone_bootstrap/bundle.golden_symbols.json | 4 ++-- .../core/test/bundling/todo/bundle.golden_symbols.json | 4 ++-- 11 files changed, 26 insertions(+), 25 deletions(-) diff --git a/packages/core/src/render3/definition.ts b/packages/core/src/render3/definition.ts index 4eb80495d3f..2e992591e73 100644 --- a/packages/core/src/render3/definition.ts +++ b/packages/core/src/render3/definition.ts @@ -17,12 +17,13 @@ import {initNgDevMode} from '../util/ng_dev_mode'; import {stringify} from '../util/stringify'; import {NG_COMP_DEF, NG_DIR_DEF, NG_MOD_DEF, NG_PIPE_DEF} from './fields'; -import {ComponentDef, ComponentDefFeature, ComponentTemplate, ComponentType, ContentQueriesFunction, DependencyTypeList, DirectiveDef, DirectiveDefFeature, DirectiveDefList, DirectiveTypesOrFactory, HostBindingsFunction, PipeDef, PipeDefList, PipeTypesOrFactory, TypeOrFactory, ViewQueriesFunction} from './interfaces/definition'; +import {ComponentDef, ComponentDefFeature, ComponentTemplate, ComponentType, ContentQueriesFunction, DependencyTypeList, DirectiveDef, DirectiveDefFeature, DirectiveDefList, HostBindingsFunction, PipeDef, PipeDefList, TypeOrFactory, ViewQueriesFunction} from './interfaces/definition'; import {TAttributes, TConstantsOrFactory} from './interfaces/node'; import {CssSelectorList} from './interfaces/projection'; -let _renderCompCount = 0; +/** Counter used to generate unique IDs for component definitions. */ +let componentDefCount = 0; /** @@ -318,7 +319,7 @@ export function ɵɵdefineComponent(componentDefinition: { features: componentDefinition.features as DirectiveDefFeature[] || null, data: componentDefinition.data || {}, encapsulation: componentDefinition.encapsulation || ViewEncapsulation.Emulated, - id: 'c', + id: `c${componentDefCount++}`, styles: componentDefinition.styles || EMPTY_ARRAY, _: null, setInput: null, @@ -327,7 +328,6 @@ export function ɵɵdefineComponent(componentDefinition: { }; const dependencies = componentDefinition.dependencies; const feature = componentDefinition.features; - def.id += _renderCompCount++; def.inputs = invertObject(componentDefinition.inputs, declaredInputs), def.outputs = invertObject(componentDefinition.outputs), feature && feature.forEach((fn) => fn(def)); diff --git a/packages/core/src/render3/features/standalone_feature.ts b/packages/core/src/render3/features/standalone_feature.ts index 4a86f89a57a..bcf80eee20c 100644 --- a/packages/core/src/render3/features/standalone_feature.ts +++ b/packages/core/src/render3/features/standalone_feature.ts @@ -19,7 +19,7 @@ import {createEnvironmentInjector} from '../ng_module_ref'; * collected from the imports graph rooted at a given standalone component. */ class StandaloneService implements OnDestroy { - cachedInjectors = new Map, EnvironmentInjector|null>(); + cachedInjectors = new Map(); constructor(private _injector: EnvironmentInjector) {} @@ -28,16 +28,16 @@ class StandaloneService implements OnDestroy { return null; } - if (!this.cachedInjectors.has(componentDef)) { + if (!this.cachedInjectors.has(componentDef.id)) { const providers = internalImportProvidersFrom(false, componentDef.type); const standaloneInjector = providers.length > 0 ? createEnvironmentInjector( [providers], this._injector, `Standalone[${componentDef.type.name}]`) : null; - this.cachedInjectors.set(componentDef, standaloneInjector); + this.cachedInjectors.set(componentDef.id, standaloneInjector); } - return this.cachedInjectors.get(componentDef)!; + return this.cachedInjectors.get(componentDef.id)!; } ngOnDestroy() { diff --git a/packages/core/src/render3/interfaces/definition.ts b/packages/core/src/render3/interfaces/definition.ts index b6448f69faa..dad247156fc 100644 --- a/packages/core/src/render3/interfaces/definition.ts +++ b/packages/core/src/render3/interfaces/definition.ts @@ -226,7 +226,8 @@ export interface DirectiveDef { */ export interface ComponentDef extends DirectiveDef { /** - * Runtime unique component ID. + * Unique ID for the component. Used in view encapsulation and + * to keep track of the injector in standalone components. */ readonly id: string; diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index 249ef405f39..df0d7eeae23 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -549,7 +549,7 @@ "name": "_randomChar" }, { - "name": "_renderCompCount" + "name": "componentDefCount" }, { "name": "_testabilityGetter" @@ -1403,4 +1403,4 @@ { "name": "ɵɵproperty" } -] \ No newline at end of file +] diff --git a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json index fdb0f04231e..f3ff090a8ba 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -66,7 +66,7 @@ "name": "_injectImplementation" }, { - "name": "_renderCompCount" + "name": "componentDefCount" }, { "name": "addComponentLogic" @@ -449,4 +449,4 @@ { "name": "ɵɵinject" } -] \ No newline at end of file +] diff --git a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json index aa09489a2eb..4f349bcdd11 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -549,7 +549,7 @@ "name": "_randomChar" }, { - "name": "_renderCompCount" + "name": "componentDefCount" }, { "name": "_symbolIterator" @@ -1595,4 +1595,4 @@ { "name": "ɵɵtext" } -] \ No newline at end of file +] diff --git a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json index 5959c391afd..be9a29f5f1e 100644 --- a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json @@ -540,7 +540,7 @@ "name": "_randomChar" }, { - "name": "_renderCompCount" + "name": "componentDefCount" }, { "name": "_symbolIterator" @@ -1583,4 +1583,4 @@ { "name": "ɵɵtext" } -] \ No newline at end of file +] diff --git a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json index ad7fd110933..1a0b9a02584 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -63,7 +63,7 @@ "name": "_injectImplementation" }, { - "name": "_renderCompCount" + "name": "componentDefCount" }, { "name": "allocExpando" @@ -335,4 +335,4 @@ { "name": "ɵɵinject" } -] \ No newline at end of file +] diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index 8d090950ee3..f67f5c6290d 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -780,7 +780,7 @@ "name": "_randomChar" }, { - "name": "_renderCompCount" + "name": "componentDefCount" }, { "name": "_stripIndexHtml" @@ -2018,4 +2018,4 @@ { "name": "ɵɵtextInterpolate1" } -] \ No newline at end of file +] diff --git a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json index ca8ffd4e129..136d5d90870 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -342,7 +342,7 @@ "name": "_randomChar" }, { - "name": "_renderCompCount" + "name": "componentDefCount" }, { "name": "_wrapInTimeout" @@ -881,4 +881,4 @@ { "name": "ɵɵinject" } -] \ No newline at end of file +] diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 1d3aae02130..51336eae47d 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -165,7 +165,7 @@ "name": "_injectImplementation" }, { - "name": "_renderCompCount" + "name": "componentDefCount" }, { "name": "_symbolIterator" @@ -866,4 +866,4 @@ { "name": "ɵɵtextInterpolate1" } -] \ No newline at end of file +]