מדריך קלאודפלייר בעברית

פרק 10

Cloudflare Workers ופיתוח Serverless

פלטפורמת Cloudflare Workers מריצה קוד Serverless על רשת הקצה של Cloudflare. במקום מכונות וירטואליות או קונטיינרים כבדים עם Cold Start ארוך, הוורקרים רצים בתוך V8 Isolates: סביבות מבודדות על אותו תהליך, עם זמן אתחול של פחות ממילישנייה.

ארכיטקטורת V8 Isolates ב-Workers:
[משתמש מקומי] ──(בקשת HTTP)──> [שרת קצה קרוב]
                                      │
                                      ├── Worker Handler (0ms Cold Start)
                                      │       ├── קריאת נתונים מ-KV, D1, R2
                                      │       └── החזרת תשובה מהירה
                                      └── אין צורך בניהול שרתים או קונטיינרים

#תחילת עבודה עם Wrangler

הפיתוח והפריסה נעשים עם Wrangler, כלי שורת הפקודה (CLI) של פלטפורמת המפתחים של Cloudflare. לפני שמתחילים:

  1. נרשמים לחשבון Cloudflare.
  2. מתקינים את Node.js.

מלכודת: עדיף להשתמש במנהל גרסאות של Node.js כמו Volta או nvm, כדי להימנע מבעיות הרשאות ולהחליף גרסאות של Node.js בקלות. לפי התיעוד הרשמי (עודכן ב-25 באוגוסט 2026), Wrangler דורש גרסת Node.js של 16.17.0 ומעלה.

#1. יצירת פרויקט חדש

פותחים חלון מסוף ומריצים את אשף ההתקנה C3 (create-cloudflare-cli), כלי שורת פקודה המיועד לסייע בהגדרה ובפריסה של יישומים חדשים ב-Cloudflare:

npm create cloudflare@latest -- my-first-worker

אפשר להשתמש גם ב-yarn או ב-pnpm:

yarn create cloudflare my-first-worker
pnpm create cloudflare@latest my-first-worker

במהלך ההגדרה באשף, בוחרים באפשרויות הבאות:

  • בשאלה What would you like to start with? בוחרים: Hello World example.
  • בשאלה Which template would you like to use? בוחרים: Worker only.
  • בשאלה Which language do you want to use? בוחרים: JavaScript.
  • בשאלה Do you want to use git for version control? בוחרים: Yes.
  • בשאלה Do you want to deploy your application? בוחרים: No, מכיוון שמבצעים שינויים בקוד לפני הפריסה.

לאחר סיום ההגדרה, נכנסים לתיקיית הפרויקט:

cd my-first-worker

אשף C3 יוצר בתוך תיקיית הפרויקט את הקבצים הבאים:

קובץתפקיד
wrangler.jsoncקובץ ההגדרות של Wrangler
src/index.jsקוד Worker מינימלי מסוג Hello World! הכתוב בתחביר ES Modules
package.jsonקובץ הגדרת תלויות מינימלי של Node.js
package-lock.jsonקובץ נעילת תלויות של npm
node_modulesתיקיית חבילות התלויות של npm

מלכודת: בפרויקט npm חשוב לכלול את הסימון -- לפני שם התיקייה, כדי ששם הפרויקט לא יתפרש כדגל של npm.

אם כבר קיים פרויקט במאגר Git, אשף C3 תומך ביצירת פרויקט חדש מתוך מאגר קיים:

npm create cloudflare@latest -- --template <SOURCE>

הערך של <SOURCE> יכול להיות אחד מהבאים:

  • user/repo ב-GitHub
  • [email protected]:user/repo
  • https://github.com/user/repo
  • user/repo/some-template עבור תת-תיקיות
  • user/repo#canary עבור ענפים
  • user/repo#1234abcd עבור מזהה קומיט (commit hash)
  • bitbucket:user/repo ב-Bitbucket
  • gitlab:user/repo ב-GitLab

לפי התיעוד הרשמי, תיקיית התבנית הקיימת חייבת להכיל לפחות את הקבצים הבאים כדי לעמוד בדרישות של Cloudflare Workers:

  • package.json
  • wrangler.jsonc
  • תיקיית src/ שמכילה סקריפט Worker המוגדר בקובץ wrangler.jsonc

#2. הרצה מקומית

אשף C3 מתקין את Wrangler, ממשק שורת הפקודה של Cloudflare Workers, כברירת מחדל בתוך פרויקטי Workers. הכלי Wrangler מאפשר ליצור (init), לבדוק (dev) ולפרוס (deploy) פרויקטים של Workers.

לאחר יצירת ה-Worker הראשון, מריצים את הפקודה wrangler dev מתוך תיקיית הפרויקט כדי להפעיל שרת מקומי לפיתוח, המאפשר לצפות בתצוגה מקדימה של ה-Worker באופן מקומי במהלך הפיתוח:

npx wrangler dev

אם זו הפעם הראשונה שמשתמשים ב-Wrangler, הכלי יפתח את דפדפן האינטרנט כדי להתחבר לחשבון Cloudflare.

פותחים את הכתובת http://localhost:8787 כדי לצפות ב-Worker.

מלכודת: אם יש בעיות בשלב זה או שאין גישה לממשק דפדפן, יש לעיין בתיעוד של הפקודה wrangler login.

#3. כתיבת הקוד

כאשר הפרויקט נוצר ופועל, אפשר להתחיל לכתוב ולערוך את הקוד.

בקובץ src/index.js מופיע הקוד ההתחלתי הבא:

export default {
	async fetch(request, env, ctx) {
		return new Response("Hello World!");
	},
};

