استفاده از Gtag در انگولار — راهنمای کاربردی

۲۸۱ بازدید
آخرین به‌روزرسانی: ۱۱ شهریور ۱۴۰۲
زمان مطالعه: ۴ دقیقه
استفاده از Gtag در انگولار — راهنمای کاربردی

در این مقاله می‌خواهیم با روش استفاده از قابلیت‌های تگ گذاری سایت گوگل در یک اپلیکیشن ساده تک‌صفحه‌ای انگولار آشنا شویم. با ما همراه باشید تا روش استفاده از Gtag در انگولار را بیاموزید. در کد نمونه زیر می‌بینیم که از GtagDirective به این منظور استفاده شده است:

997696
1...
2<section fxLayout="column" fxLayoutAlign="center center" gtag="home">
3
4  <p><b>Google Site Tagging</b> (aka Google Analytics) Example</p>
5
6</section>
7...

گزاره "gtag="home در فایل html یک رویداد page-view به حساب شما در پلتفرم‌های گوگل آنالیتیکس، گوگل ادز یا گوگل مارکتینگ که در طی مقداردهی اولیه اپلیکیشن تنظیم کرده‌اید، ارسال می‌کند.

متن home در گزارش به صورت عنوان صفحه ظاهر می‌شود، در حالی که مکان صفحه به صورت خودکار توسط دایرکتیو ارائه شده از سوی اپلیکیشن که از router بهره می‌گیرد، تشخیص داده خواهد شد.

با افزودن این دایرکتیو به همه صفحه‌های اپلیکیشن، می‌توانیم اقدام به ردگیری نمایش صفحه‌ها بکنیم.

همین کار را می‌توان در مورد بخشی از نمایش‌ها در زمانی که به صورت شرطی نمایش می‌یابند نیز اعمال کرد:

1...
2<ng-container [ngSwitch]="mode">
3
4  <!-- Survey -->
5  <section *ngSwitchCase="'survey'" gtag="survey">
6    ...
7  </section>
8
9  <!-- Search -->
10  <section *ngSwitchCase="'search'" gtag="search">
11    ...
12  </section>
13
14  <!-- Subscribe -->
15  <section *ngSwitchCase="'subscribe'" gtag="subscribe">      
16    ...
17  </section>
18
19  <!-- Thank you -->
20  <section *ngSwitchCase="'thanks'" gtag="thanks">
21    ...
22  </section>  
23
24</ng-container>
25...

هر زمان که بخشی از شرایط تطبیق یابد، ngSwitch نمایش می‌یابد و رویداد page-view مربوطه اجرا می‌شود.

دایرکتیو Gtag

پیاده‌سازی این قابلیت کاملاً ساده به نظر می‌رسد:

1@Directive({
2  selector: '[gtag]'
3})
4export class GtagDirective implements OnChanges {
5
6  constructor(private gtag: GtagService, @Optional() private router: Router) {}
7
8  @Input('gtag') title: string;
9
10  @Input() path: string;
11
12  @Input() location: string;
13
14  ngOnChanges() {
15    this.gtag.pageView(this.title, this.path, this.location || this.router && this.router.url);
16  }
17}

این پیاده‌سازی بر GtagService تکیه دارد که در ادامه معرفی خواهیم کرد و عنوان، مسیر و اطلاعات موقعیت را برای ارسال رویداد از طریق سرویس گردآوری می‌کند. همچنین از Router در موارد امکان برای تشخیص خودکار موقعیت صفحه استفاده می‌کند، مگر این که قبلاً بر اساس ورودی‌اش ارائه شده باشد.

سرویس Gtag

GtagService همه کارکردهای عمده gtag.js را با چند متد که رویدادهای پیش‌فرض گوگل را پیاده‌سازی می‌کنند بسته‌بندی می‌کند و استفاده از آن کاملاً آسان است:

1...
2  constructor(private gtag: GtagService) {
3
4    gtag.login('Google');
5
6    gtag.search('Bologna')
7      .then( () => console.log('Search correctly tagged') )
8      .catch( e => console.error(e) );
9
10    gtag.addToCart([{
11      id: "P12345",
12      name: "Android Warhol T-Shirt",
13      list_name: "Search Results",
14      brand: "Google",
15      category: "Apparel/T-Shirts",
16      variant: "Black",
17      list_position: 1,
18      quantity: 2,
19      price: '2.0'
20    }]);
21  }
22...

در مثال فوق یک رویداد login، یک رویداد search و یک رویداد تجاری add_to_cart کامل را ارسال می‌کنیم. چنان که در فراخوانی ()search مشخص است، حتماً متوجه شده‌اید که این متدها یک Promise بازگشت می‌دهند، از این رو می‌توانید کارهای ناهمگام را درست پس از کامل شدن تگ گذاری انجام دهید.

پشت صحنه

در پشت صحنه GtagService اغلب کارها را انجام می‌دهد. شیء قابل فراخوانی gtag.js در سازنده‌اش تزریق می‌شود و برای اجرای دو فراخوانی set و event مورد استفاده قرار می‌گیرد:

