6.1 KiB
Executable file
راهنمای بهینهسازی عملکرد وب برای Flutter Web
مشکل
در Flutter Web، صفحات به صورت تدریجی لود میشوند که باعث ایجاد تأخیر در جابجایی بین صفحات میشود.
راهکارهای پیادهسازی شده
1. بهینهسازی HTML (web/index.html)
- ✅ اضافه شدن
preloadبرای منابع مهم - ✅ اضافه شدن
preconnectوdns-prefetchبرای بهبود اتصال - ✅ بهینهسازی configuration برای eager loading
2. Route Prefetching (lib/utils/route_prefetcher.dart)
یک utility class برای پیشبارگذاری صفحات مهم:
- پیشبارگذاری صفحات اصلی پس از load شدن اپلیکیشن
- پیشبارگذاری صفحات در پسزمینه بدون block کردن UI
3. Eager Loading در Main.dart
- تمام صفحات به صورت eager load میشوند (همه import شدهاند)
- RoutePrefetcher برای prefetch کردن routes مهم
دستورالعمل Build
برای بهینهسازی بیشتر عملکرد در production، از دستورات زیر استفاده کنید:
Build برای Production با بهینهسازی کامل:
flutter build web --release --web-renderer canvaskit --base-href /
توضیحات فلگها:
--release: کامپایل با بهینهسازی کامل--web-renderer canvaskit: استفاده از CanvasKit renderer (عملکرد بهتر)--base-href /: تنظیم base href (در صورت نیاز تغییر دهید)
Build با Tree Shaking (کوچکتر کردن bundle):
flutter build web --release --web-renderer canvaskit --dart-define=FLUTTER_WEB_USE_SKIA=false
Build برای Development (برای تست):
flutter run -d chrome --web-renderer canvaskit
نکات مهم
1. Code Splitting
Flutter Web به صورت پیشفرض تمام کد را در یک bundle اصلی (main.dart.js) کامپایل میکند. اگر از deferred imports استفاده نکنید، تمام صفحات در همان bundle اولیه خواهند بود که باعث میشود:
- ✅ تأخیر در جابجایی بین صفحات از بین برود
- ⚠️ حجم bundle اولیه بزرگتر میشود
توصیه: برای وب، eager loading بهتر از lazy loading است چون:
- کاربران معمولاً چند صفحه را بازدید میکنند
- سرعت اینترنت امروزی معمولاً خوب است
- تأخیر کمتر = تجربه کاربری بهتر
2. Deferred Imports
اگر میخواهید از deferred imports استفاده کنید (برای کاهش حجم bundle اولیه):
// Import کردن با defer
import 'pages/business/products_page.dart' deferred as products_page;
// استفاده در route
GoRoute(
path: '/business/:business_id/products',
builder: (context, state) async {
await products_page.loadLibrary();
return products_page.ProductsPage(...);
},
)
اما توجه کنید: این باعث میشود که هنگام جابجایی به صفحه، تأخیر ایجاد شود.
3. Service Worker (اختیاری)
برای cache کردن صفحات در مرورگر، میتوانید از service worker استفاده کنید:
flutter build web --pwa-strategy offline-first
4. CDN و Caching
- از CDN برای serving فایلهای static استفاده کنید
- تنظیمات cache مناسب برای فایلهای Flutter Web:
main.dart.js: Cache for 1 year (با versioning)canvaskit/: Cache for 1 yearassets/: Cache for 1 year
بررسی عملکرد
Chrome DevTools
- باز کردن DevTools (F12)
- رفتن به تب Network
- بررسی زمان بارگذاری صفحات
- بررسی اینکه آیا صفحات از cache لود میشوند یا خیر
Performance Tab
- باز کردن Performance tab در DevTools
- Start recording
- جابجایی بین صفحات
- بررسی زمان navigation
راهکارهای پیشنهادی برای بهبود بیشتر
1. Lazy Loading برای صفحات کماستفاده
صفحاتی که کمتر استفاده میشوند را میتوانید lazy load کنید:
// فقط برای صفحات خاص که خیلی کم استفاده میشوند
import 'pages/admin/service_logs_page.dart' deferred as service_logs_page;
2. Prefetch Strategy
RoutePrefetcher به صورت خودکار صفحات مهم را prefetch میکند. اگر میخواهید صفحات خاصی را prefetch کنید:
// در جایی که router آماده است
RoutePrefetcher.setRouter(router);
RoutePrefetcher.prefetchRoute('business_products');
3. Image Optimization
- استفاده از WebP format
- Lazy loading برای تصاویر
- Responsive images
خلاصه
✅ تغییرات انجام شده:
- بهینهسازی
index.htmlبرای preload - اضافه شدن RoutePrefetcher
- اطمینان از eager loading تمام صفحات
📝 مراحل بعدی:
- Build کردن با دستورات بالا
- تست کردن در production
- بررسی عملکرد با DevTools
- تنظیم CDN و caching (اختیاری)
سوالات متداول
Q: چرا همه صفحات eager load میشوند؟
A: برای حذف تأخیر در جابجایی بین صفحات. حجم bundle بزرگتر میشود اما تجربه کاربری بهتر است.
Q: آیا میتوانم برخی صفحات را lazy load کنم؟
A: بله، با استفاده از deferred imports. اما باید تعادل بین حجم bundle و تأخیر را در نظر بگیرید.
Q: آیا prefetch باعث کند شدن اولیه میشود؟
A: خیر، prefetch در پسزمینه و بعد از load شدن اولیه انجام میشود.