הסבר על מבנה הקוד לפי התיעוד:

  • הביטוי export default הוא תחביר JavaScript הנדרש להגדרת מודולים (JavaScript modules). ה-Worker חייב לכלול ייצוא ברירת מחדל של אובייקט, כאשר המאפיינים שלו תואמים לאירועים שה-Worker מטפל בהם.
  • המטפל (handler) בשם fetch נקרא כאשר ה-Worker מקבל בקשת HTTP. ניתן להגדיר באובייקט המיוצא מטפלי אירועים נוספים כדי להגיב לסוגי אירועים שונים, למשל מטפל מסוג scheduled כדי להגיב להפעלת Worker באמצעות Cron Trigger.
  • למטפל fetch מועברים תמיד שלושה פרמטרים: request, env ו-ctx (או context).
  • סביבת הריצה של Cloudflare Workers מצפה ממטפלי fetch להחזיר אובייקט מסוג Response, או אובייקט Promise שמחזיר Response. בדוגמה זו מוחזר Response חדש עם המחרוזת "Hello World!".

כעת מחליפים את התוכן בקובץ src/index.js בקוד הבא, שמשנה את טקסט הפלט:

export default {
	async fetch(request, env, ctx) {
		return new Response("Hello Worker!");
	},
};

שומרים את הקובץ ומרעננים את הדף בדפדפן. פלט ה-Worker ישתנה לטקסט החדש.

מלכודת: אם הפלט של ה-Worker אינו משתנה, יש לוודא:

  1. שמרתם את השינויים בקובץ src/index.js.
  2. הפקודה wrangler dev עדיין פועלת במסוף.
  3. רעננתם את הדפדפן.

דוגמה מעשית יותר עם ניתוב פשוט:

export default {
  async fetch(request, env, ctx) {
    const url = new URL(request.url);

    if (url.pathname === "/api/health") {
      return Response.json({ status: "healthy", timestamp: Date.now() });
    }

    if (url.pathname === "/api/greet") {
      const name = url.searchParams.get("name") || "Guest";
      return new Response(`שלום ${name}! הבקשה עובדה בשרת קצה של קלאודפלייר.`);
    }

    return new Response("Not Found", { status: 404 });
  },
};

#4. פריסה לרשת

פורסים את ה-Worker לרשת של Cloudflare באמצעות Wrangler:

npx wrangler deploy

הפריסה יכולה להתבצע לתת-דומיין מסוג *.workers.dev או לדומיין מותאם אישית (Custom Domain). אם עדיין לא הוגדר תת-דומיין או דומיין, Wrangler יציג שאלה במהלך תהליך הפרסום כדי להגדיר אחד.

לאחר מכן צופים ב-Worker בכתובת:

<YOUR_WORKER>.<YOUR_SUBDOMAIN>.workers.dev

מלכודת: אם מופיעות שגיאות 523 בעת פריסה ראשונה לתת-דומיין *.workers.dev, יש להמתין כדקה. לפי התיעוד הרשמי, השגיאות אמורות להסתדר מעצמן.

לאחר שיש מאגר ב-GitHub או ב-GitLab, אפשר לחבר Builds כדי להפעיל תהליכי בנייה ופריסה אוטומטיים.

#מערכת הקישורים (Bindings)

יתרון מרכזי ב-Cloudflare Workers הוא מנגנון ה-Bindings. במקום חיבורי TCP ידניים, Connection Pools או סיסמאות בקוד, Cloudflare מזריקה שירותים ישירות לאובייקט env:

שירותייעודאופן שימוש בקוד
Workers KVאחסון Key-Value מהיר ומבוזר לקריאות תכופותawait env.MY_KV.get("key")
D1מסד נתונים יחסי מבוסס SQLiteawait env.DB.prepare("SELECT * FROM users WHERE id = ?").bind(userId).all()
R2אחסון אובייקטים תואם S3 בלי דמי יציאהawait env.MY_BUCKET.put("report.pdf", stream)
Durable Objectsרכיבי מצב עקביים לתיאום בזמן אמתenv.CHAT_ROOM.get(id).fetch(request)
Queuesתור הודעות לעיבוד רקע אסינכרוניawait env.MY_QUEUE.send({ task: "send_email" })
Hyperdriveהאצה וניהול חיבורים למסדים חיצוניים (Postgres/MySQL)שימוש במחרוזת חיבור מואצת דרך הרשת הגלובלית
Vectorizeמסד וקטורי לחיפוש סמנטי וליישומי AIawait env.VECTOR_INDEX.query(vector, { topK: 5 })
Workers AIהרצת מודלים ישירות בקצהawait env.AI.run("@cf/meta/llama-3-8b-instruct", { prompt: "..." })

#משימות מתוזמנות (Cron Triggers)

אפשר להוסיף לאובייקט ה-export גם מטפל מסוג scheduled, כדי להגיב להפעלה לפי Cron Trigger. את לוח הזמנים מגדירים בקובץ ההגדרות wrangler.jsonc או wrangler.toml:

[triggers]
crons = ["*/15 * * * *"]
# הרצה בכל 15 דקות
export default {
  async scheduled(event, env, ctx) {
    ctx.waitUntil(performDatabaseMaintenance(env));
  },
};

#מתי להשתמש ב-Workers

  • API מהיר ומיקרו-שירותים: אימות, ניתוב, עיבוד Webhooks.
  • שכבת תיווך: שינוי כותרות, בדיקות A/B, הזרקת אבטחה לפני שרת המקור.
  • אפליקציה Serverless מלאה: שילוב עם D1 ו-R2 בלי שרת מרכזי.

בפרק הבא נלמד על Cloudflare Pages: פריסת אתרים ואפליקציות Full-stack עם חיבור Git מובנה.