פרק 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. לפני שמתחילים:
- נרשמים לחשבון Cloudflare.
- מתקינים את 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-workerpnpm 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/repohttps://github.com/user/repouser/repo/some-templateעבור תת-תיקיותuser/repo#canaryעבור ענפיםuser/repo#1234abcdעבור מזהה קומיט (commit hash)bitbucket:user/repoב-Bitbucketgitlab:user/repoב-GitLab
לפי התיעוד הרשמי, תיקיית התבנית הקיימת חייבת להכיל לפחות את הקבצים הבאים כדי לעמוד בדרישות של Cloudflare Workers:
package.jsonwrangler.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 אינו משתנה, יש לוודא:
- שמרתם את השינויים בקובץ
src/index.js. - הפקודה
wrangler devעדיין פועלת במסוף. - רעננתם את הדפדפן.
דוגמה מעשית יותר עם ניתוב פשוט:
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 | מסד נתונים יחסי מבוסס SQLite | await 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 | מסד וקטורי לחיפוש סמנטי וליישומי AI | await 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 מובנה.