Доступ к свойствам окна в AoT-скомпилированном приложении Angular - PullRequest
0 голосов
/ 25 апреля 2019

Чтобы не создавать наше приложение Angular несколько раз для разных сред, мы пытались отказаться от внедрения переменных, зависящих от среды (например, конечных точек служб), в наше приложение с обычными fileReplacements и вместо этого загружать эти среды из активы (/assets/environment.js в нашем случае).

Подход изложен в таких сообщениях, как это или это .

Environment.js очень прост. Он включен в тег <script> в нашем index.html, чтобы гарантировать, что он загружается и выполняется перед любым угловым кодом, и он просто устанавливает свойство окна (да, глобальные переменные!)

window.env = {
  serviceUrl: 'https://production.example.com/api'
}

Это работает очень хорошо с одним критическим исключением. В нашем приложении есть модули, которым при настройке требуется доступ к этим переменным среды:

@NgModule({
  imports: [
    ExampleModule.forExample({
      serviceUrl: window.env.serviceUrl,
    }),
  ],
  ...
})
export class AppModule { }

Это не удастся, поскольку window.env отсутствует / undefined при компиляции AoT.

Есть ли способ обойти эту проблему?

Большинство наших приложений тяжелые, поэтому мы не хотим переходить на JiT-компиляцию, и мы также хотели бы свести сборки к минимуму, потому что они могут занимать до 20 минут для определенных проектов.

1 Ответ

0 голосов
/ 09 мая 2019

После того, как мы в основном сдались, мы нашли NGSSC (https://github.com/kyubisation/angular-server-side-configuration).

NGSSC может токенизировать переменные во время сборки AoT. При развертывании приложения в определенной среде эти токены можно заменить фактическими значениями переменных, вызвав ngssc insert.

...