Чтобы не создавать наше приложение 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 минут для определенных проектов.