Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

dev-server: es2016 prebundle target for zone.js apps lowers private fields and breaks dependencies

オープン
#34,280 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
48/100
issue の種類
バグ
明瞭さ
おおむね明確
活発さ
活発
技術スタック
angular, babel, node.js, typescript
領域
build-system

調査の方向性

Start by tracing the dev-server dependency prebundle configuration changed in #33772 and how its es2016 target is applied to zone.js apps; the issue does not name the relevant files or tests. Compare the existing Babel linker step and Rolldown target behavior, then run the provided ix-modal reproduction with zone.js. Done when prebundling lowers async/await without lowering unrelated syntax such as private fields, and the modal can be cancelled without the ReferenceError.

索引モデルが issue の本文から書いたものです。

説明

area: @angular/build

Command

serve

Is this a regression?

  • Yes, this behavior used to work in the previous version

The previous version in which this bug was not present was

22.0.1

Description

Since #33772 (22.1.4), the dev server prebundles dependencies with an es2016 target for zone.js apps, so async/await gets lowered (#33770). But rolldown can't lower only async/await like esbuild's supported: { 'async-await': false } did. With es2016, it lowers everything newer, including private fields.

That hits an oxc bug: when a static private field is lowered, the helper references the class by name, and if the method has a local with the same name, it reads the local in its TDZ. Minified libraries hit this easily, because the minifier reuses t for both. In our case iX modals can't be closed anymore in ng serve. Production is fine, since it doesn't prebundle and esbuild only lowers async/await.

The oxc bug itself: https://github.com/oxc-project/oxc/issues/27376

I know the actual bug is in oxc, but every zone.js app now runs all its dependencies through a much bigger transform in dev than in production, which is how we ran into it. It'd be great if the prebundle could only lower async/await again. One idea: the prebundle already runs Angular's Babel step for the linker, so @babel/plugin-transform-async-to-generator could do it there and rolldown could keep the real browser targets. I didn't test that though.

Minimal Reproduction

https://github.com/felix-eschey/ix-modal

git clone https://github.com/felix-eschey/ix-modal && cd ix-modal
npm ci
npm run broken    # ng serve on http://localhost:4300 with zone.js

Open http://localhost:4300, click "Open modal" and then Cancel. The modal stays open and the console shows the ReferenceError. npm run working is the same app without zone.js and works. npm run excluded keeps zone.js but excludes iX from prebundle and works too.

Exception or Error

ReferenceError: Cannot access 't' before initialization
    at t$8.ensureCache (p-BqeSHO6C.js:1:304)
    at get mediumTime (p-BqeSHO6C.js:1:1189)

Your Environment

Angular CLI       : 22.1.7
Angular           : 22.1.6
Node.js           : 24.18.0
Package Manager   : npm 11.16.0
Operating System  : linux x64

@angular/build    : 22.1.7
zone.js           : 0.15.1

Anything else relevant?

Workaround is prebundle: { exclude: [...] } for the affected packages. iX issue: https://github.com/siemens/ix/issues/2874

主要言語
TypeScript
スター
27k
フォーク
11.8k
平均マージ
1日 1時間
マージ済み PR(30日)
161

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

angular/angular-cli のほかの issue

angular/angular-cli の issue をすべて見る

似ている issue

TypeScript の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。