From c2c8b75d7b259dfd48fc215c757dd37d8983b50b Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Mon, 16 Dec 2024 18:42:24 +0100 Subject: [PATCH] refactor(core): remove module bootstrap code when using standalone. (#59208) This commit improves tree shaking in standalone apps. PR Close #59208 --- packages/core/src/platform/bootstrap.ts | 17 +++++++++++++++-- packages/core/src/platform/platform_ref.ts | 4 +++- .../cyclic_import/bundle.golden_symbols.json | 3 +++ .../bundling/defer/bundle.golden_symbols.json | 1 + .../forms_reactive/bundle.golden_symbols.json | 3 +++ .../bundle.golden_symbols.json | 3 +++ 6 files changed, 28 insertions(+), 3 deletions(-) diff --git a/packages/core/src/platform/bootstrap.ts b/packages/core/src/platform/bootstrap.ts index 3ddcabdf10e..b5fee23abcc 100644 --- a/packages/core/src/platform/bootstrap.ts +++ b/packages/core/src/platform/bootstrap.ts @@ -162,7 +162,7 @@ export function bootstrap( } return appRef; } else { - moduleDoBootstrap(config.moduleRef, config.allPlatformModules); + moduleBootstrapImpl?.(config.moduleRef, config.allPlatformModules); return config.moduleRef; } }); @@ -170,7 +170,20 @@ export function bootstrap( }); } -function moduleDoBootstrap( +/** + * Having a separate symbol for the module boostrap implementation allows us to + * tree shake the module based boostrap implementation in standalone apps. + */ +let moduleBootstrapImpl: undefined | typeof _moduleDoBootstrap; + +/** + * Set the implementation of the module based bootstrap. + */ +export function setModuleBootstrapImpl() { + moduleBootstrapImpl = _moduleDoBootstrap; +} + +function _moduleDoBootstrap( moduleRef: InternalNgModuleRef, allPlatformModules: NgModuleRef[], ): void { diff --git a/packages/core/src/platform/platform_ref.ts b/packages/core/src/platform/platform_ref.ts index 0218f86899c..1bafc125e33 100644 --- a/packages/core/src/platform/platform_ref.ts +++ b/packages/core/src/platform/platform_ref.ts @@ -22,7 +22,7 @@ import {CompilerOptions} from '../linker'; import {NgModuleFactory, NgModuleRef} from '../linker/ng_module_factory'; import {createNgModuleRefWithProviders} from '../render3/ng_module_ref'; import {getNgZone} from '../zone/ng_zone'; -import {bootstrap} from './bootstrap'; +import {bootstrap, setModuleBootstrapImpl} from './bootstrap'; import {PLATFORM_DESTROY_LISTENERS} from './platform_destroy_listeners'; /** @@ -77,6 +77,7 @@ export class PlatformRef { allAppProviders, ); + setModuleBootstrapImpl(); return bootstrap({ moduleRef, allPlatformModules: this._modules, @@ -107,6 +108,7 @@ export class PlatformRef { | Array = [], ): Promise> { const options = optionsReducer({}, compilerOptions); + setModuleBootstrapImpl(); return compileNgModuleFactory(this.injector, options, moduleType).then((moduleFactory) => this.bootstrapModuleFactory(moduleFactory, options), ); 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 d034ae8659f..8e71b8000a8 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -160,6 +160,7 @@ "_isRefreshingViews", "_keyMap", "_locateOrCreateElementNode", + "_moduleDoBootstrap", "_platformInjector", "_testabilityGetter", "_wasLastNodeCreated", @@ -345,6 +346,7 @@ "maybeWrapInNotSelector", "mergeHostAttribute", "mergeHostAttrs", + "moduleBootstrapImpl", "nativeAppendChild", "nativeAppendOrInsertBefore", "nativeInsertBefore", @@ -399,6 +401,7 @@ "setInjectImplementation", "setInputsFromAttrs", "setIsRefreshingViews", + "setModuleBootstrapImpl", "setSelectedIndex", "setShadowStylingInputFlags", "setupHostDirectiveInputsOrOutputs", diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index a0632ac4842..1376a17cda4 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -413,6 +413,7 @@ "maybeWrapInNotSelector", "mergeHostAttribute", "mergeHostAttrs", + "moduleBootstrapImpl", "nativeAppendChild", "nativeAppendOrInsertBefore", "nativeInsertBefore", 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 b002f5fee72..88063188dc2 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -229,6 +229,7 @@ "_locateOrCreateContainerAnchor", "_locateOrCreateElementNode", "_locateOrCreateTextNode", + "_moduleDoBootstrap", "_platformInjector", "_testabilityGetter", "_wasLastNodeCreated", @@ -514,6 +515,7 @@ "mergeHostAttrs", "mergeInputsWithTransforms", "mergeValidators", + "moduleBootstrapImpl", "multiFactoryAdd", "multiProvidersFactoryResolver", "multiResolve", @@ -594,6 +596,7 @@ "setInjectImplementation", "setInputsFromAttrs", "setIsRefreshingViews", + "setModuleBootstrapImpl", "setSelectedIndex", "setShadowStylingInputFlags", "setTStylingRangeNext", 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 88b14ef95e4..ae95a5e9249 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 @@ -226,6 +226,7 @@ "_locateOrCreateContainerAnchor", "_locateOrCreateElementNode", "_locateOrCreateTextNode", + "_moduleDoBootstrap", "_platformInjector", "_testabilityGetter", "_wasLastNodeCreated", @@ -503,6 +504,7 @@ "mergeInputsWithTransforms", "mergeValidators", "modelGroupProvider", + "moduleBootstrapImpl", "multiFactoryAdd", "multiProvidersFactoryResolver", "multiResolve", @@ -588,6 +590,7 @@ "setInjectImplementation", "setInputsFromAttrs", "setIsRefreshingViews", + "setModuleBootstrapImpl", "setPropertyAndInputs", "setSelectedIndex", "setShadowStylingInputFlags",