Skip to content

Commit c4baba4

Browse files
clydinalan-agius4
authored andcommitted
refactor(@angular-devkit/build-angular): reduce repeat TypeScript configuration loading
An application's TypeScript configuration was previously being loaded multiple times in several different aspects of the build setup process. These aspects need to access specific compiler options relevant to that particular area of the setup. However, loading the configuration can be expensive due to the process also calculating the root files for the TypeScript compilation which can result in a large amount of file access. To improve the setup performance, the number of times the TypeScript configuration will be loaded has now been reduced with further reductions possible with additional refactorings.
1 parent 3bcb729 commit c4baba4

File tree

3 files changed

+17
-17
lines changed

3 files changed

+17
-17
lines changed

packages/angular_devkit/build_angular/src/builders/browser/index.ts

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ import {
3535
} from '../../utils/index-file/index-html-generator';
3636
import { ensureOutputPaths } from '../../utils/output-paths';
3737
import { generateEntryPoints } from '../../utils/package-chunk-sort';
38-
import { readTsconfig } from '../../utils/read-tsconfig';
3938
import { augmentAppWithServiceWorker } from '../../utils/service-worker';
4039
import { Spinner } from '../../utils/spinner';
4140
import { assertCompatibleAngularVersion } from '../../utils/version';
@@ -86,13 +85,14 @@ async function initialize(
8685
projectRoot: string;
8786
projectSourceRoot?: string;
8887
i18n: I18nOptions;
88+
target: ScriptTarget;
8989
}> {
9090
const originalOutputPath = options.outputPath;
9191

9292
// Assets are processed directly by the builder except when watching
9393
const adjustedOptions = options.watch ? options : { ...options, assets: [] };
9494

95-
const { config, projectRoot, projectSourceRoot, i18n } =
95+
const { config, projectRoot, projectSourceRoot, i18n, target } =
9696
await generateI18nBrowserWebpackConfigFromContext(adjustedOptions, context, (wco) => [
9797
getCommonConfig(wco),
9898
getBrowserConfig(wco),
@@ -126,7 +126,7 @@ async function initialize(
126126
deleteOutputDir(context.workspaceRoot, originalOutputPath);
127127
}
128128

129-
return { config: transformedConfig || config, projectRoot, projectSourceRoot, i18n };
129+
return { config: transformedConfig || config, projectRoot, projectSourceRoot, i18n, target };
130130
}
131131

132132
/**
@@ -164,16 +164,11 @@ export function buildWebpackBrowser(
164164
),
165165
);
166166

167-
const { options: compilerOptions } = readTsconfig(options.tsConfig, context.workspaceRoot);
168-
const target = compilerOptions.target || ScriptTarget.ES5;
169167
const buildBrowserFeatures = new BuildBrowserFeatures(sysProjectRoot);
170168

171169
checkInternetExplorerSupport(buildBrowserFeatures.supportedBrowsers, context.logger);
172170

173-
return {
174-
...(await initialize(options, context, transforms.webpackConfiguration)),
175-
target,
176-
};
171+
return initialize(options, context, transforms.webpackConfiguration);
177172
}),
178173
switchMap(
179174
// eslint-disable-next-line max-lines-per-function

packages/angular_devkit/build_angular/src/builders/server/index.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import { NormalizedBrowserBuilderSchema, deleteOutputDir } from '../../utils';
1919
import { i18nInlineEmittedFiles } from '../../utils/i18n-inlining';
2020
import { I18nOptions } from '../../utils/i18n-options';
2121
import { ensureOutputPaths } from '../../utils/output-paths';
22-
import { readTsconfig } from '../../utils/read-tsconfig';
2322
import { assertCompatibleAngularVersion } from '../../utils/version';
2423
import { generateI18nBrowserWebpackConfigFromContext } from '../../utils/webpack-browser-config';
2524
import {
@@ -62,8 +61,6 @@ export function execute(
6261
// Check Angular version.
6362
assertCompatibleAngularVersion(root);
6463

65-
const tsConfig = readTsconfig(options.tsConfig, root);
66-
const target = tsConfig.options.target || ScriptTarget.ES5;
6764
const baseOutputPath = path.resolve(root, options.outputPath);
6865
let outputPaths: undefined | Map<string, string>;
6966

@@ -91,7 +88,7 @@ export function execute(
9188
}
9289

9390
return from(initialize(options, context, transforms.webpackConfiguration)).pipe(
94-
concatMap(({ config, i18n }) => {
91+
concatMap(({ config, i18n, target }) => {
9592
return runWebpack(config, context, {
9693
webpackFactory: require('webpack') as typeof webpack,
9794
logging: (stats, config) => {
@@ -153,9 +150,10 @@ async function initialize(
153150
): Promise<{
154151
config: webpack.Configuration;
155152
i18n: I18nOptions;
153+
target: ScriptTarget;
156154
}> {
157155
const originalOutputPath = options.outputPath;
158-
const { config, i18n } = await generateI18nBrowserWebpackConfigFromContext(
156+
const { config, i18n, target } = await generateI18nBrowserWebpackConfigFromContext(
159157
{
160158
...options,
161159
buildOptimizer: false,
@@ -181,5 +179,5 @@ async function initialize(
181179
deleteOutputDir(context.workspaceRoot, originalOutputPath);
182180
}
183181

184-
return { config: transformedConfig || config, i18n };
182+
return { config: transformedConfig || config, i18n, target };
185183
}

packages/angular_devkit/build_angular/src/utils/webpack-browser-config.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import { BuilderContext } from '@angular-devkit/architect';
1010
import { getSystemPath, logging, normalize, resolve } from '@angular-devkit/core';
1111
import * as path from 'path';
12+
import { ScriptTarget } from 'typescript';
1213
import { Configuration, javascript } from 'webpack';
1314
import { merge as webpackMerge } from 'webpack-merge';
1415
import { Schema as BrowserBuilderSchema } from '../builders/browser/schema';
@@ -69,12 +70,18 @@ export async function generateI18nBrowserWebpackConfigFromContext(
6970
projectRoot: string;
7071
projectSourceRoot?: string;
7172
i18n: I18nOptions;
73+
target: ScriptTarget;
7274
}> {
7375
const { buildOptions, i18n } = await configureI18nBuild(context, options);
76+
let target = ScriptTarget.ES5;
7477
const result = await generateBrowserWebpackConfigFromContext(
7578
buildOptions,
7679
context,
77-
webpackPartialGenerator,
80+
(wco) => {
81+
target = wco.scriptTarget;
82+
83+
return webpackPartialGenerator(wco);
84+
},
7885
extraBuildOptions,
7986
);
8087
const config = result.config;
@@ -119,7 +126,7 @@ export async function generateI18nBrowserWebpackConfigFromContext(
119126
});
120127
}
121128

122-
return { ...result, i18n };
129+
return { ...result, i18n, target };
123130
}
124131
export async function generateBrowserWebpackConfigFromContext(
125132
options: BrowserBuilderSchema,

0 commit comments

Comments
 (0)