
This allows Closure compiler to tree shake unused constructor calls to `NgModuleFactory`, which is otherwise considered side-effectful. The Angular compiler generates factory objects which are exported but typically not used, as they are only needed for compatibility with View Engine. This results in top-level constructor calls, such as: ```typescript export const FooNgFactory = new NgModuleFactory(Foo); ``` `NgModuleFactory` has a side-effecting constructor, so this statement cannot be tree shaken, even if `FooNgFactory` is never imported. The `NgModuleFactory` continues to reference its associated `NgModule` and prevents the module and all its unused dependencies from being tree shaken. This effectively prevents all components from being tree shaken, making Closure builds significantly larger than they should be. The fix here is to wrap `NgModuleFactory` constructor with `noSideEffects(() => /* ... */)`, which tricks the Closure compiler into assuming that the invoked function has no side effects. This allows it to tree-shake unused `NgModuleFactory()` constructors when they aren't imported. Since the factory can be removed, the module can also be removed (if nothing else references it), thus tree shaking unused components as expected. PR Close #38147
fake_core
is a library designed to expose some of the same symbols as @angular/core
, without
requiring compilation of the whole of @angular/core
. This enables unit tests for the compiler to
be written without incurring long rebuilds for every change.
@angular/core
is compiled with@angular/compiler-cli
, and therefore has an implicit dependency on it. Therefore core must be rebuilt if the compiler changes.- Tests for the compiler which intend to build code that depends on
@angular/core
must have a data dependency on@angular/core
. Therefore core must be built to run the compiler tests, and thus rebuilt if the compiler changes.
This rebuild cycle is expensive and slow. fake_core
avoids this by exposing a subset of the
@angular/core
API, which enables applications to be built by the ngtsc compiler without
needing a full version of core present at compile time.