SvelteKit הוא האחרון של מה שהייתי מכנה מסגרות יישומים מהדור הבא. זה, כמובן, פיגום עבורך אפליקציה, עם הניתוב, הפריסה והעיבוד המבוסס על קבצים ש-Next עשתה לנצח. אבל SvelteKit תומך גם בפריסות מקוננות, מוטציות בשרת שמסנכרנות את הנתונים בדף שלך ועוד כמה דברים נחמדים שניכנס אליהם.
פוסט זה נועד להוות הקדמה ברמה גבוהה, בתקווה לבנות קצת התרגשות לכל מי שמעולם לא השתמש ב-SvelteKit. זה יהיה סיור רגוע. אם אתה אוהב את מה שאתה רואה, ה המסמכים המלאים נמצאים כאן.
במובנים מסוימים זהו פוסט מאתגר לכתיבה. SvelteKit הוא מסגרת יישום. זה קיים כדי לעזור לך לבנות... ובכן, יישומים. זה מקשה על הדגמה. זה לא אפשרי לבנות אפליקציה שלמה בפוסט בבלוג. אז במקום זאת, נשתמש קצת בדמיון שלנו. נבנה את השלד של אפליקציה, יהיו לנו כמה מצייני מיקום ריקים של ממשק משתמש ונתונים סטטיים בקוד קשיח. המטרה היא לא לבנות אפליקציה ממשית, אלא להראות לך איך החלקים הנעים של SvelteKit עובדים כדי שתוכל לבנות אפליקציה משלך.
לשם כך, נבנה כדוגמה את אפליקציית To-Do המנוסה והאמיתית. אבל אל דאגה, זה יהיה הרבה, הרבה יותר על לראות איך SvelteKit עובד מאשר ליצור עוד אפליקציית מטלות.
הקוד לכל דבר בפוסט הזה הוא זמין ב-GitHub. גם הפרויקט הזה נפרס על Vercel להדגמה חיה.
יצירת הפרויקט שלך
יצירת פרויקט SvelteKit חדש הוא פשוט מספיק. לָרוּץ npm create [email protected] your-app-name
בטרמינל וענו על הנחיות השאלה. הקפד לבחור "פרויקט שלד" אבל אחרת בחר את כל הבחירות שתרצה עבור TypeScript, ESLint וכו'.
לאחר יצירת הפרויקט, הפעל npm i
ו npm run dev
ושרת מפתחים אמור להתחיל לפעול. להתלקח localhost:5173
בדפדפן ותקבל את דף מציין המיקום של אפליקציית השלד.
ניתוב בסיסי
שים לב routes
תחת תיקייה src
. זה מכיל קוד עבור כל המסלולים שלנו. יש כבר א +page.svelte
קובץ שם עם תוכן עבור השורש /
מַסלוּל. לא משנה היכן בהיררכיית הקבצים אתה נמצא, לדף האמיתי של הנתיב הזה תמיד יש את השם +page.svelte
. עם זאת בחשבון, בואו ניצור דפים עבור /list
, /details
, /admin/user-settings
ו admin/paid-status
, וגם הוסף כמה מצייני מיקום של טקסט עבור כל עמוד.
פריסת הקובץ שלך צריכה להיראות בערך כך:
אתה אמור להיות מסוגל לנווט על ידי שינוי נתיבי כתובת האתר בשורת הכתובת של הדפדפן.
פריסות
אנחנו נרצה קישורי ניווט באפליקציה שלנו, אבל אנחנו בהחלט לא רוצים להעתיק את הסימון עבורם בכל עמוד שאנחנו יוצרים. אז בואו ניצור א +layout.svelte
קובץ בשורש שלנו routes
תיקייה, ש-SvelteKit יתייחס אליה כתבנית גלובלית עבור כל הדפים. בואו נוסיף לו קצת תוכן:
<nav> <ul> <li> <a href="/iw/">Home</a> </li> <li> <a href="/iw/list">To-Do list</a> </li> <li> <a href="/iw/admin/paid-status">Account status</a> </li> <li> <a href="/iw/admin/user-settings">User settings</a> </li> </ul>
</nav> <slot /> <style> nav { background-color: beige; } nav ul { display: flex; } li { list-style: none; margin: 15px; } a { text-decoration: none; color: black; }
</style>
קצת ניווט ראשוני עם כמה סגנונות בסיסיים. חשיבות מיוחדת היא ה <slot />
תָג. זה לֹא החריץ שבו אתה משתמש עם רכיבי אינטרנט ו-Shadow DOM, אלא תכונה Svelte המציינת היכן לשים את התוכן שלנו. כאשר דף מוצג, תוכן הדף יחליק למקום שבו נמצא החריץ.
ועכשיו יש לנו קצת ניווט! לא נזכה בתחרויות עיצוב, אבל אנחנו לא מנסים.
פריסות מקוננות
מה אם היינו רוצים שכל דפי הניהול שלנו ירשו את הפריסה הרגילה שזה עתה בנינו, אבל גם ישתפו כמה דברים משותפים לכל דפי הניהול (אבל רק דפי הניהול)? אין בעיה, אנחנו מוסיפים עוד +layout.svelte
קובץ בשורש שלנו admin
ספרייה, שתעבור בירושה על ידי כל מה שמתחתיה. בוא נעשה את זה ונוסיף את התוכן הזה:
<div>This is an admin page</div> <slot /> <style> div { padding: 15px; margin: 10px 0; background-color: red; color: white; }
</style>
אנו מוסיפים באנר אדום המציין שזהו דף ניהול ואז, כמו קודם, א <slot />
מציין לאן אנו רוצים שתוכן הדף שלנו יגיע.
פריסת השורש שלנו מלפני מעבדת. בתוך פריסת השורש יש א <slot />
תָג. התוכן של הפריסה המקוננת נכנס לפריסת השורש <slot />
. ולבסוף, הפריסה המקוננת מגדירה את שלה <slot />
, שלתוכו תוכן הדף מעובד.
אם אתה מנווט לדפי הניהול, אתה אמור לראות את הבאנר האדום החדש:
הגדרת הנתונים שלנו
אוקיי, בוא נצרף כמה נתונים ממשיים - או לפחות, נראה איך אנחנו יכולים להציג כמה נתונים ממשיים. יש מאה דרכים ליצור ולהתחבר למסד נתונים. עם זאת, הפוסט הזה עוסק ב-SvelteKit, לא בניהול DynamoDB, אז "נטען" כמה נתונים סטטיים במקום זאת. אבל, אנחנו נשתמש בכל אותם מכונות כדי לקרוא ולעדכן אותו שבו היית משתמש עבור נתונים אמיתיים. עבור אפליקציית אינטרנט אמיתית, החלף את הפונקציות שמחזירות נתונים סטטיים עם פונקציות שמתחברות ומבצעות שאילתות לכל מסד נתונים שבו אתה משתמש.
בואו ניצור מודול פשוט לכלוך ב lib/data/todoData.ts
שמחזיר כמה נתונים סטטיים יחד עם עיכובים מלאכותיים כדי לדמות שאילתות אמיתיות. אתה תראה את זה lib
תיקיה מיובאת למקום אחר באמצעות $lib
. זוהי תכונת SvelteKit עבור התיקיה המסוימת, ואתה יכול אפילו הוסף כינויים משלך.
let todos = [ { id: 1, title: "Write SvelteKit intro blog post", assigned: "Adam", tags: [1] }, { id: 2, title: "Write SvelteKit advanced data loading blog post", assigned: "Adam", tags: [1] }, { id: 3, title: "Prepare RenderATL talk", assigned: "Adam", tags: [2] }, { id: 4, title: "Fix all SvelteKit bugs", assigned: "Rich", tags: [3] }, { id: 5, title: "Edit Adam's blog posts", assigned: "Geoff", tags: [4] },
]; let tags = [ { id: 1, name: "SvelteKit Content", color: "ded" }, { id: 2, name: "Conferences", color: "purple" }, { id: 3, name: "SvelteKit Development", color: "pink" }, { id: 4, name: "CSS-Tricks Admin", color: "blue" },
]; export const wait = async amount => new Promise(res => setTimeout(res, amount ?? 100)); export async function getTodos() { await wait(); return todos;
} export async function getTags() { await wait(); return tags.reduce((lookup, tag) => { lookup[tag.id] = tag; return lookup; }, {});
} export async function getTodo(id) { return todos.find(t => t.id == id);
}
פונקציה להחזרת מערך שטוח של פריטי המטלות שלנו, חיפוש של התגים שלנו ופונקציה לאחזר מטלה בודדת (נשתמש באחרון הזה בדף הפרטים שלנו).
טוען את הנתונים שלנו
איך נכניס את הנתונים האלה לדפי Svelte שלנו? ישנן מספר דרכים, אבל לעת עתה, בואו ניצור א +page.server.js
קובץ אצלנו list
תיקייה, והכנס לתוכה את התוכן הזה:
import { getTodos, getTags } from "$lib/data/todoData"; export function load() { const todos = getTodos(); const tags = getTags(); return { todos, tags, };
}
הגדרנו א load()
פונקציה שמושכת את הנתונים הדרושים לדף. שימו לב שאנחנו כן לֹא await
שיחות אל שלנו getTodos
ו getTags
פונקציות אסינכרון. פעולה זו תיצור מפל טעינת נתונים בזמן שאנו ממתינים לפריטי המטלות שלנו שייכנסו לפני טעינת התגים שלנו. במקום זאת, אנו מחזירים את ההבטחות הגולמיות מ load
, ו-SvelteKit עושה את העבודה הדרושה כדי await
אותם.
אז איך אנחנו ניגשים לנתונים האלה מרכיב הדף שלנו? SvelteKit מספקת א data
אביזר עבור הרכיב שלנו עם נתונים עליו. אנו ניגשים לפריטי המטלות והתגים שלנו ממנו באמצעות א משימה ריאקטיבית.
רכיב דף הרשימה שלנו נראה כעת כך.
<script> export let data; $: ({ todo, tags } = data);
</script> <table cellspacing="10" cellpadding="10"> <thead> <tr> <th>Task</th> <th>Tags</th> <th>Assigned</th> </tr> </thead> <tbody> {#each todos as t} <tr> <td>{t.title}</td> <td>{t.tags.map((id) => tags[id].name).join(', ')}</td> <td>{t.assigned}</td> </tr> {/each} </tbody>
</table> <style> th { text-align: left; }
</style>
וזה אמור להפוך את פריטי המטלות שלנו!
קבוצות פריסה
לפני שנעבור לדף הפרטים ונשנה נתונים, בואו נציץ בתכונה ממש מסודרת של SvelteKit: קבוצות פריסה. כבר ראינו פריסות מקוננות עבור כל דפי הניהול, אבל מה אם נרצה לשתף פריסה בין דפים שרירותיים באותה רמה של מערכת הקבצים שלנו? בפרט, מה אם נרצה לשתף פריסה רק בין דף הרשימה שלנו לבין דף הפרטים שלנו? כבר יש לנו פריסה גלובלית ברמה הזו. במקום זאת, נוכל ליצור ספרייה חדשה, אך עם שם בסוגריים, כך:
כעת יש לנו קבוצת פריסה המכסה את דפי הרשימה והפרטים שלנו. קראתי לזה (todo-management)
אבל אתה יכול לקרוא לזה כל מה שאתה אוהב. שיהיה ברור, השם הזה יהיה לֹא להשפיע על כתובות האתרים של הדפים בתוך קבוצת הפריסה. כתובות האתרים יישארו זהות; קבוצות פריסה מאפשרות לך להוסיף פריסות משותפות לדפים מבלי שכולן יכללו את כל הספרייה routes
.
We יכול הוסף +layout.svelte
קובץ וכמה טיפשי <div>
באנר האומר, "היי, אנחנו מנהלים מטלות". אבל בואו נעשה משהו יותר מעניין. פריסות יכולות להגדיר load()
פונקציות על מנת לספק נתונים עבור כל המסלולים שמתחתיהם. בואו נשתמש בפונקציונליות הזו כדי לטעון את התגים שלנו - מכיוון שנשתמש בתגים שלנו בתגים שלנו details
עמוד - בנוסף ל list
עמוד שכבר יש לנו.
במציאות, כמעט בוודאות לא כדאי לאלץ קבוצת פריסה רק לספק פיסת נתונים בודדת; עדיף לשכפל את הנתונים האלה ב- load()
פונקציה עבור כל עמוד. אבל עבור הפוסט הזה, זה יספק את התירוץ שאנחנו צריכים כדי לראות תכונה חדשה של SvelteKit!
ראשית, בוא ניכנס לנושא שלנו list
של העמוד +page.server.js
הקובץ והסר ממנו את התגים.
import { getTodos, getTags } from "$lib/data/todoData"; export function load() { const todos = getTodos(); return { todos, };
}
דף הרשימה שלנו אמור כעת לייצר שגיאה מכיוון שאין tags
לְהִתְנַגֵד. בואו נתקן את זה על ידי הוספת א +layout.server.js
קובץ בקבוצת הפריסה שלנו, ואז הגדר את א load()
פונקציה שטוענת את התגים שלנו.
import { getTags } from "$lib/data/todoData"; export function load() { const tags = getTags(); return { tags, };
}
ובדיוק ככה, דף הרשימה שלנו מעובד שוב!
אנו טוענים נתונים ממספר מיקומים
בואו נשים נקודה טובה על מה שקורה כאן:
- הגדרנו א
load()
פונקציה עבור קבוצת הפריסה שלנו, אותה הכנסנו+layout.server.js
. - זה מספק נתונים עבור את כל מהעמודים שהפריסה משרתת - מה שבמקרה זה אומר דפי הרשימה והפרטים שלנו.
- דף הרשימה שלנו מגדיר גם את א
load()
פונקציה שנכנסת אליה+page.server.js
קובץ. - SvelteKit עושה את עבודת הרטינה של לקחת את התוצאות של מקורות הנתונים הללו, למזג אותם יחד ולהפוך את שניהם לזמינים ב
data
.
דף הפרטים שלנו
נשתמש בדף הפרטים שלנו כדי לערוך פריט מטלה. ראשית, בואו נוסיף עמודה לטבלה בדף הרשימה שלנו המקשרת לדף הפרטים עם מזהה פריט המטלה במחרוזת השאילתה.
<td><a href="/iw/details?id={t.id}">Edit</a></td>
עכשיו בואו לבנות את דף הפרטים שלנו. ראשית, נוסיף מטעין כדי לתפוס את פריט המטלות שאנו עורכים. ליצור +page.server.js
in /details
, עם התוכן הזה:
import { getTodo, updateTodo, wait } from "$lib/data/todoData"; export function load({ url }) { const id = url.searchParams.get("id"); console.log(id); const todo = getTodo(id); return { todo, };
}
המעמיס שלנו מגיע עם א url
מאפיין שממנו נוכל למשוך ערכי מחרוזת שאילתה. זה מקל על החיפוש אחר פריט המטלות שאנו עורכים. הבה נעבד את המטלה הזו, יחד עם פונקציונליות לעריכה.
ל-SvelteKit יכולות מובנות נפלאות של מוטציה, כל עוד אתה משתמש בטפסים. זוכרים טפסים? הנה דף הפרטים שלנו. הוצאתי את הסגנונות לקיצור.
<script> import { enhance } from "$app/forms"; export let data; $: ({ todo, tags } = data); $: currentTags = todo.tags.map(id => tags[id]);
</script> <form use:enhance method="post" action="?/editTodo"> <input name="id" type="hidden" value="{todo.id}" /> <input name="title" value="{todo.title}" /> <div> {#each currentTags as tag} <span style="{`color:" ${tag.color};`}>{tag.name}</span> {/each} </div> <button>Save</button>
</form>
אנחנו תופסים את התגים כמו קודם מהמטען של קבוצת הפריסה שלנו ואת פריט המטלות ממטען הדף שלנו. אנחנו תופסים את המציאות tag
אובייקטים מרשימת מזהי התגים של המטלות ולאחר מכן עיבוד הכל. אנו יוצרים טופס עם קלט נסתר עבור המזהה וקלט אמיתי עבור הכותרת. אנו מציגים את התגים ולאחר מכן מספקים כפתור לשליחת הטופס.
אם שמתם לב ל use:enhance
, זה פשוט אומר ל-SvelteKit להשתמש בשיפור מתקדם ולאיאקס לשלוח את הטופס שלנו. סביר להניח שתמיד תשתמש בזה.
איך אנחנו שומרים את העריכות שלנו?
שים לב action="?/editTodo"
תכונה על הטופס עצמו? זה אומר לנו היכן אנחנו רוצים לשלוח את הנתונים הערוכים שלנו. לענייננו, אנו רוצים להגיש א editTodo
"פעולה."
בואו ניצור את זה על ידי הוספת הדברים הבאים ל- +page.server.js
קובץ כבר יש לנו לפרטים (שיש לו כרגע א load()
פונקציה, כדי לתפוס את המטלה שלנו):
import { redirect } from "@sveltejs/kit"; // ... export const actions = { async editTodo({ request }) { const formData = await request.formData(); const id = formData.get("id"); const newTitle = formData.get("title"); await wait(250); updateTodo(id, newTitle); throw redirect(303, "/list"); },
};
פעולות טופס נותנות לנו א request
אובייקט, המספק גישה אל שלנו formData
, אשר יש get
שיטה לשדות הטפסים השונים שלנו. הוספנו את הקלט הנסתר הזה עבור ערך המזהה כדי שנוכל לתפוס אותו כאן כדי לחפש את פריט המטלות שאנו עורכים. אנו מדמים עיכוב, מתקשרים לחדש updateTodo()
השיטה, ולאחר מכן הפנה את המשתמש בחזרה אל /list
דף. updateTodo()
השיטה רק מעדכנת את הנתונים הסטטיים שלנו; בחיים האמיתיים תפעיל איזשהו עדכון בכל חנות נתונים שבה אתה משתמש.
export async function updateTodo(id, newTitle) { const todo = todos.find(t => t.id == id); Object.assign(todo, { title: newTitle });
}
בואו ננסה את זה. נעבור תחילה לדף הרשימה:
כעת נלחץ על כפתור העריכה עבור אחד מפריטי המטלות כדי להעלות את דף העריכה /details
.
אנחנו הולכים להוסיף כותרת חדשה:
כעת, לחץ על שמור. זה אמור להחזיר אותנו לשלנו /list
עמוד, עם כותרת המשימות החדשה החלה.
איך הכותרת החדשה הופיעה ככה? זה היה אוטומטי. ברגע שהפנינו ל- /list
בעמוד, SvelteKit הרץ מחדש אוטומטית את כל המטעינים שלנו בדיוק כפי שהיה עושה ללא קשר. זהו ההתקדמות העיקרית שמסגרות יישומים מהדור הבא, כמו SvelteKit, Remix, ו 13 הבא לְסַפֵּק. במקום לתת לך דרך נוחה לעיבוד דפים ואז לאחל לך בהצלחה בהשגת כל נקודות קצה שתצטרך לעדכן נתונים, הם משלבים מוטציה של נתונים לצד טעינת נתונים, מה שמאפשר לשניים לעבוד במקביל.
כמה דברים שאולי אתה תוהה…
עדכון המוטציה הזה לא נראה מרשים מדי. המעמיסים יפעלו מחדש בכל פעם שתנווט. מה אם לא הוספנו הפניה מחדש בפעולת הטופס שלנו, אלא נשארנו בדף הנוכחי? SvelteKit יבצע את העדכון בפעולת הטופס, כמו קודם, אבל יבצע עוד הפעל מחדש את כל הטעינים עבור העמוד הנוכחי, כולל הטעינים בפריסת/ות העמוד.
האם יש לנו אמצעים ממוקדים יותר לבטל את תוקף הנתונים שלנו? לדוגמה, התגים שלנו לא נערכו, כך שבחיים האמיתיים לא נרצה לשאול אותם מחדש. כן, מה שהראיתי לך הוא רק התנהגות ברירת המחדל של הטפסים ב-SvelteKit. אתה יכול לבטל את התנהגות ברירת המחדל על ידי מתן התקשרות חזרה ל use:enhance
. ואז SvelteKit מספק מדריך פונקציות אי תוקף.
טעינת נתונים בכל ניווט היא עלולה להיות יקרה ומיותרת. האם אני יכול לשמור את הנתונים האלה כמו שאני עושה עם כלים כמו react-query
? כן, רק אחרת. SvelteKit מאפשר לך להגדיר (ולאחר מכן לכבד) את כותרות בקרת המטמון שהרשת כבר מספקת. ואני אעסוק במנגנוני פסילת מטמון בפוסט המשך.
כל מה שעשינו לאורך המאמר הזה משתמש בנתונים סטטיים ומשנה ערכים בזיכרון. אם אתה צריך להחזיר הכל ולהתחיל מחדש, עצור והפעל מחדש את npm run dev
תהליך צומת.
גלישה את
בקושי שרטנו את פני השטח של SvelteKit, אבל אני מקווה שראית מספיק כדי להתרגש מזה. אני לא זוכר את הפעם האחרונה שמצאתי פיתוח אתרים כל כך כיף. עם דברים כמו צרור, ניתוב, SSR ופריסה כולם מטופלים מחוץ לקופסה, אני יכול להשקיע יותר זמן בקידוד מאשר בהגדרות.
הנה כמה משאבים נוספים שבהם תוכל להשתמש כשלבים הבאים בלימוד SvelteKit:
- הפצת תוכן ויחסי ציבור מופעל על ידי SEO. קבל הגברה היום.
- Platoblockchain. Web3 Metaverse Intelligence. ידע מוגבר. גישה כאן.
- מקור: https://css-tricks.com/getting-started-with-sveltekit/
- 1
- 10
- 100
- 11
- 7
- 9
- 98
- a
- יכול
- אודות
- בנוגע לזה
- גישה
- חֶשְׁבּוֹן
- פעולה
- פעולות
- אדם
- הוסיף
- תוספת
- כתובת
- מנהל
- מתקדם
- להשפיע על
- תעשיות
- מאפשר
- בַּצַד
- כְּבָר
- תמיד
- כמות
- ו
- אחר
- לענות
- כל אחד
- האפליקציה
- בקשה
- יישומים
- יישומית
- סביב
- מערך
- מאמר
- מלאכותי
- שהוקצה
- מכני עם סלילה אוטומטית
- באופן אוטומטי
- זמין
- לחכות
- בחזרה
- רקע
- באנר
- בָּר
- בסיסי
- לפני
- הטוב ביותר
- מוטב
- בֵּין
- קצת
- שחור
- בלוג
- בלוג הודעות
- כָּחוֹל
- אריזה מקורית
- להביא
- דפדפן
- באגים
- לִבנוֹת
- נבנה
- מובנה
- לַחְצָן
- מטמון
- שיחה
- שיחות
- יכולות
- מקרה
- בהחלט
- אתגר
- משתנה
- ברור
- קוד
- סִמוּל
- צֶבַע
- טור
- איך
- Common
- תחרויות
- רְכִיב
- רכיבים
- כנסים
- לְחַבֵּר
- מקשר
- קונסול
- תוכן
- נוֹחַ
- יכול
- קורס
- כיסוי
- מכסה
- לִיצוֹר
- נוצר
- יוצרים
- נוֹכְחִי
- כיום
- נתונים
- מסד נתונים
- בְּרִירַת מֶחדָל
- מגדיר
- עיכוב
- עיכובים
- הַדגָמָה
- פריסה
- עיצוב
- פרטים
- dev
- צעצועי התפתחות
- DID
- לְהַצִיג
- לא
- עושה
- לא
- כל אחד
- במקום אחר
- מספיק
- שלם
- שְׁלֵמוּת
- שגיאה
- וכו '
- Ether (ETH)
- אֲפִילוּ
- כל
- הכל
- דוגמה
- נרגש
- התרגשות
- קיים
- יקר
- יצוא
- אפשרי
- מאפיין
- מעטים
- שדות
- שלח
- קבצים
- בסופו של דבר
- סוף
- אש
- ראשון
- לסדר
- דירה
- הבא
- לנצח
- טופס
- פוּרמָט
- צורות
- מצא
- מסגרות
- החל מ-
- מלא
- כֵּיף
- פונקציה
- פונקציונלי
- פונקציות
- לקבל
- מקבל
- לתת
- נתינה
- גלוֹבָּלִי
- Go
- מטרה
- Goes
- הולך
- לתפוס
- קְבוּצָה
- קבוצה
- לקרות
- קשה
- כותרות
- לעזור
- כאן
- מוּסתָר
- היררכיה
- ברמה גבוהה
- מחזיק
- אני מקווה
- מאוזן
- איך
- HTML
- HTTPS
- חולה
- דמיון
- לייבא
- חשיבות
- מרשים
- in
- כולל
- בתחילה
- קלט
- במקום
- לשלב
- מעניין
- מבוא
- IT
- פריטים
- עצמו
- JavaScript
- מפתח
- אחרון
- האחרון
- מערך
- למידה
- מאפשר לי
- רמה
- החיים
- אוֹר
- סביר
- קישורים
- רשימה
- לחיות
- לִטעוֹן
- מטעין
- טוען
- המון
- ארוך
- נראה
- נראה
- בדיקה
- מזל
- מכונות
- לעשות
- עושה
- עשייה
- ניהול
- מדריך ל
- שולים
- דבר
- אומר
- זכרון
- רק
- מיזוג
- שיטה
- יכול
- אכפת לי
- מודול
- יותר
- המהלך
- נע
- מספר
- מוטציה
- שם
- שם
- NAV
- נווט
- ניווט
- נקי
- הכרחי
- צורך
- נחוץ
- חדש
- הבא
- צומת
- נוֹרמָלִי
- מספר
- אובייקט
- אובייקטים
- ONE
- להזמין
- אחר
- אַחֶרֶת
- שֶׁלוֹ
- מסוים
- נתיב
- לבצע
- לבחור
- לְחַבֵּר
- חתיכות
- מציין מיקום
- אפלטון
- מודיעין אפלטון
- אפלטון נתונים
- נקודה
- הודעה
- הודעות
- פוטנציאל
- להכין
- בעיה
- תהליך
- לייצר
- פרוגרסיבי
- פּרוֹיֶקט
- מבטיח
- רכוש
- מוּגָן
- לספק
- מספק
- מושך
- גם
- שאלה
- חי
- חומר עיוני
- ממשי
- חיים אמיתיים
- מציאות
- Red
- הפניה
- ללא קשר
- להשאר
- לזכור
- להסיר
- טיוח
- מעבד
- לבקש
- משאבים
- תוצאות
- לַחֲזוֹר
- חוזר
- החזרות
- לחזור
- עשיר
- שורש
- מסלול
- נתיבים
- הפעלה
- ריצה
- אותו
- שמור
- ראות
- משמש
- סט
- Shadow
- שיתוף
- משותף
- צריך
- לְהַצִיג
- פָּשׁוּט
- בפשטות
- since
- יחיד
- להחליק
- So
- כמה
- משהו
- מקורות
- לבלות
- התחלה
- החל
- נשאר
- צעדים
- עצור
- להגיש
- תומך
- משטח
- מערכת
- שולחן
- תָג
- לקחת
- נטילת
- לדבר
- זה אחר זה
- ממוקד
- אומר
- תבנית
- מסוף
- השמיים
- דברים
- בכל
- זמן
- כותרת
- ל
- יַחַד
- גַם
- כלים
- סיור
- טיפול
- נָכוֹן
- תור
- כתב כתיבה
- ui
- תחת
- עדכון
- עדכונים
- כתובת האתר
- us
- להשתמש
- משתמש
- ערך
- ערכים
- שונים
- באמצעות
- לצפיה
- לחכות
- רציתי
- דרכים
- אינטרנט
- רכיבי רשת
- בניית אתרים
- מה
- אשר
- לבן
- יצטרך
- לנצח
- לְלֹא
- נִפלָא
- תיק עבודות
- עובד
- ראוי
- היה
- לכתוב
- זפירנט