1@Injectable()
2export class GtagService {
3
4  constructor(@Inject(GTAG) private gtag: Gtag) { }
5
6  /** @see: https://developers.google.com/analytics/devguides/collection/gtagjs/setting-values */
7  public set(params: CustomParams): void {
8    return this.gtag('set', params);
9  }
10
11  /** @see: https://developers.google.com/analytics/devguides/collection/gtagjs/events */
12  public event(action: string, params?: EventParams): Promise<void> {
13    // Wraps the event call into a Promise
14    return new Promise( (resolve, reject) => {
15      try { 
16        // Triggers a 3s time-out timer 
17        const tmr = setTimeout( () => reject(new Error('gtag call timed-out')), 3000 );
18        // Performs the event call resolving with the event callback
19        this.gtag('event', action, { ...params, event_callback: () => { clearTimeout(tmr); resolve(); }}); } 
20      // Rejects the promise on errors
21      catch(e) { reject(e); }
22    });
23  }
24
25  /** @see: https://developers.google.com/analytics/devguides/collection/gtagjs/pages */
26  public pageView(page_title?: string, page_path?: string, page_location?: string) { 
27    return this.event('page_view', { page_title, page_location, page_path }); 
28  }
29
30  /** @see: https://developers.google.com/analytics/devguides/collection/gtagjs/exceptions */
31  public exception(description?: string, fatal?: boolean) { 
32    return this.event('exception', { description, fatal }); 
33  }
34
35  /** @see: https://developers.google.com/analytics/devguides/collection/gtagjs/user-timings */
36  public timingComplete(name: string, value: number, event_category?: string, event_label?: string) { 
37    return this.event('timing_complete', { name, value, event_category, event_label }); 
38  }
39
40  public login(method?: string) {
41    return this.event('login', { method });
42  }
43
44  public signUp(method?: string) {
45    return this.event('sign_up', { method });
46  }
47
48  public search(search_term?: string) {
49    return this.event('search', { search_term });
50  }
51  ...
52}

برای کسب اطلاعات بیشتر می‌توانید به صفحه مستندات رسمی gtag.js (+) مراجعه کنید. اما اساساً دستور set برای تعیین مقادیر دائمی استفاده می‌شود که در همه رویدادهای بعدی ارسال خواهد شد و دستور event نیز در عمل برای ارسال رویداد گوگل آنالیتیکس استفاده می‌شود.

با این حال پیاده‌سازی متد ()event از مزیت مکانیسم event_callback در gtag.js برای بازگشت یک Promise بهره‌مند می‌شود. برای این که از resolve نشدن دائمی Promise جلوگیری کنیم تا از مطمئن شویم که کتابخانه gtag.js در نهایت مشکل عدم بارگذاری نمی‌یابد، از یک تابع timeout بر اساس پیشنهادهای گوگل (+) استفاده کرده‌ایم.

Gtag در انگولار

ماژول Gtag

مقداردهی این کتابخانه در پشت صحنه نیز انجام می‌یابد.

GtagModule یک تابع مقداردهی استاتیک عرضه کرده است که بر اساس بهترین رویه‌های انگولار ID گوگل آنالیتیکس هدف تعیین می‌شود:

1...
2@NgModule({
3  imports:      [   
4    BrowserModule, 
5    ...    
6    GtagModule.init({
7      targetId: '<<YOUR GOOGLE ID HERE>>'
8    })
9  ],
10  
11  declarations: [ 
12    AppComponent
13  ],
14  
15  bootstrap: [ AppComponent ]
16})
17export class AppModule { }

به طور معمول تابع ()init یک InjectionToken به همراه شیء پیکربندی عرضه می‌کند که از سوی سرویس نهایی دیگر مصرف می‌شود:

1...
2@NgModule({
3  providers: [ GtagService ],
4  declarations: [ GtagDirective ],
5  exports: [ GtagDirective ]
6})
7export class GtagModule {
8
9  static init(config: GtagConfig): ModuleWithProviders<GtagModule> {
10    return {
11      ngModule: GtagModule,
12      providers: [
13        { provide: GtagConfigToken, useValue: config },
14        { provide: GTAG,
15          useFactory: gtagFactory, 
16          deps: [ [ new Optional(), new Inject(GtagConfigToken) ] ] }
17      ]
18    };
19  } 
20}

به علاوه کد مقداردهی ما توکن GTAG را که قبلاً دیدیم از طریق یک تابع استاتیک ()gtagFactory در GtagService تزریق می‌کند:

1...
2export function gtagFactory(config: GtagConfig): Gtag {
3
4  if((window as any).gtag) { return (window as any).gtag; }
5
6  const script = document.createElement('script');
7
8  script.src = 'https://www.googletagmanager.com/gtag/js?id=' + config.targetId;
9  script.type = 'text/javascript';
10  script.async = true;
11 
12  document.head.appendChild(script);
13
14  (window as any).dataLayer = (window as any).dataLayer || [];
15  function gtag(...args){ (window as any).dataLayer.push(arguments);}
16
17  gtag('js', new Date());
18
19  gtag('config', config.targetId, { send_page_view: false, ...config.configInfo });
20
21  ('setParams' in config) && gtag('set', config.setParams );
22
23  ('moreIds' in config) && config.moreIds.forEach( id => gtag('config', id) );
24
25  return (window as any).gtag = gtag;
26}

کد فوق قطعه کدی دقیقاً مشابه را بازتولید می‌کند که بر اساس دستورالعمل‌های نصب gtag.js (+) می‌توانیم در فایل index.html خود با کمترین تغییرات کپی کنیم.

ابتدا factory بررسی می‌کند آیا شیء gtag موجود است یا نه و اگر چنین باشد آن را بازگشت می‌دهد. اگر چنین نباشد، یک عنصر اسکریپت ایجاد می‌شود و به هد سند الحاق می‌شود تا بارگذاری کتابخانه را تحریک کند. در اینجا شیء پیکربندی برای پیکربندی کتابخانه پیش از بازگشت وهله‌ای سراسری از gtag مورد استفاده قرار می‌گیرد.

به صورت پیش‌فرض پیاده‌سازی رویداد خودکار page-view را با تنظیم مشخصه send_page_view روی مقدار false غیرفعال می‌کند، بنابراین دایرکتیو ما تحت کنترل کامل است. به این ترتیب به پایان این راهنما می‌رسیم.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
wizdm-genesys
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *