Skip to content

Commit f8a56f3

Browse files
author
Alexander Vakrilov
authored
Merge pull request #529 from NativeScript/aot-optimizations
Optimize platfroms for AOT
2 parents c5ff8ac + dc70da7 commit f8a56f3

File tree

8 files changed

+222
-203
lines changed

8 files changed

+222
-203
lines changed

nativescript-angular/dom-adapter.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,6 @@ export class NativeScriptElementSchemaRegistry extends ElementSchemaRegistry {
4949
}
5050
}
5151

52-
export class NativeScriptSanitizer extends Sanitizer {
53-
sanitize(context: SecurityContext, value: string): string {
54-
return value;
55-
}
56-
}
57-
5852
export class NativeScriptDomAdapter extends Parse5DomAdapter {
5953
static makeCurrent() {
6054
rendererLog("Setting DOM");

nativescript-angular/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export * from "./platform";
2+
export * from "./platform-static";
23
export * from "./router";
34
export * from "./forms";
45
export * from "./http";

nativescript-angular/nativescript.module.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,11 @@ import {
1414
ErrorHandler,
1515
Renderer,
1616
RootRenderer,
17-
Sanitizer,
18-
NgModule, NO_ERRORS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA
17+
NgModule, NO_ERRORS_SCHEMA,
1918
} from '@angular/core';
2019
import {
2120
defaultPageProvider, defaultFrameProvider, defaultDeviceProvider
2221
} from "./platform-providers";
23-
import { NativeScriptSanitizer } from './dom-adapter';
2422
import { NS_DIRECTIVES } from './directives';
2523

2624
import * as nativescriptIntl from "nativescript-intl";
@@ -45,7 +43,6 @@ export function errorHandlerFactory() {
4543
{ provide: RootRenderer, useClass: NativeScriptRootRenderer },
4644
NativeScriptRenderer,
4745
{ provide: Renderer, useClass: NativeScriptRenderer },
48-
{ provide: Sanitizer, useClass: NativeScriptSanitizer },
4946
ModalDialogService
5047
],
5148
entryComponents: [
Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
// Initial imports and polyfills
2+
import 'globals';
3+
import './zone.js/dist/zone-nativescript';
4+
import 'reflect-metadata';
5+
import './polyfills/array';
6+
import './polyfills/console';
7+
8+
import {
9+
Type,
10+
Injector,
11+
CompilerOptions,
12+
PlatformRef,
13+
NgModuleFactory,
14+
NgModuleRef,
15+
EventEmitter,
16+
Provider,
17+
Sanitizer,
18+
OpaqueToken,
19+
} from '@angular/core';
20+
21+
import { rendererLog, rendererError } from "./trace";
22+
import { PAGE_FACTORY, PageFactory, defaultPageFactoryProvider } from './platform-providers';
23+
24+
import * as application from "application";
25+
import { topmost, NavigationEntry } from "ui/frame";
26+
import { Page } from 'ui/page';
27+
import { TextView } from 'ui/text-view';
28+
29+
import * as nativescriptIntl from "nativescript-intl";
30+
global.Intl = nativescriptIntl;
31+
32+
export const onBeforeLivesync = new EventEmitter<NgModuleRef<any>>();
33+
export const onAfterLivesync = new EventEmitter<NgModuleRef<any>>();
34+
let lastBootstrappedModule: WeakRef<NgModuleRef<any>>;
35+
type BootstrapperAction = () => Promise<NgModuleRef<any>>;
36+
37+
interface BootstrapParams {
38+
appModuleType: Type<any>;
39+
appOptions?: AppOptions;
40+
}
41+
42+
export interface AppOptions {
43+
bootInExistingPage: boolean;
44+
cssFile?: string;
45+
startPageActionBarHidden?: boolean;
46+
}
47+
48+
export type PlatformFactory = (extraProviders?: Provider[]) => PlatformRef;
49+
50+
export class NativeScriptSanitizer extends Sanitizer {
51+
sanitize(context: any, value: string): string {
52+
return value;
53+
}
54+
}
55+
56+
export const COMMON_PROVIDERS = [
57+
defaultPageFactoryProvider,
58+
{ provide: Sanitizer, useClass: NativeScriptSanitizer },
59+
];
60+
61+
export class NativeScriptPlatformRef extends PlatformRef {
62+
private _bootstrapper: BootstrapperAction;
63+
64+
constructor(private platform: PlatformRef, private appOptions?: AppOptions) {
65+
super();
66+
}
67+
68+
bootstrapModuleFactory<M>(moduleFactory: NgModuleFactory<M>): Promise<NgModuleRef<M>> {
69+
this._bootstrapper = () => this.platform.bootstrapModuleFactory(moduleFactory);
70+
71+
this.bootstrapApp();
72+
73+
return null; //Make the compiler happy
74+
}
75+
76+
bootstrapModule<M>(moduleType: Type<M>, compilerOptions: CompilerOptions | CompilerOptions[] = []): Promise<NgModuleRef<M>> {
77+
this._bootstrapper = () => this.platform.bootstrapModule(moduleType, compilerOptions);
78+
79+
this.bootstrapApp();
80+
81+
return null; //Make the compiler happy
82+
}
83+
84+
private bootstrapApp() {
85+
global.__onLiveSyncCore = () => this.livesyncModule();
86+
87+
const mainPageEntry = this.createNavigationEntry(this._bootstrapper);
88+
89+
application.start(mainPageEntry);
90+
}
91+
92+
livesyncModule(): void {
93+
rendererLog("ANGULAR LiveSync Started");
94+
95+
onBeforeLivesync.next(lastBootstrappedModule ? lastBootstrappedModule.get() : null);
96+
97+
const mainPageEntry = this.createNavigationEntry(
98+
this._bootstrapper,
99+
compRef => onAfterLivesync.next(compRef),
100+
error => onAfterLivesync.error(error),
101+
true
102+
);
103+
mainPageEntry.animated = false;
104+
mainPageEntry.clearHistory = true;
105+
106+
const frame = topmost();
107+
if (frame) {
108+
if (frame.currentPage && frame.currentPage.modal) {
109+
frame.currentPage.modal.closeModal();
110+
}
111+
frame.navigate(mainPageEntry);
112+
}
113+
}
114+
115+
onDestroy(callback: () => void): void {
116+
this.platform.onDestroy(callback);
117+
}
118+
119+
get injector(): Injector {
120+
return this.platform.injector;
121+
};
122+
123+
destroy(): void {
124+
this.platform.destroy();
125+
}
126+
127+
get destroyed(): boolean {
128+
return this.platform.destroyed;
129+
}
130+
131+
private createNavigationEntry(
132+
bootstrapAction: BootstrapperAction,
133+
resolve?: (comp: NgModuleRef<any>) => void,
134+
reject?: (e: Error) => void,
135+
isLivesync: boolean = false,
136+
isReboot: boolean = false): NavigationEntry {
137+
138+
const pageFactory: PageFactory = this.platform.injector.get(PAGE_FACTORY);
139+
140+
const navEntry: NavigationEntry = {
141+
create: (): Page => {
142+
let page = pageFactory({ isBootstrap: true, isLivesync });
143+
if (this.appOptions) {
144+
page.actionBarHidden = this.appOptions.startPageActionBarHidden;
145+
}
146+
147+
let onLoadedHandler = function (args) {
148+
page.off('loaded', onLoadedHandler);
149+
//profiling.stop('application-start');
150+
rendererLog('Page loaded');
151+
152+
//profiling.start('ng-bootstrap');
153+
rendererLog('BOOTSTRAPPING...');
154+
bootstrapAction().then((moduleRef) => {
155+
//profiling.stop('ng-bootstrap');
156+
rendererLog('ANGULAR BOOTSTRAP DONE.');
157+
lastBootstrappedModule = new WeakRef(moduleRef);
158+
159+
if (resolve) {
160+
resolve(moduleRef);
161+
}
162+
return moduleRef;
163+
}, (err) => {
164+
rendererError('ERROR BOOTSTRAPPING ANGULAR');
165+
let errorMessage = err.message + "\n\n" + err.stack;
166+
rendererError(errorMessage);
167+
168+
let view = new TextView();
169+
view.text = errorMessage;
170+
page.content = view;
171+
172+
if (reject) {
173+
reject(err);
174+
}
175+
});
176+
};
177+
178+
page.on('loaded', onLoadedHandler);
179+
180+
return page;
181+
}
182+
};
183+
184+
if (isReboot) {
185+
navEntry.animated = false;
186+
navEntry.clearHistory = true;
187+
}
188+
189+
return navEntry;
190+
}
191+
192+
liveSyncApp() {
193+
}
194+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Always import platform-common first - because polyfills
2+
import { NativeScriptPlatformRef, AppOptions, COMMON_PROVIDERS, PlatformFactory } from "./platform-common";
3+
4+
import { platformCore, PlatformRef, createPlatformFactory } from '@angular/core';
5+
6+
// "Static" platform
7+
const _platformNativeScript: PlatformFactory = createPlatformFactory(
8+
platformCore, 'nativeScript', [...COMMON_PROVIDERS]);
9+
10+
export function platformNativeScript(options?: AppOptions, extraProviders?: any[]): PlatformRef {
11+
//Return raw platform to advanced users only if explicitly requested
12+
if (options && options.bootInExistingPage === true) {
13+
return _platformNativeScript(extraProviders);
14+
} else {
15+
return new NativeScriptPlatformRef(_platformNativeScript(extraProviders), options);
16+
}
17+
}

0 commit comments

Comments
 (0)