typescript - Min Angular 2-app tar lang tid å laste for førstegangsbrukere, jeg trenger hjelp til å gjøre den raskere
Nedenfor har jeg limt inn min app.ts-fil.
Jeg bruker Angular2, med Firebase og TypeScript.
Er grunnen til at det er tregt fordi jeg har mange ruter og jeg injiserer mange filer?
Også fungerer appen min bra, det er bare for førstegangsbrukere som besøker startsiden at jeg har dette problemet.
Jeg er ikke sikker på om bootstrap kan forbedres nederst, eller om jeg gjør noe galt.
Dette er min app.ts-fil:
import {Component, bind, provide, Injectable} from 'angular2/core';
import {bootstrap} from 'angular2/platform/browser'
import {NgIf} from 'angular2/common';
import {Router, Location, ROUTER_BINDINGS, RouterOutlet, RouteConfig, RouterLink, ROUTER_PROVIDERS, APP_BASE_HREF, CanActivate, OnActivate,
ComponentInstruction} from 'angular2/router';
import {HTTP_PROVIDERS, Http, Headers} from 'angular2/http';
import {ANGULAR2_GOOGLE_MAPS_PROVIDERS} from 'angular2-google-maps/core';
import {enableProdMode} from 'angular2/core';
enableProdMode();
import {LoggedInRouterOutlet} from './interceptor';
import {AuthService} from './services/authService/authService';
import {SocialService} from './services/socialService/socialService';
import {UserService} from './services/userService/userService';
import {OrganisationService} from './services/organisationService/organisationService';
import {NotificationService} from './services/notificationService/notificationService';
import {EmailService} from './services/emailService/emailService';
import {UserProfile} from './models/profile/profile';
import {Organisation} from './models/organisation/organisation';
import {HeaderNavigation} from './components/header/header';
import {HeaderNavigationLoggedIn} from './components/header/headerNavigationLoggedIn';
import {HeaderNavigationLoggedInCompany} from './components/header/headerNavigationLoggedInCompany';
import {Footer} from './components/footer/footer';
import {SideMenuCompany} from './components/header/sideMenuCompany';
import {SideMenuUser} from './components/header/sideMenuUser';
import {Splash} from './components/splash/splash';
import {CreateJob} from './components/createJob/createJob';
import {SearchJobs} from './components/searchJobs/searchJobs';
import {Login} from './components/login/login';
import {Applications} from './components/applications/applications';
import {Register} from './components/register/register';
import {ForgotPassword} from './components/forgotpassword/forgotpassword';
import {ChangePassword} from './components/changepassword/changepassword';
import {ChangeEmail} from './components/changeemail/changeemail';
import {SocialRegister} from './components/socialregister/socialregister';
import {Admin} from './components/admin/admin';
import {Contact} from './components/contact/contact';
import {SearchUsers} from './components/searchusers/searchusers';
import {Jobs} from './components/job/jobs';
import {CompanyProfile} from './components/company/company';
import {Home} from './components/home/home';
import {Dashboard} from './components/dashboard/dashboard';
import {Profile} from './components/profile/profile';
import {UserApplications} from './components/userApplications/userApplications';
@Component({
selector: 'app',
providers: [UserService, UserProfile, OrganisationService, Organisation],
template: `
<Splash *ngIf="isLoggedIn"></Splash>
<HeaderNavigation *ngIf="!isLoggedIn"></HeaderNavigation>
<HeaderNavigationLoggedIn *ngIf="isLoggedIn && isUserLogin"></HeaderNavigationLoggedIn>
<HeaderNavigationLoggedInCompany *ngIf="isLoggedIn && isCompanyLogin"></HeaderNavigationLoggedInCompany>
<SideMenuCompany *ngIf="isLoggedIn && isCompanyLogin"></SideMenuCompany>
<SideMenuUser *ngIf="isLoggedIn && isUserLogin"></SideMenuUser>
<div class="content">
<router-outlet></router-outlet>
</div>
`,
directives: [RouterOutlet, RouterLink, Splash, HeaderNavigation, HeaderNavigationLoggedIn, NgIf, HeaderNavigationLoggedInCompany, SideMenuCompany, SideMenuUser, Footer, LoggedInRouterOutlet]
})
@RouteConfig([
{ path: '/', component: Home, as: 'Home', data:{title: 'Welcome Home'}},
{ path: '/home', component: Home, as: 'Home', useAsDefault: true},
{ path: '/login', component: Login, as: 'Login' },
{ path: '/register/:id', component: Register, as: 'Register' },
{ path: '/forgotpassword', component: ForgotPassword, as: 'ForgotPassword' },
{ path: '/dashboard', component: Dashboard, as: 'Dashboard' },
{ path: '/search', component: SearchJobs, as: 'Search' },
{ path: '/profile', component: Profile, as: 'Profile' },
{ path: '/settings', component: CompanyProfile, as: 'Settings' },
{ path: '/jobs', component: Jobs, as: 'Jobs' },
{ path: '/password', component: ChangePassword, as: 'Password' },
{ path: '/email', component: ChangeEmail, as: 'Email' },
{ path: '/applications', component: Applications, as: 'Applications' },
{ path: '/socialRegister/:id', component: SocialRegister, as: 'SocialRegister' },
{ path: '/socialRegister', component: SocialRegister, as: 'SocialRegister' },
{ path: '/applys', component: UserApplications, as: 'Applys' },
{ path: '/contact', component: Contact, as: 'Contact' },
{ path: '/searchTeachers', component: SearchUsers, as: 'SearchUsers' },
{ path: '/createJob', component: CreateJob, as: 'CreateJob' },
{ path: '/adminmarkchris2016', component: Admin, as: 'AdminMarkChris2016' },
{ path:'/**', redirectTo: ['Home']}
])
@Injectable()
export class AppComponent {
router: Router;
location: Location;
authService: AuthService;
userService: UserService
isLoggedIn: boolean = false;
isCompanyLogin: boolean = false;
isUserLogin: boolean = false;
userProfile: UserProfile;
constructor(_router: Router, _location: Location, _authService: AuthService, _userService: UserService, _userProfile: UserProfile){
this.router = _router;
this.location = _location;
this.authService = _authService;
this.userService = _userService;
this.userProfile = _userProfile;
this.isUserLoggedIn(this.location.path());
//On refresh
this.router.subscribe((currentRoute) => {
this.isUserLoggedIn(currentRoute);
})
}
isUserLoggedIn(currentRoute): void{
this.authService.checkIfLoggedIn().then((response) => {
this.isLoggedIn = response
if(this.isLoggedIn){
this.isUserOrganisationOrTeacher();
}
if(currentRoute.substring(0, 14) == "socialRegister" || currentRoute == "socialRegister" || currentRoute == "home" || currentRoute == "contact" || currentRoute == "" || currentRoute == "forgotpassword" || currentRoute == "login" || currentRoute.substring(0, 8) == "register"){
this.isCompanyLogin = false;
this.isUserLogin = false;
this.isLoggedIn = false;
}
});
}
isUserOrganisationOrTeacher(): void{
this.userService.checkIfProfileExists().then((response) => {
this.isCompanyLogin = false;
this.isUserLogin = false;
if(response){
this.isUserLogin = true;
this.isCompanyLogin = false;
}else{
this.isCompanyLogin = true;
this.isUserLogin = false;
}
});
}
}
bootstrap(AppComponent, [ROUTER_PROVIDERS, provide(APP_BASE_HREF, {useValue: '/'}), HTTP_PROVIDERS, AuthService, SocialService, UserService, EmailService, OrganisationService, NotificationService, ANGULAR2_GOOGLE_MAPS_PROVIDERS]);
Svar #1
For å ha noe klart for produksjon (og få det til å gå raskere), må du pakke det.
Jeg mener å transpile alle filer til JavaScript-filer og konkatinere dem på samme måte som Angular2 gjør for eksempel. På denne måten vil du ha flere moduler samlet i én enkelt JS-fil. På denne måten vil du redusere antall HTTP-forespørsler for å laste inn applikasjonskoden i nettleseren.
Faktisk, for den følgende konfigurasjonen av SystemJS, vil du ha ett kall per modul (det er egnet for utvikling, men ikke særlig effektivt i produksjon):
<script>
System.config({
packages: {
app: {
format: 'register',
defaultExtension: 'js'
}
}
});
System.import('app/boot')
.then(null, console.error.bind(console));
</script>
Dette svaret kan gi hint om hvordan moduloppløsning fungerer:
- Hvordan løser Angular2 imports?
Du kan gjøre denne pakkinga ved å bruke Gulp og dets plugins:
- https://www.npmjs.com/package/gulp-tsc
- https://github.com/contra/gulp-concat
Se de følgende svarene:
- Bruke Gulp for å sammenkoble og uglifisere filer
- https://github.com/JavascriptMick/angular2-gulp-typescript/blob/master/gulpfile.js
Svar #2
Selv om det er sent, for folk som kommer hit nå... hvis du bruker Angular2+, prøv
ng build --prod --env=<staging or prod or your env file>
Det vil gjøre AoT, sammenstilling av cache-busting og minifisering alt i én kommando. Flere detaljer kan finnes på Angulars offisielle nettsted i ng build-seksjonen. I mitt tilfelle var en av chunk faktisk 2,4 MB, som ble redusert til 450+ KB, men etter å ha inkludert --prod ble den ytterligere redusert til 200+ KB
God størrelse for en app avhenger. Angular2 har konseptet med lazy loading av kode eller chunking. Du kan dele appen din inn i biter (som admin UI og bruker UI) og laste dem etter behov, slik at hele appen ikke trenger å lastes inn i utgangspunktet, noe som vil bidra til redusert lastetid. Følgende artikler kan være til ekstra hjelp:
- https://blog.waffle.io/code-splitting-in-angular-2-with-webpack-2-ce8dd4b8b23e
- http://blog.rangle.io/optimize-your-angular2-application-with-tree-shaking/
- http://blog.mgechev.com/2016/06/26/tree-shaking-angular2-production-build-rollup-javascript/
