מאוד קשה לעשות זאת בצד הקליינט מכמה סיבות
1. בגלל הדינאמיות והמחסור בtypes ושום דבר לא restricted. אתה יכול לעשות refactoring כמה שאתה רוצה, השאלה איזה דברים יפסיקו לעבוד, כמה זמן יקח לגלות זאת ומה המחיר של זה.
2. בקליינט יש בעיה מובנית והיא ניהול state מה שברוב הסרברים שכתובים נכון אין כמעט. בשרת הstate יישמר בצורה מסודרת, או בDB (יכול להיות חיצוני, פנימי, כן SQL, לא SQL אפילו קובץ, זה לא משנה) או לפעמים במבנה סטטי בזכרון כשרוב המתכנתים ידאגו לסקלבליות, סנכרון ובאופן כללי סדר בקוד.
בקליינט לעומת זאת בסופו של דבר הסטייט הוא מאוד חשוב כי המשתמש עובד עם UI עשיר והפעולות שלו משפיעות על הסטייט ונשמרות. אופן השמירה בדרך כלל נעשה בסופו של דבר ע"י משתנים גלובליים. גם הפרימוורקים בסוף שומרים הכל באיזה משתנה בשם $ או משהו כזה. ואם לסבך עוד קצת, אז היום כבר עושים שימוש בפיצ'רים חדשים כמו הlocal storage, session storage ודברים כאלה.
נוצר מצב שבו מאוד קשה לשכתב דברים כשכל חלק בקוד מניח הנחות לגבי סטייט גלובלי שנשמר "איפשהו" ומתועד בעיקר בראש של המתכנת. אז אם אתה משתמש בFW, הטוטוריאלס די מכווינים אותך להשתמש בקונבנציות של הFW ואז זה אוכף מוסכמה מסויימת. בוונילה, אם יש לך מהנדס מצויין אתה יכול להגיע לקוד טוב אבל יש מעט מאוד מתכנתים שהם גם מהנדסים טובים וגם כותבים קליינט. התוצאה היא בדרך כלל קוד שכתב מישהו חצי חובבן וככה זה גם נראה.
ואפילו אם יש מישהו מעולה שכתב תשתית מסודרת, מתכנת חדש צריך ללמוד את המוסכמות והתשתית שזה יותר קשה כשזה פרי דמיונו של מתכנת אחד מאשר FW עם קהילה תומכת ומתעדת.