Skip to content

Commit 57fef7b

Browse files
committed
perf(@angular-devkit/build-angular): reduce CLI loading times by removing critters from critical path
Critters has a number of large deps like postcss which slow down the Angular CLI loading times.
1 parent 06dacb0 commit 57fef7b

File tree

5 files changed

+22
-12
lines changed

5 files changed

+22
-12
lines changed

packages/angular_devkit/build_angular/src/builders/app-shell/index.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import * as path from 'path';
1818
import Piscina from 'piscina';
1919
import { normalizeOptimization } from '../../utils';
2020
import { assertIsError } from '../../utils/error';
21-
import { InlineCriticalCssProcessor } from '../../utils/index-file/inline-critical-css';
21+
import type { InlineCriticalCssProcessor } from '../../utils/index-file/inline-critical-css';
2222
import { augmentAppWithServiceWorker } from '../../utils/service-worker';
2323
import { Spinner } from '../../utils/spinner';
2424
import { BrowserBuilderOutput } from '../browser';
@@ -56,12 +56,16 @@ async function _renderUniversal(
5656
const projectRoot = path.join(root, (projectMetadata.root as string | undefined) ?? '');
5757

5858
const { styles } = normalizeOptimization(browserOptions.optimization);
59-
const inlineCriticalCssProcessor = styles.inlineCritical
60-
? new InlineCriticalCssProcessor({
61-
minify: styles.minify,
62-
deployUrl: browserOptions.deployUrl,
63-
})
64-
: undefined;
59+
let inlineCriticalCssProcessor: InlineCriticalCssProcessor | undefined;
60+
if (styles.inlineCritical) {
61+
const { InlineCriticalCssProcessor } = await import(
62+
'../../utils/index-file/inline-critical-css'
63+
);
64+
inlineCriticalCssProcessor = new InlineCriticalCssProcessor({
65+
minify: styles.minify,
66+
deployUrl: browserOptions.deployUrl,
67+
});
68+
}
6569

6670
const renderWorker = new Piscina({
6771
filename: require.resolve('./render-worker'),

packages/angular_devkit/build_angular/src/builders/prerender/render-worker.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import assert from 'node:assert';
1212
import * as fs from 'node:fs';
1313
import * as path from 'node:path';
1414
import { workerData } from 'node:worker_threads';
15-
import { InlineCriticalCssProcessor } from '../../utils/index-file/inline-critical-css';
1615

1716
export interface RenderOptions {
1817
indexFile: string;
@@ -122,6 +121,10 @@ async function render({
122121
}
123122

124123
if (inlineCriticalCss) {
124+
const { InlineCriticalCssProcessor } = await import(
125+
'../../utils/index-file/inline-critical-css'
126+
);
127+
125128
const inlineCriticalCssProcessor = new InlineCriticalCssProcessor({
126129
deployUrl: deployUrl,
127130
minify: minifyCss,

packages/angular_devkit/build_angular/src/tools/esbuild/index-html-generator.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import assert from 'node:assert';
1010
import path from 'node:path';
1111
import { NormalizedApplicationBuildOptions } from '../../builders/application/options';
1212
import { IndexHtmlGenerator } from '../../utils/index-file/index-html-generator';
13-
import { InlineCriticalCssProcessor } from '../../utils/index-file/inline-critical-css';
1413
import { BuildOutputFile, BuildOutputFileType, InitialFileRecord } from './bundler-context';
1514

1615
export async function generateIndexHtml(
@@ -107,6 +106,8 @@ export async function generateIndexHtml(
107106
};
108107
}
109108

109+
const { InlineCriticalCssProcessor } = await import('../../utils/index-file/inline-critical-css');
110+
110111
const inlineCriticalCssProcessor = new InlineCriticalCssProcessor({
111112
minify: false, // CSS has already been minified during the build.
112113
readAsset,

packages/angular_devkit/build_angular/src/utils/index-file/inline-critical-css.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,9 @@
66
* found in the LICENSE file at https://angular.io/license
77
*/
88

9+
import Critters from 'critters';
910
import { readFile } from 'node:fs/promises';
1011

11-
const Critters: typeof import('critters').default = require('critters');
12-
1312
/**
1413
* Pattern used to extract the media query set by Critters in an `onload` handler.
1514
*/

packages/angular_devkit/build_angular/src/utils/server-rendering/render-page.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
import type { ApplicationRef, StaticProvider } from '@angular/core';
1010
import { basename } from 'node:path';
11-
import { InlineCriticalCssProcessor } from '../index-file/inline-critical-css';
1211
import { loadEsmModule } from '../load-esm';
1312
import { MainServerBundleExports } from './main-bundle-exports';
1413

@@ -94,6 +93,10 @@ export async function renderPage({
9493
}
9594

9695
if (inlineCriticalCss) {
96+
const { InlineCriticalCssProcessor } = await import(
97+
'../../utils/index-file/inline-critical-css'
98+
);
99+
97100
const inlineCriticalCssProcessor = new InlineCriticalCssProcessor({
98101
minify: false, // CSS has already been minified during the build.
99102
readAsset: async (filePath) => {

0 commit comments

Comments
 (0)