Как загрузить js на уровне компонента в angular 4. Я не хочу загружать все js файлы при запуске приложения

У меня есть много js файлов в моем проекте. Я хочу загрузить их при загрузке определенного модуля или компонента, когда приложение запускается.

Кто-нибудь знает, как это сделать?

В настоящее время я загружаю index.html. или другим способом добавить в angular -cli.json файл в script. Но оба способа загружают js при запуске.

Мне нужно загрузить, когда будет работать конкретная страница или модуль.

Ответы

Ответ 1

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

Пожалуйста, проверьте эту ссылку: fooobar.com/questions/387431/...

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

Вам нужно создать script element на лету, а затем добавить его в DOM.

В этой функции loadScript у меня есть только check existence одного js, если у вас несколько js, тогда вам нужно внести некоторые изменения в логику.

Если у вас есть какие-либо вопросы, дайте мне знать, я помогу вам

Ответ 2

Просто напишите обычный загрузчик script:

   public loadScript() {
            let body = <HTMLDivElement> document.body;
            let script = document.createElement('script');
            script.innerHTML = '';
            script.src = 'url';
            script.async = true;
            script.defer = true;
            body.appendChild(script);
    }

а затем вызовите его там, где хотите:

export class MyComponent{

    ngOnInit(){
        this.loadScript();

    }

}

Но если эти файлы являются Typescript файлами, вы можете лениво загрузить их также различными способами:

1- Использование уровня модуля по умолчанию ленивая загрузка

2- Использование webpack require

3- Использование загрузчика модуля SystemJs

Ответ 3

Вы можете добиться этого с помощью ленивой функции загрузки RouterModule.

Настройте свой app.module.ts следующим образом. loadChildren -property должен указывать на пункт назначения модуля и после того, как хэш должен быть именем модуля.

const routes: Routes = [
    {
        path: 'landing-page',
        loadChildren: './landing-page/landing-page.module#LandingPageModule'
    },
    {
        path: 'another-page',
        loadChildren: './another-page/another-page.module#AnotherPageModule'
    }
];

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    RouterModule.forRoot(routes),
    ...
  ],
  providers: [ ... ],
  bootstrap: [AppComponent]
})
export class AppModule { }

Поместите роутер-выход внутри вашего html, если он еще не сделан:

<router-outlet></router-outlet>

Затем настройте свои страничные модули следующим образом:

const routes: Routes = [
  { path: '', component: LandingPageComponent },
  ...
];

@NgModule({
  imports: [
    RouterModule.forChild(routes),
    ...
  ],
  declarations: [ ... ],
  providers: [ ... ]
})
export class LandingPageModule { }

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

И когда я открою свой сайт, я загружу только требуемые фрагменты для текущей страницы:

введите описание изображения здесь

Ответ 4

Найдите файл .angular-cli.json и найдите массив скриптов, затем добавьте скрипты js; Вот так:

<root-directory> > .angular-cli.json > 
"scripts": [
  "../node_modules/tinymce/tinymce.js",
  "../node_modules/tinymce/themes/modern/theme.js",
]

ИЛИ вы можете использовать Lazy Loading...