ng build - динамические переменные prod теряются - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть ngModule, который использует ngx-socket-io , я удалил ненужный импорт и инъекции :), как вы можете заметить, я прокомментировал некоторый код, который работает как charm только в разработке сборки приложения,как только я создаю приложение, используя --prod, эти переменные больше не будут работать, если они будут зарегистрированы на консоли, то значение будет таким же, как статическое объявление, но SocketIoModule.forRoot (socketConfig) не увидит их, если сборка с использованием --prod flag

import { SocketIoModule, SocketIoConfig } from "ngx-socket-io";
const socketConfig = {
    url: 'http://localhost:3000',
    options: {
        query: {
            userId: "f9ae03de-f043-4704-882e-d269ee514805"
        }
    }
};

// const userId = (<any>window).MaxDuel.instance.userId;
// const socket = (<any>window).MaxDuel.instance.socket;
// const socketConfig = {url: socket, options: {query: {userId}}};
// const socketConfig2 = JSON.parse(JSON.stringify(socketConfig));
console.log(socketConfig);

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

но после комментирования переменных и введения той же копии, но в статическом объявлении, приложение снова начинает работать!как вы можете видеть, я даже сериализовал и десериализовал для имитации статического объявления, но опять же ничего!

главная проблема в том, что мне нужен userId для соединения, и эта переменная не может быть статической

1 Ответ

0 голосов
/ 26 ноября 2018

Это потому, что при запуске ng build --prod компилятор AOT используется по умолчанию, что означает, что ваш код собирается на сервере и обслуживается пользователю.В этот момент нет объекта window или объекта MaxDuel.Итак, вам нужно найти другой путь.К счастью для вас, есть!

Я прочитал документацию библиотеки, которую вы используете.Существует еще один способ создания экземпляра Socket. Здесь вы можете прочитать об этом

Вам необходимо создать свой собственный Socket и предоставить его.

import { Injectable, NgModule } from '@angular/core';
import { Socket } from 'ngx-socket-io';

@Injectable()
export class MySocket extends Socket {

    constructor() {
        super({url: window.MaxDuel.instance.socket, 
               options: {
                 query: {window.MaxDuel.instance.userId
              }});
    }

}

@NgModule({
  declarations: [
    //components
  ],
  imports: [
    SocketIoModule,
    //...
  ],
  providers: [{
     provide: Socket, useClass: MySocket
  }],
  bootstrap: [/** AppComponent **/]
})
export class AppModule { }

Теперь вы можете ввести Socket в любом местеваше приложение и используйте его просто отлично.

...