این پوشه شامل راهنمای استفاده از source maps برای فایلهای webpack است.
چرا Source Maps؟
Source maps به PageSpeed Insights و browser DevTools کمک میکند که:
- کد minified شده را به کد اصلی map کنند
- debugging در production آسانتر شود
- Performance insights دقیقتری ارائه دهند
ساختار فایلها
assets/js/
├── app-vendor.js # Bundle اصلی
├── app-vendor.js.map # Source map اصلی
├── app-vendor.v5.5.32.js # Bundle نسخهدار (برای production)
└── app-vendor.v5.5.32.js.map # Source map نسخهدار
نحوه استفاده
1. Build کردن webpack با source maps
npm run build
این دستور webpack را با devtool: "source-map" میسازد و فایلهای زیر را ایجاد میکند:
app-vendor.js+app-vendor.js.mapapp-calculator.js+app-calculator.js.mapapp-chart.js+app-chart.js.mapapp-coins.js+app-coins.js.map
2. ساخت فایلهای نسخهدار برای production
بعد از build، فایلهای versioned را بسازید:
# خودکار (نسخه از .env خوانده میشود)
npm run build:production
# یا دستی با PowerShell
.\create-versioned-sourcemaps.ps1 -Version "5.5.32"
# یا با Node.js
node create-versioned-sourcemaps.js
3. Deploy به production
فایلهای زیر را به production منتقل کنید:
- همه فایلهای
.js - همه فایلهای
.js.map
مهم: مطمئن شوید nginx یا Apache فایلهای .map را serve میکنند!
تنظیمات nginx
برای serve کردن source maps:
location ~ \.map$ {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Content-Type' 'application/json';
expires 1y;
}
Troubleshooting
خطای “Timed out fetching resource”
این خطا معمولاً به این دلایل رخ میدهد:
- فایلهای versioned وجود ندارند:
- اگر
ASSET_VERSIONدر production/staging تغییر کرده (مثلاً 5.5.34) - ولی فایلهای versioned در سرور نیستند
- راه حل: فایلهای versioned را بسازید:
# برای نسخه مشخص .\create-versioned-sourcemaps.ps1 -Version "5.5.34" # سپس commit و push کنید git add assets/js/*.v5.5.34.* git commit -m "Add source maps for version 5.5.34" git push
- اگر
- Source map reference اشتباه:
- فایل
app-vendor.v5.5.32.jsباید بهapp-vendor.v5.5.32.js.mapاشاره کنه - نه به
app-vendor.js.map
- فایل
- فایل .map وجود ندارد در سرور:
- مطمئن شوید فایلهای
.mapدر production/staging هستند - بررسی کنید که
.gitignoreاین فایلها را ignore نمیکند - فایلهای
.mapباید با فایلهای.jsدر یک پوشه باشند
- مطمئن شوید فایلهای
- MIME type اشتباه:
- فایلهای
.mapباید باContent-Type: application/jsonserve شوند - nginx configuration را بررسی کنید
- فایلهای
- Permission مشکل دارد:
- مطمئن شوید فایلهای
.mapقابل خواندن هستند (chmod 644)
- مطمئن شوید فایلهای
بررسی وضعیت فایلها
# بررسی که فایلهای versioned برای نسخه فعلی وجود دارند
ls assets/js/*.v5.5.34.*
# بررسی نسخه در .env
grep ASSET_VERSION .env
# ساخت فایلهای versioned اگر وجود ندارند
.\create-versioned-sourcemaps.ps1 -Version "5.5.34"
- فایل .map وجود ندارد:
- مطمئن شوید فایلهای
.mapدر production هستند
- مطمئن شوید فایلهای
- MIME type اشتباه:
- فایلهای
.mapباید باContent-Type: application/jsonserve شوند
- فایلهای
بررسی source map reference
# بررسی آخرین خط فایل JS
tail -n 1 app-vendor.v5.5.32.js
# باید چیزی شبیه این باشد:
# //# sourceMappingURL=app-vendor.v5.5.32.js.map
فایلهای مهم
webpack.config.js- تنظیمdevtool: "source-map"create-versioned-sourcemaps.js- اسکریپت Node.js برای ساخت نسخهدارcreate-versioned-sourcemaps.ps1- اسکریپت PowerShell برای Windowspackage.json- npm scripts
یادداشتهای مهم
- فایلهای
.mapحجم زیادی دارند (app-vendor.js.map ~3MB) - Source maps فقط در صورت نیاز load میشوند (DevTools باز باشد)
- فایلهای versioned باید هر بار با ASSET_VERSION جدید ساخته شوند
- Git این فایلها را ignore میکند (در
.gitignore)