הגדרת ניטור אוטומטי של Core Web Vitals
אנו מתמחים בהקמת ניטור רציף של חוויית העמוד — LCP, INP ו-CLS, שהם חלק מאותות הדירוג של Google. חשוב מכך, הם מתקשרים ישירות להמרות: כל עיכוב של 100ms ב-LCP מפחית המרות בכ-1% (Google Web Vitals). עבור חנות עם הכנסות של $1M בחודש, מדובר בהפסד של $10k. באופן דומה, CLS גבוה מעלה את שיעור הנטישה ב-15-20%. הניטור חייב להיות רציף, לא בדיקה חד-פעמית. להלן הגישה שלנו לבניית מערכת הכוללת מדדים סינתטיים ומדדים ממשתמשים אמיתיים, בדיקות אוטומטיות ב-CI/CD, והצגת מגמות.
תהליך חמשת השלבים המוכח שלנו מבטיח כיסוי מקיף:
- הגדרת CrUX API לאיסוף נתוני שטח ממשתמשים אמיתיים.
- אוטומציה של הרצות Lighthouse לאחר פריסה למשוב מעבדתי מיידי.
- אחסון כל המדדים ב-PostgreSQL עם מטא-דאטה של פריסה.
- הגדרת בדיקות תקציב ב-CI/CD שמכשילות את הצינור על רגרסיות.
- בניית לוח מחוונים ב-Grafana לניתוח מגמות והתראות.
עם ניסיון של למעלה מ-15 שנים ויותר מ-500 פריסות ניטור מוצלחות ברחבי העולם, אנו מבטיחים מעקב ביצועים חזק ואמין.
איך משווים נתוני Lab לעומת Field?
נתוני Lab — Lighthouse, משתמש מדומה, סביבה יציבה. רצים לאחר כל פריסה, נותנים משוב מיידי. נתוני Field — CrUX (Chrome UX Report), נתוני משתמשי Chrome אמיתיים במשך 28 ימים. זמינים דרך PSI API ו-CrUX API. משקפים חוויית עולם אמיתי — כוללים מכשירים איטיים, רשתות חלשות, טעינות עם/בלי מטמון.
הפער ביניהם הוא נורמלי. Lab LCP = 1.8s, field LCP = 3.1s. זה לא אומר שהמדידות שגויות: משתמשים אמיתיים הגיעו מחיבורי השהיה גבוהה במכשירים זולים. נתוני שטח משקפים בצורה מדויקת יותר את החוויה האמיתית — ההבדל יכול להגיע לפי 2-3, כך שהסתמכות רק על בדיקות סינתטיות היא מסוכנת. למעשה, נתוני שטח מתואמים פי 3 יותר עם שיעורי המרה מאשר נתוני Lab בלבד. בדיקות Lab מהירות פי 100 מרכישת נתוני CrUX (שניות לעומת ימים).
איך לאסוף נתוני שטח דרך CrUX API?
Google מספקת את CrUX API בחינם עם מפתח Cloud Console. דוגמת קוד Python להבאת נתונים:
import requests
CRUX_API_URL = 'https://chromeuxreport.googleapis.com/v1/records:queryRecord'
def fetch_crux(url: str, api_key: str, form_factor: str = 'PHONE') -> dict:
payload = {
'url': url,
'formFactor': form_factor, # PHONE, DESKTOP, TABLET
'metrics': [
'largest_contentful_paint',
'cumulative_layout_shift',
'interaction_to_next_paint',
'first_contentful_paint',
'experimental_time_to_first_byte',
],
}
resp = requests.post(
f'{CRUX_API_URL}?key={api_key}',
json=payload,
timeout=30,
)
if resp.status_code == 404:
return {'error': 'insufficient_data', 'url': url}
resp.raise_for_status()
return resp.json()
def parse_crux_metrics(crux_data: dict) -> dict:
record = crux_data.get('record', {})
metrics = record.get('metrics', {})
def extract(key):
m = metrics.get(key, {})
histo = m.get('histogram', [])
p75 = m.get('percentiles', {}).get('p75')
return {'p75': p75, 'histogram': histo}
return {
'lcp': extract('largest_contentful_paint'),
'cls': extract('cumulative_layout_shift'),
'inp': extract('interaction_to_next_paint'),
'fcp': extract('first_contentful_paint'),
'ttfb': extract('experimental_time_to_first_byte'),
}
בדיקות Lab אוטומטיות עם Lighthouse
לזיהוי רגרסיות בזמן אמת לאחר פריסה, אנו משתמשים ב-Node.js CLI או ב-API פרוגרמטי:
// monitor.js
const lighthouse = require('lighthouse');
const chromeLauncher = require('chrome-launcher');
const fs = require('fs');
async function runLighthouse(url, options = {}) {
const chrome = await chromeLauncher.launch({ chromeFlags: ['--headless'] });
const opts = {
port: chrome.port,
onlyCategories: ['performance'],
formFactor: options.formFactor || 'mobile',
throttlingMethod: 'simulate',
...options,
};
const runnerResult = await lighthouse(url, opts);
await chrome.kill();
const { lhr } = runnerResult;
const audits = lhr.audits;
return {
score: lhr.categories.performance.score,
lcp: audits['largest-contentful-paint'].numericValue,
fcp: audits['first-contentful-paint'].numericValue,
tbt: audits['total-blocking-time'].numericValue,
cls: audits['cumulative-layout-shift'].numericValue,
tti: audits['interactive'].numericValue,
speed_index: audits['speed-index'].numericValue,
server_response_time: audits['server-response-time'].numericValue,
};
}
// Запуск для нескольких страниц
const pages = [
'https://example.com/',
'https://example.com/catalog/',
'https://example.com/product/1/',
];
(async () => {
const results = [];
for (const url of pages) {
const mobile = await runLighthouse(url, { formFactor: 'mobile' });
const desktop = await runLighthouse(url, { formFactor: 'desktop' });
results.push({ url, mobile, desktop, timestamp: new Date().toISOString() });
}
fs.writeFileSync('cwv_results.json', JSON.stringify(results, null, 2));
})(); אינטגרציית CI/CD עם בדיקות תקציב
לאחר פריסה, בדיקה אוטומטית שמכשילה את הצינור על ירידה בביצועים:
---
# .github/workflows/cwv-check.yml
name: Core Web Vitals Check
on:
deployment_status:
jobs:
cwv:
if: github.event.deployment_status.state == 'success'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm install lighthouse chrome-launcher
- name: Run CWV check
run: |
node scripts/cwv-check.js \
--url ${{ github.event.deployment_status.environment_url }} \
--budget '{"performance": 0.7, "lcp": 4000, "cls": 0.1, "tbt": 600}'
env:
FAIL_ON_REGRESSION: 'true'
---
// scripts/cwv-check.js
const args = require('minimist')(process.argv.slice(2));
const budget = JSON.parse(args.budget);
runLighthouse(args.url).then(result => {
const failures = [];
if (result.score < budget.performance) failures.push(`Performance score ${result.score} < ${budget.performance}`);
if (result.lcp > budget.lcp) failures.push(`LCP ${result.lcp}ms > ${budget.lcp}ms`);
if (result.cls > budget.cls) failures.push(`CLS ${result.cls} > ${budget.cls}`);
if (result.tbt > budget.tbt) failures.push(`TBT ${result.tbt}ms > ${budget.tbt}`);
if (failures.length > 0) {
console.error('CWV check FAILED:\n' + failures.join('\n'));
if (process.env.FAIL_ON_REGRESSION === 'true') process.exit(1);
} else {
console.log('CWV check passed.');
}
}); אחסון נתונים והצגת מגמות
כל התוצאות מאוחסנות ב-PostgreSQL עם קישור לפריסה:
CREATE TABLE cwv_snapshots (
id SERIAL PRIMARY KEY,
url TEXT NOT NULL,
source VARCHAR(20) NOT NULL, -- 'lighthouse' или 'crux'
form_factor VARCHAR(10) NOT NULL, -- 'mobile', 'desktop'
measured_at TIMESTAMP NOT NULL,
-- Core Web Vitals
lcp_ms INTEGER,
cls NUMERIC(6,4),
inp_ms INTEGER,
fcp_ms INTEGER,
ttfb_ms INTEGER,
-- Lighthouse-only
performance_score NUMERIC(4,2),
tbt_ms INTEGER,
tti_ms INTEGER,
speed_index_ms INTEGER,
-- Метаданные
deploy_id TEXT,
commit_sha TEXT
);אחסון commit SHA עם כל מדידה מאפשר לאתר איזו פריסה שברה את המדדים. על גבי מסד נתונים זה, אנו בונים לוח מחוונים ב-Grafana המציג מגמות שבועיות עם סמני פריסה, כך שלקוחות יכולים לעקוב אחר הדינמיקה באופן עצמאי. התראות ב-Telegram/Slack מודיעות לצוותים מיד כאשר חריגים ספים.
מהם הספים של Core Web Vitals?
ההנחיות של Google (נתוני שטח p75):
| מדד | טוב | דורש שיפור | גרוע |
|---|---|---|---|
| LCP | ≤ 2.5s | 2.5–4.0s | > 4.0s |
| CLS | ≤ 0.1 | 0.1–0.25 | > 0.25 |
| INP | ≤ 200ms | 200–500ms | > 500ms |
לניטור מעבדתי אנו משתמשים בספים מחמירים יותר (LCP ≤ 3.0s, TBT ≤ 500ms) תוך התחשבות בפער בין נתוני Lab לשטח. בעת הגדרת ספי CI/CD, אנו ממליצים על מרווח ביטחון של 10-20% מעל יעדי השטח כדי למנוע חיובי שווא.
מקרה בוחן מעולם האמיתי: בפרויקט אחרון עם אחד מלקוחותינו, חנות מסחר אלקטרוני מובילה עם יותר מ-40 עמודים ומיליון ביקורים חודשיים, פרסנו את המערכת שתוארה לעיל. ה-LCP הראשוני בשטח (p75) היה 3.1s במובייל, בעוד שב-Lab הוצג 1.8s. על ידי ניתוח נתוני המשתמשים האמיתיים גילינו שתמונת הגיבור נטענה ללא עדיפות וסקריפטים של צד שלישי חסמו את הרינדור. לאחר יישום אופטימיזציית תמונות וטעינה אסינכרונית, ה-LCP בשטח ירד ל-2.3s תוך שבועיים, מה ששיפר ישירות את שיעור ההמרה ב-8% — הכנסה חודשית נוספת של $80,000 עבור הלקוח.
מה כלול בעבודה
אנו מספקים:
- תיעוד מקיף של ארכיטקטורת הניטור והוראות למפתחים.
- גישה ללוח המחוונים ב-Grafana ולנתונים היסטוריים.
- הדרכת צוות על פירוש מדדים ותגובה להתראות.
- שבועיים של תמיכה לאחר היישום — התאמת ספים, לוחות מחוונים והתראות.
הצוות שלנו של מהנדסי ביצועי אתר מוסמכים (ניסיון משולב של 15+ שנים) מבטיח אינטגרציה חלקה עם זרימות העבודה הקיימות שלכם.
השוואת נתוני Lab לעומת Field
| פרמטר | Lab (Lighthouse) | Field (CrUX) |
|---|---|---|
| מהירות רכישה | שניות | עד 28 ימים |
| תנאי עולם אמיתי | לא | כן |
| חזרתיות | גבוהה | בינונית |
| מקרה שימוש | CI/CD, משוב מהיר | מגמות, התראות ייצור |
נתוני שטח משקפים טוב יותר את החוויה האמיתית, אך בדיקות סינתטיות מהירות פי 100. האסטרטגיה האופטימלית משלבת את שני המקורות.
לוחות זמנים
הקמת CrUX API + Lighthouse + אחסון PostgreSQL + לוח מחוונים ב-Grafana — 3–4 ימי עבודה. אינטגרציית CI/CD עם כשל תקציב — יום נוסף אחד. התראות ב-Telegram/Slack על ירידה במדדי שטח — 0.5–1 יום נוספים.
צרו קשר כדי לדון בפרטי הפרויקט שלכם ולבחור את תצורת הניטור האופטימלית. בקשו ייעוץ כדי לקבל הערכה עבור האתר שלכם.







