Skip to content

Commit 2657293

Browse files
committed
refactor(@angular/build): migrate to optimizeDeps.rolldownOptions in Vite config
Vite now uses Rolldown as the underlying engine to optimize dependencies, rendering `optimizeDeps.esbuildOptions` deprecated. This commit refactors the Vite dev-server config in `@angular/build` to use `optimizeDeps.rolldownOptions` instead. It also updates the custom dependency optimization plugin from the esbuild-specific format to a native Rolldown plugin using the `load` hook, and aligns browser target lowering by pushing `es2016` when Zone.js is present (since Rolldown lacks esbuild-style feature-support flags).
1 parent e664314 commit 2657293

3 files changed

Lines changed: 40 additions & 42 deletions

File tree

packages/angular/build/src/builders/dev-server/vite/index.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -382,12 +382,17 @@ export async function* serveWithVite(
382382
const projectRoot = join(context.workspaceRoot, root as string);
383383
const browsers = getSupportedBrowsers(projectRoot, context.logger);
384384

385-
const target = transformSupportedBrowsersToTargets(browsers);
386385
// Needed for browser-esbuild as polyfills can be a string.
387386
const polyfills = Array.isArray((browserOptions.polyfills ??= []))
388387
? browserOptions.polyfills
389388
: [browserOptions.polyfills];
390389

390+
const target = transformSupportedBrowsersToTargets(browsers);
391+
if (!isZonelessApp(polyfills)) {
392+
// Rolldown doesn't have an option to support Zone.js/async-await, so we need to support es2016.
393+
target.push('es2016');
394+
}
395+
391396
let ssrMode: ServerSsrMode = ServerSsrMode.NoSsr;
392397
if (
393398
browserOptions.outputMode &&
@@ -416,7 +421,6 @@ export async function* serveWithVite(
416421
ssrMode,
417422
prebundleTransformer,
418423
target,
419-
isZonelessApp(polyfills),
420424
componentStyles,
421425
templateUpdates,
422426
browserOptions.loader as EsbuildLoaderOption | undefined,

packages/angular/build/src/builders/dev-server/vite/server.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ function createSsrConfig(
9696
externalMetadata: DevServerExternalResultMetadata,
9797
serverOptions: NormalizedDevServerOptions,
9898
prebundleTransformer: JavaScriptTransformer,
99-
zoneless: boolean,
10099
target: string[],
101100
prebundleLoaderExtensions: EsbuildLoaderOption | undefined,
102101
thirdPartySourcemaps: boolean,
@@ -116,7 +115,6 @@ function createSsrConfig(
116115
include: externalMetadata.implicitServer,
117116
ssr: true,
118117
prebundleTransformer,
119-
zoneless,
120118
target,
121119
loader: prebundleLoaderExtensions,
122120
thirdPartySourcemaps,
@@ -134,7 +132,6 @@ export async function setupServer(
134132
ssrMode: ServerSsrMode,
135133
prebundleTransformer: JavaScriptTransformer,
136134
target: string[],
137-
zoneless: boolean,
138135
componentStyles: Map<string, ComponentStyleRecord>,
139136
templateUpdates: Map<string, string>,
140137
prebundleLoaderExtensions: EsbuildLoaderOption | undefined,
@@ -206,7 +203,6 @@ export async function setupServer(
206203
externalMetadata,
207204
serverOptions,
208205
prebundleTransformer,
209-
zoneless,
210206
target,
211207
prebundleLoaderExtensions,
212208
thirdPartySourcemaps,
@@ -245,7 +241,6 @@ export async function setupServer(
245241
ssr: false,
246242
prebundleTransformer,
247243
target,
248-
zoneless,
249244
loader: prebundleLoaderExtensions,
250245
thirdPartySourcemaps,
251246
define,

packages/angular/build/src/tools/vite/utils.ts

Lines changed: 34 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import { extname } from 'node:path';
1212
import type { DepOptimizationConfig } from 'vite';
1313
import type { ExternalResultMetadata } from '../esbuild/bundler-execution-result';
1414
import { JavaScriptTransformer } from '../esbuild/javascript-transformer';
15-
import { getFeatureSupport } from '../esbuild/utils';
1615

1716
export type AngularMemoryOutputFiles = Map<
1817
string,
@@ -41,10 +40,6 @@ export function lookupMimeTypeFromRequest(url: string): string | undefined {
4140
return extension && lookupMimeType(extension);
4241
}
4342

44-
type ViteEsBuildPlugin = NonNullable<
45-
NonNullable<DepOptimizationConfig['esbuildOptions']>['plugins']
46-
>[0];
47-
4843
export type EsbuildLoaderOption = Exclude<
4944
DepOptimizationConfig['esbuildOptions'],
5045
undefined
@@ -55,7 +50,6 @@ export function getDepOptimizationConfig({
5550
exclude,
5651
include,
5752
target,
58-
zoneless,
5953
prebundleTransformer,
6054
ssr,
6155
loader,
@@ -68,48 +62,53 @@ export function getDepOptimizationConfig({
6862
target: string[];
6963
prebundleTransformer: JavaScriptTransformer;
7064
ssr: boolean;
71-
zoneless: boolean;
7265
loader?: EsbuildLoaderOption;
7366
thirdPartySourcemaps: boolean;
7467
define: Record<string, string> | undefined;
7568
}): DepOptimizationConfig {
76-
const plugins: ViteEsBuildPlugin[] = [
77-
{
78-
name: `angular-vite-optimize-deps${ssr ? '-ssr' : ''}${
79-
thirdPartySourcemaps ? '-vendor-sourcemap' : ''
80-
}`,
81-
setup(build) {
82-
build.onLoad({ filter: /\.[cm]?js$/ }, async (args) => {
83-
return {
84-
contents: await prebundleTransformer.transformFile(args.path),
85-
loader: 'js',
86-
};
87-
});
88-
},
89-
},
90-
];
91-
92-
return {
69+
const config: DepOptimizationConfig & {
70+
rolldownOptions?: Record<string, unknown>;
71+
} = {
9372
// Exclude any explicitly defined dependencies (currently build defined externals)
9473
exclude,
9574
// NB: to disable the deps optimizer, set optimizeDeps.noDiscovery to true and optimizeDeps.include as undefined.
9675
// Include all implict dependencies from the external packages internal option
9776
include: disabled ? undefined : include,
9877
noDiscovery: disabled,
99-
// Add an esbuild plugin to run the Angular linker on dependencies
100-
esbuildOptions: {
101-
// Set esbuild supported targets.
102-
target,
103-
supported: getFeatureSupport(zoneless),
104-
plugins,
105-
loader,
106-
define: {
107-
...define,
108-
'ngServerMode': `${ssr}`,
78+
rolldownOptions: {
79+
transform: {
80+
// Set target.
81+
target,
82+
define: {
83+
...define,
84+
'ngServerMode': `${ssr}`,
85+
},
86+
},
87+
plugins: [
88+
{
89+
name: `angular-vite-optimize-deps${ssr ? '-ssr' : ''}${
90+
thirdPartySourcemaps ? '-vendor-sourcemap' : ''
91+
}`,
92+
async load(id: string) {
93+
if (/\.[cm]?js$/.test(id)) {
94+
return {
95+
code: await prebundleTransformer.transformFile(id),
96+
map: null,
97+
};
98+
}
99+
100+
return null;
101+
},
102+
},
103+
],
104+
moduleTypes: loader as Record<string, string> | undefined,
105+
resolve: {
106+
extensions: ['.mjs', '.js', '.cjs'],
109107
},
110-
resolveExtensions: ['.mjs', '.js', '.cjs'],
111108
},
112109
};
110+
111+
return config;
113112
}
114113

115114
export interface DevServerExternalResultMetadata {

0 commit comments

Comments
 (0)