Skip to content

Commit 20ec0e2

Browse files
alan-agius4filipesilva
authored andcommitted
fix(@angular-devkit/build-angular): disable output hashing when running dev-server
Using output hashing with the dev-server can cause memory leaks because the dev server does not know when to clean up the old files. See: webpack/webpack-dev-server#377 (comment) Closes #10411
1 parent dd64e9f commit 20ec0e2

File tree

2 files changed

+12
-7
lines changed
  • packages/angular_devkit/build_angular/src/dev-server
  • tests/legacy-cli/e2e/tests/basic

2 files changed

+12
-7
lines changed

packages/angular_devkit/build_angular/src/dev-server/index.ts

+11-4
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import * as url from 'url';
2222
import * as webpack from 'webpack';
2323
import * as webpackDevServer from 'webpack-dev-server';
2424
import { getAnalyticsConfig, getCompilerConfig } from '../browser';
25-
import { Schema as BrowserBuilderSchema } from '../browser/schema';
25+
import { OutputHashing, Schema as BrowserBuilderSchema } from '../browser/schema';
2626
import { ExecutionTransformer } from '../transforms';
2727
import { BuildBrowserFeatures, normalizeOptimization } from '../utils';
2828
import { findCachePath } from '../utils/cache-path';
@@ -94,7 +94,7 @@ export function serveWebpackBrowser(
9494
locale: string | undefined;
9595
}> {
9696
// Get the browser configuration from the target name.
97-
const rawBrowserOptions = await context.getTargetOptions(browserTarget);
97+
const rawBrowserOptions = (await context.getTargetOptions(browserTarget)) as json.JsonObject & BrowserBuilderSchema;
9898
options.port = await checkPort(options.port ?? 4200, options.host || 'localhost');
9999

100100
// Override options we need to override, if defined.
@@ -122,11 +122,18 @@ export function serveWebpackBrowser(
122122
// In dev server we should not have budgets because of extra libs such as socks-js
123123
overrides.budgets = undefined;
124124

125+
if (rawBrowserOptions.outputHashing && rawBrowserOptions.outputHashing !== OutputHashing.None) {
126+
// Disable output hashing for dev build as this can cause memory leaks
127+
// See: https://github.com/webpack/webpack-dev-server/issues/377#issuecomment-241258405
128+
overrides.outputHashing = OutputHashing.None;
129+
logger.warn(`Warning: 'outputHashing' option is disabled when using the dev-server.`);
130+
}
131+
125132
const browserName = await context.getBuilderNameForTarget(browserTarget);
126-
const browserOptions = await context.validateOptions<json.JsonObject & BrowserBuilderSchema>(
133+
const browserOptions = await context.validateOptions(
127134
{ ...rawBrowserOptions, ...overrides },
128135
browserName,
129-
);
136+
) as json.JsonObject & BrowserBuilderSchema;
130137

131138
const { config, projectRoot, i18n } = await generateI18nBrowserWebpackConfigFromContext(
132139
browserOptions,

tests/legacy-cli/e2e/tests/basic/ivy.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,7 @@ export default async function() {
3838
}
3939

4040
// Verify it's Ivy.
41-
const mainUrlMatch = body.match(/src="(main\.[a-z0-9]{0,32}\.js)"/);
42-
const mainUrl = mainUrlMatch && mainUrlMatch[1];
43-
const main = await request('http://localhost:4200/' + mainUrl);
41+
const main = await request('http://localhost:4200/main.js');
4442

4543
if (!main.match(/ɵcmp\s*=/) && !main.match(/\\u0275cmp\s*=/)) {
4644
throw new Error('Ivy could not be found.');

0 commit comments

Comments
 (0)