Skip to content

Commit 8e073ea

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 7ef9ed2 commit 8e073ea

3 files changed

Lines changed: 45 additions & 42 deletions

File tree

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -384,12 +384,19 @@ export async function* serveWithVite(
384384
const projectRoot = join(context.workspaceRoot, root as string);
385385
const browsers = getSupportedBrowsers(projectRoot, context.logger);
386386

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

392+
let target: string[];
393+
if (isZonelessApp(polyfills)) {
394+
target = transformSupportedBrowsersToTargets(browsers);
395+
} else {
396+
// Rolldown doesn't have an option to support Zone.js/async-await, so we need to support es2016.
397+
target = ['es2016'];
398+
}
399+
393400
let ssrMode: ServerSsrMode = ServerSsrMode.NoSsr;
394401
if (
395402
browserOptions.outputMode &&
@@ -418,7 +425,6 @@ export async function* serveWithVite(
418425
ssrMode,
419426
prebundleTransformer,
420427
target,
421-
isZonelessApp(polyfills),
422428
componentStyles,
423429
templateUpdates,
424430
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
@@ -98,7 +98,6 @@ function createSsrConfig(
9898
externalMetadata: DevServerExternalResultMetadata,
9999
serverOptions: NormalizedDevServerOptions,
100100
prebundleTransformer: JavaScriptTransformer,
101-
zoneless: boolean,
102101
target: string[],
103102
prebundleLoaderExtensions: EsbuildLoaderOption | undefined,
104103
thirdPartySourcemaps: boolean,
@@ -118,7 +117,6 @@ function createSsrConfig(
118117
include: externalMetadata.implicitServer,
119118
ssr: true,
120119
prebundleTransformer,
121-
zoneless,
122120
target,
123121
loader: prebundleLoaderExtensions,
124122
thirdPartySourcemaps,
@@ -136,7 +134,6 @@ export async function setupServer(
136134
ssrMode: ServerSsrMode,
137135
prebundleTransformer: JavaScriptTransformer,
138136
target: string[],
139-
zoneless: boolean,
140137
componentStyles: Map<string, ComponentStyleRecord>,
141138
templateUpdates: Map<string, string>,
142139
prebundleLoaderExtensions: EsbuildLoaderOption | undefined,
@@ -208,7 +205,6 @@ export async function setupServer(
208205
externalMetadata,
209206
serverOptions,
210207
prebundleTransformer,
211-
zoneless,
212208
target,
213209
prebundleLoaderExtensions,
214210
thirdPartySourcemaps,
@@ -247,7 +243,6 @@ export async function setupServer(
247243
ssr: false,
248244
prebundleTransformer,
249245
target,
250-
zoneless,
251246
loader: prebundleLoaderExtensions,
252247
thirdPartySourcemaps,
253248
define,

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

Lines changed: 37 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import type { DepOptimizationConfig } from 'vite' with {
1515
};
1616
import type { ExternalResultMetadata } from '../esbuild/bundler-execution-result';
1717
import { JavaScriptTransformer } from '../esbuild/javascript-transformer';
18-
import { getFeatureSupport } from '../esbuild/utils';
1918

2019
export type AngularMemoryOutputFiles = Map<
2120
string,
@@ -44,10 +43,6 @@ export function lookupMimeTypeFromRequest(url: string): string | undefined {
4443
return extension && lookupMimeType(extension);
4544
}
4645

47-
type ViteEsBuildPlugin = NonNullable<
48-
NonNullable<DepOptimizationConfig['esbuildOptions']>['plugins']
49-
>[0];
50-
5146
export type EsbuildLoaderOption = Exclude<
5247
DepOptimizationConfig['esbuildOptions'],
5348
undefined
@@ -58,7 +53,6 @@ export function getDepOptimizationConfig({
5853
exclude,
5954
include,
6055
target,
61-
zoneless,
6256
prebundleTransformer,
6357
ssr,
6458
loader,
@@ -71,48 +65,56 @@ export function getDepOptimizationConfig({
7165
target: string[];
7266
prebundleTransformer: JavaScriptTransformer;
7367
ssr: boolean;
74-
zoneless: boolean;
7568
loader?: EsbuildLoaderOption;
7669
thirdPartySourcemaps: boolean;
7770
define: Record<string, string> | undefined;
7871
}): DepOptimizationConfig {
79-
const plugins: ViteEsBuildPlugin[] = [
80-
{
81-
name: `angular-vite-optimize-deps${ssr ? '-ssr' : ''}${
82-
thirdPartySourcemaps ? '-vendor-sourcemap' : ''
83-
}`,
84-
setup(build: PluginBuild) {
85-
build.onLoad({ filter: /\.[cm]?js$/ }, async (args: OnLoadArgs) => {
86-
return {
87-
contents: await prebundleTransformer.transformFile(args.path),
88-
loader: 'js',
89-
};
90-
});
91-
},
92-
},
93-
];
94-
95-
return {
72+
const config: DepOptimizationConfig = {
9673
// Exclude any explicitly defined dependencies (currently build defined externals)
9774
exclude,
9875
// NB: to disable the deps optimizer, set optimizeDeps.noDiscovery to true and optimizeDeps.include as undefined.
9976
// Include all implict dependencies from the external packages internal option
10077
include: disabled ? undefined : include,
10178
noDiscovery: disabled,
102-
// Add an esbuild plugin to run the Angular linker on dependencies
103-
esbuildOptions: {
104-
// Set esbuild supported targets.
105-
target,
106-
supported: getFeatureSupport(zoneless),
107-
plugins,
108-
loader,
109-
define: {
110-
...define,
111-
'ngServerMode': `${ssr}`,
79+
rolldownOptions: {
80+
transform: {
81+
// Set target.
82+
target,
83+
define: {
84+
...define,
85+
'ngServerMode': `${ssr}`,
86+
},
87+
},
88+
plugins: [
89+
{
90+
name: `angular-vite-optimize-deps${ssr ? '-ssr' : ''}${
91+
thirdPartySourcemaps ? '-vendor-sourcemap' : ''
92+
}`,
93+
transform: {
94+
filter: { id: /\.[cm]?js$/ },
95+
async handler(code: string, id: string) {
96+
const result = await prebundleTransformer.transformData(
97+
id,
98+
code,
99+
/** skipLinker */ false,
100+
);
101+
102+
return {
103+
code: Buffer.from(result).toString('utf-8'),
104+
map: null,
105+
};
106+
},
107+
},
108+
},
109+
],
110+
moduleTypes: loader,
111+
resolve: {
112+
extensions: ['.mjs', '.js', '.cjs'],
112113
},
113-
resolveExtensions: ['.mjs', '.js', '.cjs'],
114114
},
115115
};
116+
117+
return config;
116118
}
117119

118120
export interface DevServerExternalResultMetadata {

0 commit comments

Comments
 (0)