Angular index.html с динамическими значениями | веб-воркер

До недавнего времени мы использовали express.js для обслуживания index.html для Angular, потому что нам нужно заполнить динамические переменные из базы данных до запуска приложения.

<script> window .__ envs = {{{json envs}}} </script>

Однако новый Angular 7 кэширует исходный файл index.html через web-worker.

Поэтому, когда я загружаю веб-сайт, он не загружается должным образом, пока я не нажму «Перезагрузить».

Я попытался отключить index.html из веб-воркера. Ничего не произошло.

Пробовал отключать веб-воркер и удалять его везде. Теперь мне не нужно использовать жесткую перезагрузку, но все равно при первой загрузке будет показан исходный файл, а не модифицированный через express.js

1) Почему исходник загружает исходный файл и как он к нему попадает?

2) Могу ли я настроить его в веб-воркере?

Не могли бы вы добавить пример кода веб-воркера, который кэширует ваш index.html?

yurzui 15.04.2019 05:07

если вам нужны переменные из базы данных до запуска приложения, почему бы не использовать APP_INITIALIZER?

Eliseo 15.04.2019 23:19
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
4
2
2 071
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    HttpModule
  ],
  providers: [
    ServiceProvider, 
    { provide: APP_INITIALIZER, useFactory: ServiceProviderFactory, deps: [ServiceProvider], multi: true }
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

ваш сервис для получения данных как сервис:

@Injectable()
export class ServiceProvider{
constructor(private http: Http) {

    }

getInitialData(){

 // your fetch logic from API
 }
}

ваша фабрика услуг (добавить в модуль):

export function ServiceProviderFactory(provider: ServiceProvider) {
  return () => provider.getInitialData();
}

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

Механизм кэширования, реализованный Service Worker, проверит хеш-сумму, чтобы обнаружить любые изменения файла. Если хэши разные, загрузит новую версию и закэширует ее (но не будет отображать с первого раза).

После обновления во второй раз вы увидите обновленную версию.

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

"configurations": {
     "production": {
          "serviceWorker": false,
          "ngswConfigPath": "src/ngsw-config.json"
     }
}

Кроме того, вы можете прослушивать изменения (SW worker определяет, когда найдена новая версия) и отображать правильное сообщение для пользователей с помощью кнопки для обновления страницы. Посмотрите здесь как поймать и обработать процесс обновления.

Удачи!

Ответ принят как подходящий

Спасибо за ответы, но никто не может точно решить мою проблему. Я не могу использовать APP_INITIALIZER, потому что я не знаю API_URL в данный момент, и это одна из вещей, которые мне нужно передать в приложение. Это динамическое значение, поэтому оно не может быть частью process.env.

Отключение кэширования index.html у меня не работает должным образом.

Но решение довольно простое.

Вместо того, чтобы напрямую изменять файл index.html, я добавил в него <script src = "/envs"> и я выложил этот файл в express.js

app.get('/envs', async (req, res) => {
    const envs = ...
    res.end('window.__envs = ' + JSON.stringify(envs))
})

Другие вопросы по теме