Devahoy Logo
PublishedAt

Astro

วิธีการติดตั้ง Umami ใน Astro

วิธีการติดตั้ง Umami ใน Astro

วิธีการติดตั้ง Umami ลงบนเว็บไซต์ที่เขียนด้วย Astro จริงๆ การติดตั้งก็ง่ายมาก คือแค่เพิ่ม tracking code ลงไปในเว็บไซต์ แต่ในตัว Astro จะมีปัญหานิดหน่อย ถ้าเราใช้ View Transition หรือปัญหาฝั่ง client ก็คือกรณีที่ Browser บล็อคการเข้าถึง script หรือโดน adblock บล็อคนั่นเอง

การติดตั้ง Umami

วิธีการติดตั้งก็เข้าไปหน้า Settings ของ Umami Cloud แล้วนำ Tracking Code มาแปะไว้ที่หน้าเว็บของเรา เช่นใน <head>..</head>

1
<script defer src="https://cloud.umami.is/script.js" data-website-id="<ID>" ></script>

ปัญหา adblock บล็อค

หากเรามี Adblocker หรือ browser มีการกำหนด privacy บางครั้งตัว browser จะทำการ block umami script ทำให้เราไม่สามารถ tracking ได้

วิธีการแก้ไขก็คือ มีได้หลายแบบ เช่น

host script เอง

ทำการ host ตัว script เอง ที่เว็บไซต์ของเรา คือ ปกติ เราจะ src ไปที่ https://cloud.umami.is/script.js เราก็แค่สร้างไฟล์ .js ของเราเอง สมมติ ผมตั้งชื่อว่า my-script.js

1
<script defer src="/my-script.js" data-website-id="<ID>"></script>

ขอเสียของวิธีนี้คือ ถ้าหากตัว umami มีการอัพเดท code เราก็ต้องทำการอัพเดทตามทุกครั้ง

proxy ด้วย Cloudflare worker

วิธีนี้คือการำ proxying ด้วยการใช้ Cloudlfare worker โดยผมทำการ custom script จากตัว Plausible ซึ่ง doc ก็อ่านเพิ่มเติมได้จาก link ด้านล่างนี้ครับ

Proxying Plausible through Cloudflare | Plausible docs
You can use Cloudflare Workers to proxy your Plausible Analytics requests. Cloudflare Workers offers free service for up to 100,000 requests per day.plausible.io

ตัวอย่าง Cloudlare worker (เข้าจากหน้า cloudflare dashboard -> Workder & Pages)

1
const ScriptName = '/script.js';
2
const Endpoint = '/api/send';
3
4
const ScriptWithoutExtension = ScriptName.replace('.js', '')
5
6
addEventListener('fetch', event => {
7
event.passThroughOnException();
8
// stop send request to umami and just return 200 ok
9
event.respondWith(handleRequest(event));
10
11
return new Response(null, { status: 404 });
12
})
13
14
async function handleRequest(event) {
15
const pathname = new URL(event.request.url).pathname
16
const [baseUri, ...extensions] = pathname.split('.')
17
18
if (baseUri.endsWith(ScriptWithoutExtension)) {
19
return getScript(event, extensions)
20
} else if (pathname.endsWith(Endpoint)) {
21
return postData(event)
22
}
23
return new Response(null, { status: 404 })
24
}
25
26
async function getScript(event, extensions) {
27
let response = await caches.default.match(event.request);
28
if (!response) {
29
response = await fetch("https://cloud.umami.is/script.js");
30
event.waitUntil(caches.default.put(event.request, response.clone()));
31
}
32
return response;
33
}
34
35
async function postData(event) {
36
const request = new Request(event.request);
37
request.headers.delete('cookie');
38
return await fetch("https://api-gateway.umami.dev/api/send", request);
39
}
Cloudflare Workers · Cloudflare Workers docs
Cloudflare Workers provides a serverless ↗ execution environment that allows you to create new applications or augment existing ones without configuring or maintaining infrastructure.developers.cloudflare.com

ปัญหา Astro

ปัญหา เนื่องจากเว็บนี้ที่เขียนด้วย Astro ได้ใช้ View Transition ทำให้มันเกิด side-effect นิดหน่อย คือตัว tracking จะมองเห็นว่า user เปิดหน้าแรก (initial page) เท่านั้น แม้ว่าจะกดไปหน้าอื่นๆ ก็ตาม

วิธีแก้ไข คือใช้ data-astro-rerum มาช่วย ค่านี้ จะ trigger ก็ต่อเมื่อมีการ reload page จริงๆ หลังจาก transition ซึ่งจะทำให้ analytics มัน tracking ตรงละ

1
<script
2
defer
3
is:inline
4
data-astro-rerun
5
src="https://cloud.umami.is/script.js"
6
data-website-id="<ID>">
7
</script>

🎉 เพียงเท่านี้ ก็สามารถ tracking ได้แล้ว

Authors
avatar

Chai Phonbopit

เป็น Web Dev ในบริษัทแห่งหนึ่ง ทำงานมา 10 ปีกว่าๆ ด้วยภาษาและเทคโนโลยี เช่น JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจในเรื่องของ Blockchain และ Crypto กำลังหัดเรียนภาษา Rust

Related Posts