Nikita Poltoratsky
Software Engineer at Akveo
@nikpoltoratsky
@nikpoltoratsky
tibing/platform-terminal
dev.to/nikpoltoratsky
medium.com/@nik.poltoratsky
@nikpoltoratsky
// main.ts
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
platformBrowserDynamic().bootstrapModule(AppModule);
@nikpoltoratsky
// angular.json
{
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
// Application entry point
"main": "src/main.ts",
}
// ...
}
}
}
@nikpoltoratsky
// main.ts
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
platformBrowserDynamic().bootstrapModule(AppModule);
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { PlatformRef } from '@angular/core';
// Create Browser Platform
const platformRef: PlatformRef = platformBrowserDynamic();
// Bootstrap Application
platformRef.bootstrapModule(AppModule);
// main.ts
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
platformBrowserDynamic().bootstrapModule(AppModule);
@nikpoltoratsky
@nikpoltoratsky
// Create Browser Platform
const platformRef: PlatformRef = platformBrowserDynamic();
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
Renderer2
Compiler
ElementSchemaRegistry
Sanitizer
etc.
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { PlatformRef } from '@angular/core';
// Create Browser Platform
const platformRef: PlatformRef = platformBrowserDynamic();
// Bootstrap Application
platformRef.bootstrapModule(AppModule);
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
const zone = new NgZone();
zone.run(() => {
// Create Module
const moduleRef = moduleFactory.create();
// All the rest logic executed here
...
});
@nikpoltoratsky
@nikpoltoratsky
// Get error handler from injector
const exceptionHandler: ErrorHandler = injector.get(ErrorHandler);
// Setup error handling outside Angular
// To make sure change-detection will not be triggered
zone.runOutsideAngular(
// Subscribe on zone errors
() => zone.onError.subscribe({
next: (error: any) => {
// Call error handler
exceptionHandler.handleError(error);
}
})
);
@nikpoltoratsky
{provide: APP_INITIALIZER, useValue: setupWebWorker, multi: true},
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
const appRef = injector.get(ApplicationRef);
@nikpoltoratsky
@nikpoltoratsky
// app.module.ts
@NgModule({ bootstrap: [AppComponent] })
export class AppModule {}
// Iterate all declared root components
AppModule.bootstrap.forEach((component) => {
// Create factory for components
const componentFactory =
this._componentFactoryResolver.resolveComponentFactory(component);
// Actually create component
const compRef = componentFactory.create(...);
});
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
export abstract class Renderer2 {
abstract createElement(name: string, namespace?: string|null): any;
abstract createText(value: string): any;
abstract appendChild(parent: any, newChild: any): void;
abstract addClass(el: any, name: string): void;
abstract removeClass(el: any, name: string): void;
// ...
}
@nikpoltoratsky
import { createElement, Screen } from 'ascii-renderer';
const screen = new Screen();
const button = createElement('button');
// Append one element to another
screen.append(button);
// List for events on component
button.on('event name', listener);
@nikpoltoratsky
import { createElement, Screen } from 'ascii-renderer';
export class TerminalRenderer implements Renderer2 {
createElement(name: string, namespace?: string | null): any {
return createElement(name);
}
selectRootElement(): Screen {
return new Screen();
}
appendChild(parent: Element, newChild: Element): void {
parent.append(newChild);
}
...
}
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
@nikpoltoratsky
Nikita Poltoratsky
Software Engineer at Akveo
@nikpoltoratsky
@nikpoltoratsky
tibing/platform-terminal
dev.to/nikpoltoratsky
medium.com/@nik.poltoratsky
@nikpoltoratsky