Skip to content

Commit 68f5eb2

Browse files
committed
refactor(core): wrap checkNoChanges body in if (ngDevMode) for better tree-shaking
The `checkNoChanges` method previously used an early-return guard: if (!ngDevMode) return; // dev-only code ... In production builds, `ngDevMode` is replaced with `false`, so the guard compiles to `return;`. However, bundlers like ESBuild still keep the remaining statements after the return as unreachable code instead of removing them. This leaves behind unnecessary dead code in the output. This commit updates the method to instead wrap the full body: if (ngDevMode) { // dev-only code ... } With this change, the method collapses to an empty function in production builds: checkNoChanges() {} This ensures that the dev-only logic and its dependencies (e.g. `checkNoChangesInternal`, `UseExhaustiveCheckNoChanges`) can be fully tree-shaken, reducing bundle size.
1 parent 1a26fd3 commit 68f5eb2

File tree

8 files changed

+15
-52
lines changed

8 files changed

+15
-52
lines changed

packages/core/src/render3/view_ref.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -328,17 +328,22 @@ export class ViewRef<T> implements EmbeddedViewRef<T>, ChangeDetectorRefInterfac
328328
* introduce other changes.
329329
*/
330330
checkNoChanges(): void {
331-
if (!ngDevMode) return;
332-
333-
try {
334-
this.exhaustive ??= this._lView[INJECTOR].get(
335-
UseExhaustiveCheckNoChanges,
336-
USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT,
337-
);
338-
} catch {
339-
this.exhaustive = USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT;
331+
// Note: we use `if (ngDevMode) { ... }` instead of an early return.
332+
// ESBuild is conservative about removing dead code that follows `return;`
333+
// inside a function body, so the block may remain in the bundle.
334+
// Using a conditional ensures the dev-only logic is reliably tree-shaken
335+
// in production builds.
336+
if (ngDevMode) {
337+
try {
338+
this.exhaustive ??= this._lView[INJECTOR].get(
339+
UseExhaustiveCheckNoChanges,
340+
USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT,
341+
);
342+
} catch {
343+
this.exhaustive = USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT;
344+
}
345+
checkNoChangesInternal(this._lView, this.exhaustive);
340346
}
341-
checkNoChangesInternal(this._lView, this.exhaustive);
342347
}
343348

344349
attachToViewContainerRef() {

packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@
5757
"ChangeDetectionScheduler",
5858
"ChangeDetectionSchedulerImpl",
5959
"ChangeDetectionStrategy",
60-
"CheckNoChangesMode",
6160
"ComponentFactory",
6261
"ComponentFactory2",
6362
"ComponentFactoryResolver",
@@ -262,10 +261,8 @@
262261
"TracingService",
263262
"TransitionAnimationEngine",
264263
"TransitionAnimationPlayer",
265-
"USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT",
266264
"USE_VALUE",
267265
"UnsubscriptionError",
268-
"UseExhaustiveCheckNoChanges",
269266
"VIEW_REFS",
270267
"VOID_VALUE",
271268
"ViewEncapsulation",
@@ -309,7 +306,6 @@
309306
"_applyRootElementTransformImpl",
310307
"_bind",
311308
"_callAndReportToErrorHandler",
312-
"_checkNoChangesMode",
313309
"_convertTimeValueToMS",
314310
"_currentInjector",
315311
"_document",
@@ -370,7 +366,6 @@
370366
"callHookInternal",
371367
"callHooks",
372368
"captureError",
373-
"checkNoChangesInternal",
374369
"checkStable",
375370
"classIndexOf",
376371
"cleanUpView",
@@ -812,7 +807,6 @@
812807
"setIncludeViewProviders",
813808
"setInjectImplementation",
814809
"setInputsFromAttrs",
815-
"setIsInCheckNoChangesMode",
816810
"setIsRefreshingViews",
817811
"setLocaleId",
818812
"setPropertyAndInputs",

packages/core/test/bundling/defer/bundle.golden_symbols.json

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@
8686
"ChangeDetectionScheduler",
8787
"ChangeDetectionSchedulerImpl",
8888
"ChangeDetectionStrategy",
89-
"CheckNoChangesMode",
9089
"ComponentFactory",
9190
"ComponentFactory2",
9291
"ComponentFactoryResolver",
@@ -241,10 +240,8 @@
241240
"T_HOST",
242241
"TracingAction",
243242
"TracingService",
244-
"USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT",
245243
"USE_VALUE",
246244
"UnsubscriptionError",
247-
"UseExhaustiveCheckNoChanges",
248245
"VIEW_REFS",
249246
"ViewEncapsulation",
250247
"ViewRef",
@@ -281,7 +278,6 @@
281278
"_applyRootElementTransformImpl",
282279
"_bind",
283280
"_callAndReportToErrorHandler",
284-
"_checkNoChangesMode",
285281
"_currentInjector",
286282
"_getInsertInFrontOfRNodeWithI18n",
287283
"_icuContainerIterate",
@@ -333,7 +329,6 @@
333329
"callHookInternal",
334330
"callHooks",
335331
"captureError",
336-
"checkNoChangesInternal",
337332
"checkStable",
338333
"classIndexOf",
339334
"cleanUpView",
@@ -706,7 +701,6 @@
706701
"setIncludeViewProviders",
707702
"setInjectImplementation",
708703
"setInputsFromAttrs",
709-
"setIsInCheckNoChangesMode",
710704
"setIsRefreshingViews",
711705
"setLDeferBlockDetails",
712706
"setLocaleId",

packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
"ChangeDetectionScheduler",
5252
"ChangeDetectionSchedulerImpl",
5353
"ChangeDetectionStrategy",
54-
"CheckNoChangesMode",
5554
"CheckboxControlValueAccessor",
5655
"CommonModule",
5756
"ComponentFactory",
@@ -264,10 +263,8 @@
264263
"TracingAction",
265264
"TracingService",
266265
"UNSET",
267-
"USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT",
268266
"USE_VALUE",
269267
"UnsubscriptionError",
270-
"UseExhaustiveCheckNoChanges",
271268
"VALID",
272269
"VE_ViewContainerRef",
273270
"VIEW_REFS",
@@ -328,7 +325,6 @@
328325
"_arrayIndexOfSorted",
329326
"_bind",
330327
"_callAndReportToErrorHandler",
331-
"_checkNoChangesMode",
332328
"_currentInjector",
333329
"_document",
334330
"_findMatchingDehydratedViewImpl",
@@ -399,7 +395,6 @@
399395
"callHooks",
400396
"callOrApply",
401397
"captureError",
402-
"checkNoChangesInternal",
403398
"checkStable",
404399
"checkStylingProperty",
405400
"classIndexOf",
@@ -946,7 +941,6 @@
946941
"setIncludeViewProviders",
947942
"setInjectImplementation",
948943
"setInputsFromAttrs",
949-
"setIsInCheckNoChangesMode",
950944
"setIsRefreshingViews",
951945
"setJitOptions",
952946
"setLocaleId",

packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@
5252
"ChangeDetectionSchedulerImpl",
5353
"ChangeDetectionStrategy",
5454
"ChangeDetectorRef",
55-
"CheckNoChangesMode",
5655
"CheckboxControlValueAccessor",
5756
"CommonModule",
5857
"ComponentFactory",
@@ -261,10 +260,8 @@
261260
"TracingAction",
262261
"TracingService",
263262
"UNSET",
264-
"USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT",
265263
"USE_VALUE",
266264
"UnsubscriptionError",
267-
"UseExhaustiveCheckNoChanges",
268265
"VALID",
269266
"VE_ViewContainerRef",
270267
"VIEW_REFS",
@@ -332,7 +329,6 @@
332329
"_arrayIndexOfSorted",
333330
"_bind",
334331
"_callAndReportToErrorHandler",
335-
"_checkNoChangesMode",
336332
"_currentInjector",
337333
"_document",
338334
"_findMatchingDehydratedViewImpl",
@@ -404,7 +400,6 @@
404400
"callHooks",
405401
"callOrApply",
406402
"captureError",
407-
"checkNoChangesInternal",
408403
"checkStable",
409404
"checkStylingProperty",
410405
"classIndexOf",
@@ -945,7 +940,6 @@
945940
"setIncludeViewProviders",
946941
"setInjectImplementation",
947942
"setInputsFromAttrs",
948-
"setIsInCheckNoChangesMode",
949943
"setIsRefreshingViews",
950944
"setJitOptions",
951945
"setLocaleId",

packages/core/test/bundling/hydration/bundle.golden_symbols.json

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
"ChangeDetectionScheduler",
4343
"ChangeDetectionSchedulerImpl",
4444
"ChangeDetectionStrategy",
45-
"CheckNoChangesMode",
4645
"ComponentFactory",
4746
"ComponentFactory2",
4847
"ComponentFactoryResolver",
@@ -230,10 +229,8 @@
230229
"TracingAction",
231230
"TracingService",
232231
"TransferState",
233-
"USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT",
234232
"USE_VALUE",
235233
"UnsubscriptionError",
236-
"UseExhaustiveCheckNoChanges",
237234
"VIEW_REFS",
238235
"ViewEncapsulation",
239236
"ViewRef",
@@ -270,7 +267,6 @@
270267
"_applyRootElementTransformImpl",
271268
"_bind",
272269
"_callAndReportToErrorHandler",
273-
"_checkNoChangesMode",
274270
"_currentInjector",
275271
"_document",
276272
"_findAndReconcileMatchingDehydratedViewsImpl",
@@ -328,7 +324,6 @@
328324
"callHooks",
329325
"canHydrateNode",
330326
"captureError",
331-
"checkNoChangesInternal",
332327
"checkStable",
333328
"cleanUpView",
334329
"cleanupDehydratedIcuData",
@@ -751,7 +746,6 @@
751746
"setInjectImplementation",
752747
"setInputsFromAttrs",
753748
"setIsI18nHydrationSupportEnabled",
754-
"setIsInCheckNoChangesMode",
755749
"setIsRefreshingViews",
756750
"setLocaleId",
757751
"setRootDomAdapter",

packages/core/test/bundling/router/bundle.golden_symbols.json

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050
"ChangeDetectionSchedulerImpl",
5151
"ChangeDetectionStrategy",
5252
"ChangeDetectorRef",
53-
"CheckNoChangesMode",
5453
"ChildActivationEnd",
5554
"ChildActivationStart",
5655
"ChildrenOutletContexts",
@@ -306,7 +305,6 @@
306305
"TracingService",
307306
"Tree",
308307
"TreeNode",
309-
"USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT",
310308
"USE_VALUE",
311309
"UnsubscriptionError",
312310
"UrlHandlingStrategy",
@@ -315,7 +313,6 @@
315313
"UrlSegmentGroup",
316314
"UrlSerializer",
317315
"UrlTree",
318-
"UseExhaustiveCheckNoChanges",
319316
"VE_ViewContainerRef",
320317
"VIEW_REFS",
321318
"ViewContainerRef",
@@ -373,7 +370,6 @@
373370
"_applyRootElementTransformImpl",
374371
"_bind",
375372
"_callAndReportToErrorHandler",
376-
"_checkNoChangesMode",
377373
"_currentInjector",
378374
"_document",
379375
"_findMatchingDehydratedViewImpl",
@@ -445,7 +441,6 @@
445441
"captureError",
446442
"catchError",
447443
"checkGuards",
448-
"checkNoChangesInternal",
449444
"checkStable",
450445
"classIndexOf",
451446
"cleanUpView",
@@ -1062,7 +1057,6 @@
10621057
"setIncludeViewProviders",
10631058
"setInjectImplementation",
10641059
"setInputsFromAttrs",
1065-
"setIsInCheckNoChangesMode",
10661060
"setIsRefreshingViews",
10671061
"setLocaleId",
10681062
"setRootDomAdapter",

packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
"ChangeDetectionScheduler",
3535
"ChangeDetectionSchedulerImpl",
3636
"ChangeDetectionStrategy",
37-
"CheckNoChangesMode",
3837
"ComponentFactory",
3938
"ComponentFactory2",
4039
"ComponentFactoryResolver",
@@ -189,10 +188,8 @@
189188
"T_HOST",
190189
"TracingAction",
191190
"TracingService",
192-
"USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT",
193191
"USE_VALUE",
194192
"UnsubscriptionError",
195-
"UseExhaustiveCheckNoChanges",
196193
"VIEW_REFS",
197194
"ViewEncapsulation",
198195
"ViewRef",
@@ -222,7 +219,6 @@
222219
"_applyRootElementTransformImpl",
223220
"_bind",
224221
"_callAndReportToErrorHandler",
225-
"_checkNoChangesMode",
226222
"_currentInjector",
227223
"_document",
228224
"_getInsertInFrontOfRNodeWithI18n",
@@ -269,7 +265,6 @@
269265
"callHookInternal",
270266
"callHooks",
271267
"captureError",
272-
"checkNoChangesInternal",
273268
"checkStable",
274269
"cleanUpView",
275270
"collectNativeNodes",
@@ -596,7 +591,6 @@
596591
"setIncludeViewProviders",
597592
"setInjectImplementation",
598593
"setInputsFromAttrs",
599-
"setIsInCheckNoChangesMode",
600594
"setIsRefreshingViews",
601595
"setLocaleId",
602596
"setRootDomAdapter",

0 commit comments

Comments
 (0)