Задача выглядит тривиальной, особенно, учитывая наличие пакета ng-yandex-metrika. До тех пор, пока не используется рендер на сервере, который выполняется нодой, где нет таких браузерных вещей, как window и document.
Поэтому, сначала подключаем счетчик в index.html:
<!-- Yandex.Metrika counter -->
<script type="text/javascript" >
(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
ym(XXXXXXXX, "init", { });
</script>
<noscript><div><img src="https://mc.yandex.ru/watch/XXXXXXXX" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter -->
Затем вручную отсылаем переходы по страницам, но только в браузере:
import { NgModule, Inject, PLATFORM_ID } from '@angular/core';
import { CommonModule, isPlatformBrowser, Location } from '@angular/common';
import { RouterModule } from '@angular/router';
import { Router, NavigationEnd } from '@angular/router';
@NgModule({
imports: [
CommonModule,
RouterModule,
],
declarations: [],
providers: []
})
export class YaMetrikaModule {
private ym;
constructor(
private router: Router,
private location: Location,
@Inject(PLATFORM_ID) private _platformId: Object
) {
if ( ! isPlatformBrowser(this._platformId)) return;
this.ym = window.ym;
this.router.events.filter(event => (event instanceof NavigationEnd))
.subscribe(() => {
let url = this.location.path();
this.ym(XXXXXXXX, 'hit', url);
});
}
}