# Overview Ivy is a new backwards-compatible Angular renderer focused on further speed improvements, size reduction, and increased flexibility. Ivy is currently not feature complete, but can be tested via [`enableIvy: true`](https://next.angular.io/guide/ivy#updating-an-existing-project-to-use-ivy) [`angularCompilerOptions` flag](https://next.angular.io/guide/aot-compiler#angular-compiler-options). We currently expect Ivy to remain behind the flag until it's feature complete and battle tested at Google. In the meantime you can check out this [Hello World demo](https://ng-ivy-demo.firebaseapp.com/). # Implementation Status The work can be divided into three categories: - `@angular/compiler-cli`: TypeScript transformer pipeline which includes two command line tools: - `ngtsc`: (Angular TypeScript Compiler) Angular compiler which strips out `@Component` (and friends) and replaces it with `ɵɵdefineComponent` (and friends). - `ngcc`: (Angular Compatibility Compiler) NPM upgrade compiler which reads the `STORING_METADATA_IN_D.TS.json` files and `.js` files and adds `ɵɵdefineComponent` (and friends) into the `node_module`. This in effect converts a pre-ivy module into ivy module. - `@angular/compiler`: Ivy Compiler which converts decorator into ivy - `@angular/core`: Decorators which can be patched with `@angular/compiler`. ## `@angular/compiler-cli` changes ### `ngtsc` TSC compiler transformer TSC transformer which removes and converts `@Pipe`, `@Component`, `@Directive` and `@NgModule` to the corresponding `ɵɵdefinePipe`, `ɵɵdefineComponent`, `ɵɵdefineDirective` and `ɵɵdefineInjector`. - ✅ Basic setup of the transformer into `tsc` - ✅ Can read STORING_METADATA_IN_D.TS from `.d.ts` (see: [STORING_METADATA_IN_D.TS.md](./STORING_METADATA_IN_D.TS.md)) - ✅ Detect decorators and convert them to the `defineXXX` method using the `__Compiler` in `@angular/compiler`. - ✅ Encode selectors into `.d.ts` file. - ✅ support `extends` for `@Pipe`, `@Component`, `@Directive` and `@NgModule`. - ❌ Documentation ### `ngcc` Angular `node_module` compatibility compiler A tool which "upgrades" `node_module` compiled with non-ivy `ngc` into ivy compliant format. - ✅ Basic setup of stand alone executable - ✅ Rewrite existing code by interpreting the associated STORING_METADATA_IN_D.TS - ❌ Integration with WebPack (cli) - ❌ Documentation ## `@angular/compiler` changes - ✅ Component compilation: Translates `@Component` => `ɵɵdefineComponent` - ✅ `TemplateCompiler` (current known as `ViewCompiler`) - ✅ `StyleCompiler` - ✅ `PipeCompiler`: Translates `@Pipe` => `ɵɵdefinePipe` - ✅ `DirectiveCompiler`: Translates `@Directive` => `ɵɵdefineDirective` - ✅ `InjectableCompiler`: Translates `@Injectable` => `ɵɵdefineInjectable` - ✅ `NgModuleCompiler`: Translates `@NgModule` => `ɵɵdefineInjector` (and `ɵɵdefineNgModule` only in jit) - ❌ Documentation ## `@angular/core` changes The goal is for the `@Component` (and friends) to be the compiler of template. Since decorators are functions which execute during parsing of the `.js` file, the decorator can compile the template into Ivy. The AOT compiler's job is to remove the `@Component` and replace it with call to `ɵɵdefineComponent`. - ✅ `@angular/compiler` can patch itself onto: - ✅ `@Injectable` - ✅ `@NgModule` - ✅ `@Pipe` - ✅ `@Directive` - ✅ `@Component` - ✅ `ResourceLoader.resolved: Promise<>` Returns true if all `templateUrl`s and `styleUrl` have been resolved and application is ready to be bootstrapped. # Testing / Debugging - ✅ in debug mode publish components into DOM nodes for easier debugging. # Crosscutting ## Decorators | Annotation | `defineXXX()` | Run time | Spec | Compiler | | -------------------- | ------------------------------ | ------- | -------- | -------- | | `@Component` | ✅ `ɵɵdefineComponent()` | ✅ | ✅ | ✅ | | `@Directive` | ✅ `ɵɵdefineDirective()` | ✅ | ✅ | ✅ | | `@Directive` | ✅ `ɵɵdefineBase()` | ✅ | ✅ | ✅ | | `@Pipe` | ✅ `ɵɵdefinePipe()` | ✅ | ✅ | ✅ | | `@Injectable` | ✅ `ɵɵdefineInjectable()` | ✅ | ✅ | ✅ | | `@NgModule` | ✅ `ɵɵdefineInjector()` | ✅ | ✅ | ✅ | | `@ConfigureInjector` | ✅ `ɵɵdefineInjector()` | ❌ | ❌ | ❌ | ## Component Composition | Feature | Runtime | Spec | Compiler | | ---------------------------------------- | ------- | -------- | -------- | | creation reordering based on injection | ✅ | ✅ | ✅ | | `class CompA extends CompB {}` | ✅ | ✅ | ✅ | | `class CompA extends CompB { @Input }` | ✅ | ✅ | ✅ | | `class CompA extends CompB { @Output }` | ✅ | ✅ | ✅ | ## Change Detection | Feature | Runtime | | ----------------------------------- | ------- | | `markDirty()` | ✅ | | `detectChanges()` | ✅ | | `tick()` | ✅ | | `attach()` | ✅ | | `detach()` | ✅ | | `ON_PUSH` | ✅ | | `ALWAYS` | ✅ | | `DIRTY` | ✅ | | `ATTACHED` | ✅ | ## Bootstrap API | Feature | Runtime | | ----------------------------------- | ------- | | `renderComponent()` | ✅ | | `getHostElement()` | ✅ | | `createInjector()` | ✅ | ## Template Compiler ### Template Syntax | Feature | Runtime | Spec | Compiler | | ------------------------------------------- | ------- | -------- | -------- | | `