وسپ - Wasp: فریمورک full-stack ای که با یه فایل تنظیمات، بکاند رو براتون میسازه
حدود ۶ دقیقه مطالعه
اگه هر بار که یه پروژهی full-stack جدید شروع میکنی، خودت رو تو یه چرخهی تکراری میبینی (نصب و تنظیم auth، وصل کردن Prisma، نوشتن API routes برای هر عملیات سادهی CRUD، تنظیم ارسال ایمیل، پیکربندی deploy)، Wasp دقیقاً برای حذف همین تکرار طراحی شده. این فریمورک، بهجای اینکه یه کتابخونهی دیگه به استکت اضافه کنه، یه لایهی تنظیمات سطحبالا رو میذاره که کل اپلیکیشن (فرانتاند، بکاند، دیتابیس، حتی deploy) رو از یه نقطه توصیف میکنه.
ایدهی اصلی: Web Application Specification
اسم کامل Wasp مخفف Web Application Specification است، و همین اسم فلسفهی طراحیش رو نشون میده. بهجای اینکه مستقیم کد بکاند بنویسی، یه فایل تنظیمات (main.wasp) داری که با یه زبون اختصاصی (DSL) توصیف میکنه اپت چه چیزهایی داره: چه route هایی، چه صفحاتی، چه نوع auth ای، چه entity هایی تو دیتابیس. کامپایلر خود Wasp این توصیف رو میگیره و کد واقعی React، Node.js، و Prisma رو ازش تولید میکنه.
app MyApp {
wasp: { version: "^0.16.0" },
title: "My App",
auth: {
userEntity: User,
methods: { email: {} },
onAuthFailedRedirectTo: "/login"
}
}
route DashboardRoute { path: "/dashboard", to: DashboardPage }
page DashboardPage {
authRequired: true,
component: import { DashboardPage } from "@src/DashboardPage"
}
query getTasks {
fn: import { getTasks } from "@src/queries.js",
entities: [Task]
}
entity Task {=psl
id Int @id @default(autoincrement())
description String
isDone Boolean @default(false)
user User @relation(fields: [userId], references: [id])
userId Int
psl=}
با همین چند خط، Wasp خودش auth کامل (با redirect خودکار برای صفحات محافظتشده)، مدل دیتابیس، و زیرساخت لازم برای query رو میسازه؛ چیزی که دستی نوشتنش معمولاً چند صد خط کد میطلبه.
RPC بهجای REST API دستی
یکی از جذابترین بخشهای Wasp، مدل ارتباطی client-server شه. بهجای اینکه خودت endpoint بسازی و بعد جدا یه fetch call بنویسی، فقط یه تابع سرور رو تعریف میکنی و Wasp خودش یه hook تایپشده تو کلاینت تولید میکنه:
// سمت سرور: src/queries.js
export const getTasks = async (args, context) => {
return context.entities.Task.findMany({
where: { userId: context.user.id }
});
};
// سمت کلاینت: استفاده مستقیم، بدون نوشتن fetch یا API route
import { useQuery, getTasks } from 'wasp/client/operations';
function TaskList() {
const { data: tasks, isLoading } = useQuery(getTasks);
if (isLoading) return <div>در حال بارگذاری...</div>;
return <ul>{tasks.map(t => <li key={t.id}>{t.description}</li>)}</ul>;
}
نکتهی مهم اینجاست که تایپهای TypeScript بین سرور و کلاینت بهصورت خودکار sync میشن؛ اگه ساختار دادهای که از سرور برمیگرده عوض بشه، همون لحظه تو کلاینت هم خطای type-check میگیری، بدون اینکه خودت مجبور باشی این هماهنگی رو دستی نگه داری.
قابلیتهای آماده که معمولاً باید خودت بسازی
Wasp خودش رو «batteries-included» معرفی میکنه، و این ادعا با فهرست قابلیتهاش پشتیبانی میشه:
- Auth کامل: ایمیل/پسورد، گوگل، گیتهاب، اسلک، مایکروسافت، همه با پیکربندی چند خطی.
- Background jobs: برای کارهایی که نباید request رو بلاک کنن.
- ارسال ایمیل: بدون نیاز به تنظیم دستی SMTP یا SDK جدا.
- Type-safety کامل full-stack: از دیتابیس تا کامپوننت React.
- Deploy با یه دستور:
wasp deployمیتونه اپ رو مستقیم رو زیرساختهای پشتیبانیشده بالا بیاره.
نکتهی مهم: بدون lock-in
برخلاف پلتفرمهایی مثل Firebase یا Supabase که کدت به سرویس اونا وابسته میشه، Wasp ادعا میکنه هیچ lock-in ای نداره. خروجی کامپایل، کد خام React و Node.js و Prisma است که میتونی مستقیم تو پوشهی .wasp/ ببینیش. یعنی اگه یه روز تصمیم گرفتی از Wasp CLI فاصله بگیری، کد تولیدشده رو برمیداری و مستقل ازش ادامه میدی؛ بدون runtime اختصاصی یا لایهی مخفی سمت سرور.
چرا این روزها خودش رو «فریمورک عصر AI» معرفی میکنه
نکتهی جالب اینه که Wasp این روزها تمرکز بازاریابیش رو گذاشته رو اینکه برای کدنویسی با agent های هوش مصنوعی بهینهست. استدلالشون اینه: چون Wasp یه توصیف سطحبالا و declarative از کل اپلیکیشن داره (نه هزاران فایل پراکندهی boilerplate)، یه agent کدنویس میتونه ساختار کامل اپ رو خیلی سریعتر «بفهمه» و تغییرات درستی اعمال کنه. خود پروژه یه سری plugin و skill هم برای ابزارهایی مثل Claude Code منتشر کرده که مستقیم دانش Wasp رو به agent اضافه میکنه.
جالبه که این رویکرد هیچ ارتباطی به یه provider خاص هوش مصنوعی نداره؛ Wasp خودش هیچ AI داخلی نداره و اگه بخوای یه ویژگی AI به اپت اضافه کنی (مثلاً چتبات)، باید مدل دلخواهت (OpenAI، آنتروپیک، یا یه مدل local) رو مثل یه dependency معمولی Node.js وصل کنی؛ چیزی که خودشون توش دخالتی ندارن.
کجا این فریمورک جای خودش رو پیدا میکنه
Wasp دقیقاً یه خلأ خاص رو پر میکنه: جایی بین انعطاف کامل ولی کاردستی Next.js یا Remix (که همهچیز رو خودت وایر میکنی)، و انتزاع بالا ولی وابستهبه-سرویس Firebase یا Supabase (که برای هر چیزی به یه پلتفرم شخص ثالث وابستهای). اگه دنبال یه تجربهی شبیه Rails یا Laravel هستی، ولی میخوای تو دنیای TypeScript و React بمونی، Wasp دقیقاً همین رو ارائه میده.
معایب و محدودیتها
طبیعتاً این سطح از انتزاع هزینه هم داره. اکوسیستم Wasp نسبت به Next.js یا حتی Nuxt خیلی کوچیکتره؛ تعداد پروژههای واقعی، منابع آموزشی، و توسعهدهندههای آشنا محدودتره. یادگیری DSL اختصاصیش هم یه گام اضافهست، هرچند سینتکسش نسبتاً سادهست. و چون فریمورک هنوز رسماً تو مرحلهی beta است (با اینکه برای ساخت بیش از ۵۰ هزار پروژه استفاده شده)، برای پروژههای خیلی بزرگمقیاس یا سازمانی، ممکنه بلوغ لازم رو نداشته باشه. علاوه بر این، طبیعت «opinionated» فریمورک یعنی برای اپلیکیشنهایی که ساختارشون خیلی از الگوی معمول CRUD/auth/jobs فاصله داره، ممکنه بیشتر از اینکه کمک کنه، محدودت کنه.
جمعبندی
اگه داری یه SaaS یا اپلیکیشن full-stack نسبتاً استاندارد میسازی (auth، دیتابیس، چند تا صفحه، شاید یه سری background job) و میخوای سریعتر از صفر شروع کنی، بدون اینکه هفتهها وقت صرف wiring کردن قطعات مختلف کنی، Wasp ارزش امتحان کردن داره؛ مخصوصاً که رایگان، متنباز، و بدون lock-in است. اگه پروژهت نیاز به کنترل خیلی دقیق روی هر جزئیات معماری داره، یا از قبل تیمی داری که با Next.js یا Nuxt راحته، احتمالاً همون مسیر آشناتر منطقیتره.
