Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions packages/angular/build/src/builders/dev-server/options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,8 @@ export async function normalizeOptions(
open,
verbose,
watch,
liveReload,
hmr,
liveReload: !!liveReload,
hmr: hmr ?? !!liveReload,
headers,
workspaceRoot,
projectRoot,
Expand Down
3 changes: 1 addition & 2 deletions packages/angular/build/src/builders/dev-server/schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,7 @@
},
"hmr": {
"type": "boolean",
"description": "Enable hot module replacement.",
"default": false
"description": "Enable hot module replacement. Defaults to the value of 'liveReload'. Currently, only global and component stylesheets are supported."
},
"watch": {
"type": "boolean",
Expand Down
10 changes: 7 additions & 3 deletions packages/angular/build/src/builders/dev-server/vite-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -137,8 +137,9 @@ export async function* serveWithVite(
process.setSourceMapsEnabled(true);
}

// Enable to support component style hot reloading (`NG_HMR_CSTYLES=0` can be used to disable)
browserOptions.externalRuntimeStyles = !!serverOptions.liveReload && useComponentStyleHmr;
// Enable to support component style hot reloading (`NG_HMR_CSTYLES=0` can be used to disable selectively)
browserOptions.externalRuntimeStyles =
serverOptions.liveReload && serverOptions.hmr && useComponentStyleHmr;

// Enable to support component template hot replacement (`NG_HMR_TEMPLATE=1` can be used to enable)
browserOptions.templateUpdates = !!serverOptions.liveReload && useComponentTemplateHmr;
Expand Down Expand Up @@ -465,7 +466,7 @@ async function handleUpdate(
return;
}

if (serverOptions.liveReload || serverOptions.hmr) {
if (serverOptions.hmr) {
if (updatedFiles.every((f) => f.endsWith('.css'))) {
const timestamp = Date.now();
server.ws.send({
Expand Down Expand Up @@ -649,6 +650,8 @@ export async function setupServer(
host: serverOptions.host,
open: serverOptions.open,
headers: serverOptions.headers,
// Disable the websocket if live reload is disabled (false/undefined are the only valid values)
ws: serverOptions.liveReload === false && serverOptions.hmr === false ? false : undefined,
proxy,
cors: {
// Allow preflight requests to be proxied.
Expand Down Expand Up @@ -709,6 +712,7 @@ export async function setupServer(
virtualProjectRoot,
outputFiles,
external: externalMetadata.explicitBrowser,
skipViteClient: serverOptions.liveReload === false && serverOptions.hmr === false,
}),
],
// Browser only optimizeDeps. (This does not run for SSR dependencies).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ interface AngularMemoryPluginOptions {
virtualProjectRoot: string;
outputFiles: AngularMemoryOutputFiles;
external?: string[];
skipViteClient?: boolean;
}

export async function createAngularMemoryPlugin(
Expand Down Expand Up @@ -63,9 +64,11 @@ export async function createAngularMemoryPlugin(
const relativeFile = '/' + normalizePath(relative(virtualProjectRoot, file));
const codeContents = outputFiles.get(relativeFile)?.contents;
if (codeContents === undefined) {
return relativeFile.endsWith('/node_modules/vite/dist/client/client.mjs')
? loadViteClientCode(file)
: undefined;
if (relativeFile.endsWith('/node_modules/vite/dist/client/client.mjs')) {
return options.skipViteClient ? '' : loadViteClientCode(file);
}

return undefined;
}

const code = Buffer.from(codeContents).toString('utf-8');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,12 +85,15 @@ export function execute(
);
}

// New build system defaults hmr option to the value of liveReload
normalizedOptions.hmr ??= normalizedOptions.liveReload;

return defer(() =>
Promise.all([import('@angular/build/private'), import('../browser-esbuild')]),
).pipe(
switchMap(([{ serveWithVite, buildApplicationInternal }, { convertBrowserOptions }]) =>
serveWithVite(
normalizedOptions,
normalizedOptions as typeof normalizedOptions & { hmr: boolean },
builderName,
(options, context, codePlugins) => {
return builderName === '@angular-devkit/build-angular:browser-esbuild'
Expand Down Expand Up @@ -124,6 +127,9 @@ export function execute(
);
}

// Webpack based build systems default to false for hmr option
normalizedOptions.hmr ??= false;

// Use Webpack for all other browser targets
return defer(() => import('./webpack-server')).pipe(
switchMap(({ serveWebpackBrowser }) =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ export async function normalizeOptions(
open,
verbose,
watch,
liveReload,
liveReload: !!liveReload,
hmr,
headers,
workspaceRoot,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,7 @@
},
"hmr": {
"type": "boolean",
"description": "Enable hot module replacement.",
"default": false
"description": "Enable hot module replacement."
},
"watch": {
"type": "boolean",
Expand Down