При чтении документации Apollo и о том, как настроить ее с помощью Angular, вы встретите два разных способа инициализации библиотеки и ее зависимостей. Даже если они представляют большинство случаев, иногда это не соответствует вашим потребностям. Вот почему есть другой способ инициализации Apollo с использованием токена APOLLO_OPTIONS.

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

Использование ApolloBoost

Первый и самый простой способ настроить клиент Apollo - использовать ApolloBoostModule и вызвать метод create(), как описано в документации.

import { HttpClientModule } from "@angular/common/http";
import { ApolloBoostModule, ApolloBoost } from "apollo-angular-boost";

@NgModule({
  imports: [
    BrowserModule,
    HttpClientModule,
    ApolloBoostModule],
  ...
})
export class AppModule {
  constructor(boost: ApolloBoost) {
    boost.create({
      uri: "https://graphql_url",
      // Don't forget that you can actually pass http Headers
      // directly here with the option "httpOptions"
    })
  }
}

Этот подход используется по умолчанию и покрывает все потребности в базовых проектах.

Вызов ApolloModule вручную

Здесь тот же принцип, хотя и немного другой. Мы напрямую используем каждый модуль отдельно для настройки нашей конфигурации Apollo.

import { HttpHeaders } from '@angular/common/http';
import { Apollo } from 'apollo-angular';
import { HttpLink } from 'apollo-angular-link-http';
import { setContext } from 'apollo-link-context';
import { InMemoryCache } from 'apollo-cache-inmemory';

@NgModule({ ... })
class AppModule {
  constructor(
    apollo: Apollo,
    httpLink, HttpLink
  ) {
    apollo.create({
      link: httpLink.create({
        uri: "https://graphql_url",
        // Don't forget that you can actually pass http Headers
        // directly here with the option "httpOptions"
      }),
      cache: new InMemoryCache(),
    });
  }
}

Этот способ предназначен для более опытных разработчиков, которые хотят иметь полный контроль над тем, что и как реализовать.

Использование механизма токена инъекции

Другой альтернативой является использование доступного маркера внедрения APOLLO_OPTIONS для настройки всех экземпляров клиента Apollo.

// ... imports
@NgModule({
  imports: [
    BrowserModule,
    HttpClientModule,
    ApolloModule,
    HttpLinkModule
  ],
  declarations: [ AppComponent, HelloComponent ],
  providers: [
    {
      provide: APOLLO_OPTIONS,
      useFactory: httpLink => {
        return {
          link: httpLink.create({
            uri: "https://graphql_url"
              // If needed, you can set custom headers here
              // headers: new HttpHeaders({
              //   Authorization: `Bearer TOKEN`
              // })
          }),
          cache: new InMemoryCache()
        };
      },
      deps: [HttpLink]
    }
  ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }

Используя APOLLO_OPTIONS, мы можем определять параметры, используя параметры внедрения зависимостей, которые будут переданы службе Apollo. Этот токен будет сгенерирован до того, как будет создана какая-либо служба, поэтому зависимые службы будут использовать ее параметры.

Установка с ApolloClient с InjectionToken позволит вам иметь несколько ленивых модулей, которые используют одни и те же настройки.

Пример доступен на Stackblitz: