From 1e3ecbdb138861eff550e05d9662a10d106c0990 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 8 Sep 2022 14:43:47 -0400 Subject: [PATCH] perf(@ngtools/webpack): avoid bootstrap conversion AST traversal where possible To support AOT compilation the Angular bootstrap call needs to be converted from using `platform-browser-dynamic` to `platform-browser`. This transform was previously being executed against every source file within the program regardless of the presence of `platformBrowserDynamic`. An initial check is now performed that can avoid AST traversal when the bootstrapping call is not present in a file. (cherry picked from commit 4fa8392a138122bc2c8ed5e433cfbf9786da8baa) --- packages/ngtools/webpack/src/ivy/transformation.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/ngtools/webpack/src/ivy/transformation.ts b/packages/ngtools/webpack/src/ivy/transformation.ts index 927afd7b58c6..40d0f7a9d3b6 100644 --- a/packages/ngtools/webpack/src/ivy/transformation.ts +++ b/packages/ngtools/webpack/src/ivy/transformation.ts @@ -74,6 +74,12 @@ export function mergeTransformers( return result; } +/** + * The name of the Angular platform that should be replaced within + * bootstrap call expressions to support AOT. + */ +const PLATFORM_BROWSER_DYNAMIC_NAME = 'platformBrowserDynamic'; + export function replaceBootstrap( getTypeChecker: () => ts.TypeChecker, ): ts.TransformerFactory { @@ -86,7 +92,7 @@ export function replaceBootstrap( const visitNode: ts.Visitor = (node: ts.Node) => { if (ts.isCallExpression(node) && ts.isIdentifier(node.expression)) { const target = node.expression; - if (target.text === 'platformBrowserDynamic') { + if (target.text === PLATFORM_BROWSER_DYNAMIC_NAME) { if (!bootstrapNamespace) { bootstrapNamespace = nodeFactory.createUniqueName('__NgCli_bootstrap_'); bootstrapImport = nodeFactory.createImportDeclaration( @@ -115,6 +121,10 @@ export function replaceBootstrap( }; return (sourceFile: ts.SourceFile) => { + if (!sourceFile.text.includes(PLATFORM_BROWSER_DYNAMIC_NAME)) { + return sourceFile; + } + let updatedSourceFile = ts.visitEachChild(sourceFile, visitNode, context); if (bootstrapImport) {