Отличный материал. Блестящая статья.

Официальные документы по-прежнему немного сбивают с толку (но этого и следовало ожидать, когда в нашем распоряжении есть мощная и гибкая система внедрения зависимостей). Документы говорят (не слово в слово!):

  1. CoreModule предполагается импортировать только в AppModule.
  2. CoreModule имеет конструктор @SkipSelf для предотвращения повторного импорта
  3. Но….CoreModuleпо-прежнему использует forRoot(), возвращая ModuleWithProviders

Пункт 3 официальной документации отличается от вашего процесса — вероятно, это вопрос предпочтений компании/разработчика. В документации говорится, что добавление forRoot() в CoreModule является соглашением. Я думаю, это сделано для того, чтобы разрешить передачу конфигов провайдерам, которые сами имеют декоратор @Optional(), чтобы не было предупреждений, если не предоставлена ​​​​зависимость.