Angular Модуль с множеством компонентов получает медленную загрузку

Я нашел сценарий, который задерживает запуск моего модуля в Angular 2. Я не опытный парень в Angular. Это мой первый проект. Итак, не знал, как бороться с этим сценарием:

Я создал небольшое приложение, в котором есть различные модули. Каждый модуль имеет 2-3 подкомпонента. Но мой модуль SignUp и модуль MyAccount представляют собой смесь различных компонентов.

Ниже приведена иерархия моего приложения.

приложение
--Внешний интерфейс
----videos
------Detail
--------videodetail.component.html
--------videodetail.component.ts
------List
- ------List.component.html
- ------List.component.ts
- ----videos.component.html
- ----videos.component.ts
- ----videos.routing.ts
- ----videos.module.ts
----article
- ----article.component.html
- ----article.component.ts
---- передние-end.routing.ts
---- передние-end.module.ts
---- передние-end.component.ts
---- передний end.component.html
--signup
----stepone
- ----stepone.component.html
- ----stepone.component.ts
----steptwo
- ----steptwo.component.html
- ----steptwo.component.ts
----stepthree
- ----stepthree.component.html
- ----stepthree.component.ts
----stepfour
- ----stepfour.component.html
- ----stepfour.component.ts
----final
- ----final.component.html
- ----final.component.ts
----OneMore
- ----OneMore.component.html
- ----OneMore.component.ts
- --signup.module.ts
- --signup.component.ts
- --signup.routing.ts
- --signup.component.html app.module.ts app.component.ts app.component.html app.routing.ts

Ниже приведен код маршрутизации signup-routing.module.ts для детей.

const routes: Routes = [
    { path: '', component: SignupComponent },
    { path: 'terms', component: TermsComponent },
    { path: 'first', component: StepOneComponent },
    { path: 'second', component: SteptwoComponent },
    { path: 'third', component: StepthreeComponent },
    { path: 'third/:status', component: StepthreeComponent },
    { path: 'third/:status/:type', component: StepthreeComponent },
    { path: 'success', component: FinalComponent }

В соответствии с запросом ниже приведен конструктор SingupComponent и BaseComponent.

export class BaseComponent implements OnInit  {
    public SiteConfigurations: SiteConfigurations;
    public options: any
    constructor() {
        this.SiteConfigurations = new SiteConfigurations();
        var currentClass= this;
        window["SetDefaultImage"] = function(){}
        window["SetDefaultImage"]=function (event){
          currentClass.SetDefaultImageWithCurrentClass(event,currentClass);
        };
    }

    ngOnInit() {
      //  this.options = Baser
    }

    SetDefaultImageWithCurrentClass(event,currentClass) {
        event.target.src = currentClass.SiteConfigurations.EnvironmentConfigurations.siteURL+"assets/images/no-image.png";
    }
    SetDefaultImage(event) {
      this.SetDefaultImageWithCurrentClass(event,this);
    }
}

export class SignupComponent extends BaseComponent implements OnInit, OnDestroy {
constructor(router: Router, accountService: AccountService) {
    super();
    this.accountService = accountService;
    this.router = router; }

    ngOnInit(): void {
        this.packageType = this.getStepData("packageType");
        this.stepone = this.getStepData("stepone");
        this.steptwo = this.getStepData("steptwo");

        this.options = this.accountService.notificationService.options;
        this.clear = true;
    }
}

Ниже приведен мой код app-routing.module.ts.

const routes: Routes = [
    {
        path: '', component: FrontEndComponent,
        children: [
        { path: 'home', loadChildren: './home/home.module#HomeModule' },
        { path: 'videos', loadChildren: './videos/videos.module#VideosModule' },
        { path: 'myaccount', loadChildren: './users/users.module#UsersModule', canActivate: [AuthGuard] },
        { path: 'signup', loadChildren: '../signup/signup.module#SignupModule' }]   
    } 
];

Когда я запускаю свое приложение и домашняя страница загружается, когда я нажимаю на SignUp в первый раз, требуется некоторое время для выполнения конструктора signup.component.ts. Причина, по которой я обнаружил, состоит в том, что в модуле регистрации есть различные подкомпоненты, которые загружаются когда модуль регистрации вызывается в первый раз (т.е. когда генерируется файл чанка). Та же проблема с модулем AccountModule, где для отображения данных на панели пользователя учетной записи пользователя используется от 8 до 10 субкомпонентов.

Он удерживается в течение 2-3 секунд перед вызовом конструктора компонента SignUp и метода onInit, а затем переходит на сторону сервера для получения данных из базы данных. В то время как другие модули, такие как видео, статьи и другие, имеют только 2 и максимум 3 подкомпонента, и они выполняются немедленно.

Ответ 1

выяснить, что не так в вашем приложении, не обращаясь к кодовой базе, непросто, но я стараюсь сделать то же самое, давая советы, которые могут вам помочь.

Использовать @ angular/cli

Я знаю многих людей, которые отказались от использования инструмента сборки, потому что webpack уже может выполнять оптимизацию и uglifications при правильной настройке, но эти люди не могут себе представить, насколько мощной эта команда:

ng build --prod

Он будет:

  • Скомпилируйте свой код Впереди времени (AOT)
  • Установите флаг production
  • Хешируйте имя файлов (чтобы предотвратить кеширование)
  • Не создавать исходные коды
  • Оптимизируйте свой код (от Angular 5)
  • Запустите UglifyJS в коде

Итак, если вы не используете @angular/cli, начните использовать его. Если вы его используете, но вы все еще не обновили свою версию, обновите ее.

Использовать source-map-explorer

source-map-explorer - это инструмент, который позволяет вам узнать, откуда взялся вес ваших файлов. Возможно, вы импортировали целую библиотеку, но вам просто нужно было несколько функций? Вы можете обнаружить это через этот инструмент.

Chrome - ваш друг

Другим мощным инструментом, который часто игнорируется, является Инструмент разработчика Chrome. Вам ничего не нужно устанавливать, просто нажмите F12, перейдите на вкладку "Производительность" и начните профилирование.

Возможно, вы использовали функцию тяжелой синхронизации, которая замедляет работу приложения? Может быть, есть функция, которая нуждается в некоторой оптимизации? Вы можете это обнаружить, после вашего профилирования вы можете увидеть, где ваше приложение занимает больше времени, и нажав на вкладку "Дерево вызовов", вы можете узнать, что имя этой функции и источник.

Для аналогичных целей вы также можете проверить webpagetest.org.

Используйте служебного работника

Известный способ ускорить ваше приложение - использовать сервисного работника. Вы можете прочитать интересную статью, щелкнув здесь.

Идея заключается в применении PRPL pattern до Angular (который является шаблоном, целью которого является оптимизация синтаксического анализа и выполнения в чтобы достичь интерактивности в низкое время благодаря агрессивному кодовому расщеплению и кешированию).

Я надеюсь, что некоторые мои намеки могут привести вас в правильном направлении. Сообщите мне об этом

Ответ 2

Пожалуйста, прочитайте и поймите о angular ленивой загрузке. Следующие ссылки могут помочь вам решить вашу проблему.

https://angularfirebase.com/lessons/how-to-lazy-load-components-in-angular-4-in-three-steps/

https://medium.com/@leekp/lazy-loading-with-angular-4-29c23792b7f4

https://angular-2-training-book.rangle.io/handout/modules/lazy-loading-module.html

Как я вижу, ваше решение имеет маршрутизацию для каждого модуля. Вы должны загрузить их следующим образом: app-routing.module.ts

const routes: Routes = [
  { path: '', redirectTo: 'home', pathMatch: 'full' },
  { path: 'home', component: HomeComponent },
  { path: 'signup', loadChildren: 'sighup/sighup.module#SignUpModule' },
  { path: 'front-end', loadChildren: 'front-end/front-end.module#FrontEndModule' },

];

Это предотвратит выполнение других модулей при вызове модуля регистрации.

Затем маршрутизация регистрации может измениться следующим образом. (это зависит от вашего приложения)

const routes: Routes = [
    { path: '', component: SignupComponent },
children: [
    { path: 'terms', component: TermsComponent },
    { path: 'first', component: StepOneComponent },
    { path: 'second', component: SteptwoComponent },
    { path: 'third', component: StepthreeComponent },
    { path: 'third/:status', component: StepthreeComponent },
    { path: 'third/:status/:type', component: StepthreeComponent },
    { path: 'success', component: FinalComponent }
]
}

также установлен для модуля регистрации в signup.components.html.

Ответ 3

Если вы чувствуете, что ваше приложение становится медленнее из-за большого количества компонентов. Возможно, вам придется попробовать ленивую загрузку в Angular.

Lazy loading в действии

Вышеупомянутый небольшой ленивый загруженный компонент, который я разработал для своего приложения.

Ленивые модули загрузки помогают нам сократить время запуска. С ленивым загрузка нашего приложения не требуется загружать все сразу, это требуется только загрузить то, что пользователь ожидает увидеть, когда приложение первое грузы. Модули, которые лениво загружаются, загружаются только тогда, когда пользователь переходит к своим маршрутам.

Подробнее о том, как использовать Lazy loading Кредиты - https://angular-2-training-book.rangle.io/handout/modules/lazy-loading-module.html

Ответ 4

Сначала прикрепите файл маршрутизации регистрации. Некоторые средства защиты маршрута замедляют загрузку компонента. Если в файле маршрутизации регистрации есть какое-либо средство защиты, проверьте его, удалив его.