فرض کن کد رو push کردی، روی سرور git pull و composer install زدی و همهچیز آمادهی دیدنه. صفحه رو باز میکنی و بهجای سایت، خطای 500 میگیری؛ توی لاگ یا صفحهی خطای لاراول هم این جملهست:
Vite manifest not found at: /var/www/your-app/public/build/manifest.json
روی local همهچیز سالمه، چون اونجا یا npm run dev روشنه یا قبلاً یه بار npm run build زدی. ولی روی سرور، فایلی که لاراول دنبالش میگرده اصلاً وجود نداره. خطای Vite manifest not found در لاراول باگ فریمورک نیست. یعنی خروجی build فرانتاند (فولدر public/build) یا هیچوقت ساخته نشده، یا جایی ساخته شده که لاراول اونجا دنبالش نمیگرده. توی این مقاله اول دقیق میبینیم این خطا از کجا میاد، بعد سه راه واقعی برای ساختن و رسوندن build به سرور رو جدا جدا میریم: build روی خود VPS، build توی GitHub Actions، و build روی سیستم خودت برای هاست اشتراکی بدون Node.
این خطا دقیقاً از کجا میاد؟
توی Blade، assetها رو با directive @vite لود میکنی:
<head>
@vite(['resources/css/app.css', 'resources/js/app.js'])
</head>
طبق مستندات رسمی Laravel دربارهی Vite:
The
@vitedirective will automatically detect the Vite development server and inject the Vite client to enable Hot Module Replacement. In build mode, the directive will load your compiled and versioned assets, including any imported CSS.
یعنی @vite دو حالت داره:
- حالت dev: اگه فایل
public/hotوجود داشته باشه (این فایل روnpm run devمیسازه)، لاراول اصلاً سراغ manifest نمیره و تگها رو به آدرس dev server ای که داخل همین فایل نوشته شده (مثلاًhttp://localhost:5173) وصل میکنه. - حالت build: اگه
public/hotنباشه، لاراول فایلpublic/build/manifest.jsonرو میخونه تا بفهمهresources/js/app.jsبعد از build به کدوم فایل hashدار (مثلاًassets/app-xxxx.js) تبدیل شده.
خود خطا رو کلاس Illuminate\Foundation\Vite (همون چیزی که پشت @vite و facade Vite کار میکنه) توی متد manifest() پرتاب میکنه. نسخهی خلاصهشدهی کد فریمورک:
protected function manifest($buildDirectory)
{
$path = $this->manifestPath($buildDirectory);
if (! isset(static::$manifests[$path])) {
if (! is_file($path)) {
throw new ViteManifestNotFoundException("Vite manifest not found at: $path");
}
static::$manifests[$path] = json_decode(file_get_contents($path), true);
}
return static::$manifests[$path];
}
چند نکته از همین چند خط:
- مسیر از
public_path()+ اسم build directory (پیشفرضbuild) + اسم فایل manifest (پیشفرضmanifest.json) ساخته میشه. پس مسیری که توی پیام خطا میبینی، دقیقاً همون جاییه که لاراول دنبال فایل گشته. اولین کارت اینه که این مسیر رو با جایی که build رو گذاشتی مقایسه کنی. ViteManifestNotFoundExceptionاز Laravel 11 به بعد زیرکلاسViteExceptionاست (و توی کد بهعنوان deprecated علامت خورده)، پس اگه جاییViteExceptionرو catch کردی، این هم گرفته میشه.- اگه build directory رو عوض کرده باشی (مثلاً با
Vite::useBuildDirectory('bundle')یا آرگومان دوم@vite)، لاراول دنبالpublic/bundle/manifest.jsonمیگرده. خودuseBuildDirectory()خطا نمیده؛ فقط مسیر رو عوض میکنه. اگه همین مقدار رو تویvite.config.js(گزینهیbuildDirectoryپلاگین لاراول) هم نذاشته باشی، manifest جای دیگهای ساخته میشه و همین خطا رو میبینی.
دو خطای شبیه که با این یکی قاطی میشن:
| پیام | یعنی چی |
|---|---|
Vite manifest not found at: ... |
فایل manifest توی اون مسیر نیست (موضوع این مقاله) |
Unable to locate file in Vite manifest: resources/js/app.js. |
manifest هست، ولی این entry داخلش نیست؛ یا manifest قدیمیه، یا این فایل توی input پلاگین لاراول در vite.config.js نیومده |
Unable to locate file from Vite manifest: ... |
فقط وقتی Vite::content() (برای inline کردن asset) صدا زده بشه و فایل buildشده روی دیسک نباشه |
چرا روی local کار میکنه و روی سرور نه؟
علتهایی که معمولاً پشت این خطا هستن:
public/buildهیچوقت به سرور نرسیده. توی.gitignoreپیشفرض پروژهی لاراول هم/public/buildهست هم/public/hot. پس اگه deployت فقطgit pullباشه، build هیچوقت با کد نمیاد و باید یه جای دیگه ساخته بشه.- build ساخته شده، ولی جای اشتباه. رایجترین حالتش روی هاست اشتراکیه: محتوای
publicرو ریختی تویpublic_html، ولیpublic_path()لاراول هنوز به.../your-app/publicاشاره میکنه. - build روی سرور اجرا شده ولی fail شده. مثلاً Node قدیمیه، یا وابستگیها بدون devDependencies نصب شدن. اگه
vite buildبا خطا تموم بشه، manifest نوشته نمیشه.
یه مورد هم هست که این خطا رو نمیده ولی زیاد باهاش اشتباه گرفته میشه: فایل public/hot روی سرور جا مونده. اون موقع لاراول manifest رو نمیخونه و تگها رو به dev server (مثلاً localhost:5173) وصل میکنه. نتیجه، صفحهی بدون CSS و JS است، نه خطای manifest. معمولاً هم وقتی پیش میاد که npm run dev روی سرور اجرا شده یا فایل hot دستی آپلود شده.
تشخیص: اول ببین manifest کجاست
قبل از اینکه سراغ CI یا تنظیمات بری، روی سرور توی ریشهی پروژه اینها رو بزن:
# ۱. فولدر build هست؟
ls -la public/build/
# ۲. manifest.json داخلش هست و محتوا داره؟
head -c 500 public/build/manifest.json
# ۳. فایل hot (مال dev server) جا مونده؟
ls -la public/hot 2>&1
# ۴. لاراول دقیقاً دنبال کدوم مسیر میگرده؟
php artisan tinker --execute="echo public_path('build/manifest.json');"
نتیجه رو اینطوری بخون:
public/buildنیست: build اصلاً اجرا نشده یا به سرور نرسیده. برو سراغ یکی از سه راهحل پایین.- فولدر هست ولی manifest نیست یا خالیه: build وسط کار fail شده. خروجی کامل
npm run buildرو ببین (بخش «خطاهای رایج»). - مسیر دستور ۴ با جایی که build رو گذاشتی فرق داره: مشکل از مسیر public است (بخش هاست اشتراکی).
public/hotهست: پاکش کن. این فایل روی production هیچ کاربردی نداره:
rm -f public/hot
یه راه سریع دیگه هم برای چک کردن هست: https://your-domain.com/build/manifest.json رو توی مرورگر باز کن. این فایل عمومیه و اگه درست سر جاش باشه، JSON میبینی؛ اگه 404 گرفتی، یعنی توی فولدر publicای که وبسرور سرو میکنه نیست.
کدوم راهحل به کار تو میاد؟
| سکو | معیار | راهحل پیشنهادی |
|---|---|---|
| VPS لینوکسی با دسترسی SSH | میتونی Node نصب کنی | build روی خود VPS (سادهترین) |
| هر سکویی، مخصوصاً با تیم | build تکرارپذیر و خودکار میخوای | build توی GitHub Actions |
| هاست اشتراکی (cPanel، DirectAdmin) بدون Node | دسترسی محدود، بدون SSH یا Node | build روی سیستم خودت + آپلود public/build |
| Laravel Forge یا Ploi | سرور managed | مطمئن شو اسکریپت deploy پنل npm ci و npm run build رو داره |
| Docker | اپ توی کانتینر | build توی یه stage جدا از Dockerfile (پایین، توی سوالات متداول) |
قاعدهی سرانگشتی: اگه Node روی سرور داری، همونجا build بزن. اگه نداری یا میخوای هر deploy دقیقاً تکرارپذیر باشه، CI. اگه هیچکدوم در دسترس نیست، build روی سیستم خودت.
راهحل ۱: build روی VPS
Node درست رو نصب کن
اول ببین Node روی سرور هست یا نه. Ubuntu و Debian بهصورت پیشفرض Node ندارن و نسخهای هم که از مخزن پیشفرض نصب میشه ممکنه برای Vite قدیمی باشه:
node --version
npm --version
طبق مستندات Vite، Vite نسخهی Node.js 20.19+ یا 22.12+ میخواد (package.json پیشفرض Laravel 12 از Vite 7 و Laravel 13 از Vite 8 استفاده میکنه). Node 20 هم طبق جدول انتشار Node.js از آوریل ۲۰۲۶ دیگه پشتیبانی نمیشه، پس روی سرور یه نسخهی LTS فعال مثل 22 یا 24 بذار. با nvm:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.8/install.sh | bash
source ~/.bashrc
nvm install 24
(قبل از اجرا، آخرین نسخهی اسکریپت رو از README خود nvm چک کن.)
build رو اجرا کن
# روی سرور، داخل ریشهی پروژه
cd /var/www/your-app
# نصب دقیق وابستگیها از package-lock.json
npm ci --no-audit --no-fund
# build برای production
npm run build
⚠️ اینجا --omit=dev یا NODE_ENV=production نذار. توی package.json پیشفرض لاراول، vite، laravel-vite-plugin و tailwindcss همه توی devDependencies هستن؛ اگه نصب نشن، build با Cannot find module میخوابه.
خروجی موفق چیزی شبیه اینه (شمارهی نسخه، hashها و حجمها توی پروژهی تو فرق دارن):
vite v7.x.x building for production...
✓ NN modules transformed.
public/build/manifest.json x.xx kB │ gzip: x.xx kB
public/build/assets/app-[hash].css xx.xx kB │ gzip: x.xx kB
public/build/assets/app-[hash].js xx.xx kB │ gzip: xx.xx kB
✓ built in x.xxs
اگه خط public/build/manifest.json توی خروجی نبود یا build با خطا تموم شد، manifest ساخته نشده.
چی باید روی سرور باشه؟
بعد از build فقط اینها لازمن:
public/build/manifest.json
public/build/assets/ (فایلهای CSS و JS با hash)
node_modules فقط برای ساختن build لازمه و توی runtime لاراول نقشی نداره.
چکلیست قبل از اعلام «deploy تموم شد»
# ✓ manifest هست؟
test -f public/build/manifest.json && echo "OK" || echo "MISSING"
# ✓ حداقل یه فایل CSS یا JS ساخته شده؟
ls public/build/assets/ | grep -E '\.(css|js)$' > /dev/null && echo "OK" || echo "EMPTY"
# ✓ فایل hot پاک شده؟
test ! -f public/hot && echo "OK" || echo "HOT FILE EXISTS"
# ✓ صاحب و دسترسی فایلها
ls -l public/build/manifest.json
مهم نیست صاحب فایل حتماً www-data باشه؛ مهم اینه که کاربر PHP-FPM و وبسرور بتونن فایلها رو بخونن (مثلاً دسترسی 644 برای فایلها و 755 برای فولدرها کافیه).
راهحل ۲: build توی GitHub Actions
اگه میخوای هر deploy از یه محیط تمیز و یکسان ساخته بشه، یا Node رو روی سرور نمیخوای، build رو بده به CI. اینجا فقط روی بخش build و رسوندن public/build تمرکز میکنیم؛ اگه کل pipeline (کاربر deploy، SSH key، secrets، rollback) رو میخوای، راهنمای دیپلوی خودکار لاراول با GitHub Actions رو ببین.
workflow
# .github/workflows/deploy.yml
name: Build and Deploy
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '24'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build assets
run: npm run build
# اگه توی JS از متغیرهای VITE_ استفاده میکنی، اینجا بدشون:
# env:
# VITE_APP_NAME: ${{ vars.VITE_APP_NAME }}
- name: Verify manifest exists
run: |
test -f public/build/manifest.json || (echo "Manifest missing!" && exit 1)
test -d public/build/assets || (echo "Assets dir missing!" && exit 1)
- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: vite-build
path: public/build
retention-days: 7
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- name: Download build artifact
uses: actions/download-artifact@v4
with:
name: vite-build
path: public/build
- name: Upload build to server
uses: appleboy/scp-action@v1
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
source: "public/build"
target: "/var/www/your-app/public/build-new"
strip_components: 2
rm: true
- name: Swap build on server
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
set -e
cd /var/www/your-app
test -f public/build-new/manifest.json
rm -rf public/build-old
if [ -d public/build ]; then mv public/build public/build-old; fi
mv public/build-new public/build
rm -f public/hot
چند نکته دربارهی این workflow:
- verify قبل از upload است. اگه manifest ساخته نشده باشه، job اول fail میشه و job deploy اصلاً اجرا نمیشه؛ پس سایت هیچوقت بدون manifest بالا نمیاد.
- build اول توی
build-newآپلود میشه و بعد باmvجابهجا میشه. اگه مستقیمrm -rf public/buildکنی و بعد آپلود، چند ثانیه سایت بدون asset میمونه. build قبلی هم تویbuild-oldمیمونه تا اگه صفحهای از کش هنوز به hashهای قبلی اشاره میکنه، 404 نده. - متغیرهای
VITE_موقع build توی JS جاسازی میشن، نه موقع اجرا. اگه ازimport.meta.env.VITE_...استفاده میکنی، باید توی همین step مقدار داشته باشن (مستندات Vite دربارهی env). - برای اینکه هیچوقت سایت نیمهکاره نمونه، میتونی کل release رو با symlink عوض کنی؛ بخش «Atomic Deploy با Symlink» توی همون راهنمای GitHub Actions دقیقاً همینه.
- اگه از Laravel Octane استفاده میکنی، manifest توی یه property استاتیک کش میشه و workerها بین درخواستها زنده میمونن؛ بعد از deploy، workerها رو با
php artisan octane:reloadریاستارت کن.
تستها توی CI هم همین خطا رو میدن
اگه توی CI قبل از build، تستهای PHPUnit یا Pest رو اجرا کنی و صفحهای که @vite داره رندر بشه، همین Vite manifest not found رو میگیری. طبق مستندات Laravel، یا قبل از تستها npm run build بزن، یا توی تستها $this->withoutVite() رو صدا بزن.
هزینه
طبق مستندات billing گیتهاب، runnerهای استاندارد برای ریپوهای public رایگانن. برای ریپوی private، هر پلن یه سهمیهی ماهانه داره (مثلاً GitHub Free ماهی ۲,۰۰۰ دقیقه و ۵۰۰ مگابایت فضای artifact). retention-days: 7 توی workflow بالا برای اینه که artifactهای قدیمی فضا رو پر نکنن.
راهحل ۳: build روی سیستم خودت و آپلود public/build (هاست اشتراکی بدون Node)
روی خیلی از هاستهای اشتراکی (از جمله خیلی از هاستهای ایرانی) نه Node داری نه SSH کامل. اینجا build رو روی سیستم خودت میسازی و فقط خروجی رو آپلود میکنی.
build روی local
# روی سیستم خودت، داخل ریشهی پروژه
node --version # یه نسخهی LTS فعال، مثلاً 22 یا 24
npm ci
npm run build
# فشرده کردن خروجی
cd public
zip -r build.zip build/
اگه فایل public/hot روی سیستمت هست (چون npm run dev روشنه)، مراقب باش همراه بقیهی فایلها آپلودش نکنی.
آپلود
از File Manager پنل یا SFTP:
build.zipرو توی همون فولدر publicای که لاراول ازش استفاده میکنه آپلود کن.- از حالت فشرده خارجش کن تا
build/manifest.jsonوbuild/assets/ساخته بشن. - فایل zip رو پاک کن.
نکتهی اصلی: مسیر public روی هاست اشتراکی
روی خیلی از هاستها ساختار اینشکلیه: کد لاراول توی /home/user/your-app و فولدر عمومی سایت public_html. اگه محتوای public رو کپی کردی توی public_html، لاراول هنوز public_path() رو /home/user/your-app/public میدونه و دنبال /home/user/your-app/public/build/manifest.json میگرده؛ پیام خطا هم همین مسیر رو نشون میده.
دو راه داری:
- build رو همون جایی بذار که پیام خطا میگه، یا
- به لاراول بگو public واقعی کجاست. توی Laravel 11 به بالا، توی
bootstrap/app.php:
$app = Application::configure(basePath: dirname(__DIR__))
// ->withRouting(...) و بقیهی تنظیمات فعلیت
->create();
// مسیر رو با ساختار هاست خودت تطبیق بده
$app->usePublicPath(dirname(__DIR__, 2).'/public_html');
return $app;
چکلیست بدون SSH
- توی File Manager ببین
build/manifest.jsonو فولدرbuild/assets/کنارindex.phpسایت هستن. https://your-domain.com/build/manifest.jsonرو توی مرورگر باز کن؛ باید JSON ببینی.- فایلی به اسم
hotکنارindex.phpنباشه.
لازم نیست node_modules، package.json یا package-lock.json رو روی هاست آپلود کنی؛ توی runtime نقشی ندارن.
مقایسهی سه روش
| معیار | build روی VPS | GitHub Actions | build روی local + آپلود |
|---|---|---|---|
| سختی راهاندازی | آسان | متوسط | آسان |
| خودکار | با اسکریپت deploy | کامل | دستی |
| تکرارپذیری | متوسط (بسته به Node سرور) | بالا (محیط تمیز در هر اجرا) | پایین (بسته به سیستم خودت) |
| Node روی سرور لازمه؟ | بله | خیر | خیر |
کش node_modules |
خیر | بله (cache: 'npm') |
خیر |
| مناسب برای | پروژهی تکنفره روی VPS | تیم یا deploy خودکار | هاست اشتراکی |
| هزینهی اضافه | ندارد | ریپوی public رایگان؛ private طبق سهمیهی پلن | ندارد |
خطاهای رایج و راهحل
خطای ۱: EACCES: permission denied, mkdir '/var/www/.npm'
این خطا معمولاً وقتی میاد که npm رو با کاربر وبسرور (مثلاً sudo -u www-data npm ci) اجرا میکنی. home این کاربر معمولاً /var/www است و خودش اجازهی نوشتن توش رو نداره، پس npm نمیتونه فولدر کش .npm رو بسازه.
# راه بهتر: build رو با همون کاربر deploy که صاحب پروژهست اجرا کن
cd /var/www/your-app
npm ci
npm run build
# یا اگه مجبوری با کاربر دیگه اجرا کنی، مسیر کش رو برای همون اجرا عوض کن
npm ci --cache /tmp/npm-cache
خطای ۲: Cannot find module 'tailwindcss' (یا vite، laravel-vite-plugin) موقع build
اول ببین وابستگیها رو بدون devDependencies نصب کردی یا نه (npm ci --omit=dev، npm install --production یا NODE_ENV=production). ابزارهای build توی devDependencies هستن و حتماً باید نصب بشن. اگه این نبود، نصب رو تمیز از اول انجام بده:
rm -rf node_modules
npm ci
package-lock.json رو پاک نکن؛ npm ci دقیقاً از روی همین فایل نصب میکنه و پاک کردنش یعنی ممکنه نسخهی پکیجها روی سرور با local فرق کنه.
خطای ۳: build موفقه ولی سایت هنوز درست نیست
- هنوز
Vite manifest not foundمیگیری: مسیر پیام خطا رو با جای build مقایسه کن (بخش تشخیص). تقریباً همیشه مسیر public یا build directory با هم نمیخونن. - صفحه بدون CSS و JS است و درخواستها به
localhost:5173یا[::1]:5173میرن:public/hotجا مونده؛ پاکش کن. - از Octane استفاده میکنی: workerها manifest قبلی رو توی حافظه دارن؛
php artisan octane:reload. - فایلهای JS و CSS با 404 لود نمیشن: HTML صفحه از کش (کش صفحهی کامل یا CDN) میاد و به hashهای build قبلی اشاره میکنه که پاکشون کردی. کش رو purge کن و build قبلی رو تا مدتی نگه دار (مثل
build-oldتوی workflow بالا).
خطای ۴: فایلها لود میشن ولی مرورگر CSS یا JS رو اجرا نمیکنه
توی DevTools، تب Console و Network رو ببین:
- خطای Mixed Content: سایت روی HTTPS است ولی آدرس assetها
http://ساخته شده. معمولاً یعنی لاراول پشت proxy یا CDN نمیفهمه درخواست HTTPS بوده؛ همون مشکلی که توی بخش trustProxies راهنمای رفع خطای 419 در لاراول توضیح دادیم. اگه assetها رو از دامنهی دیگهای سرو میکنی،ASSET_URLرو هم چک کن. - پیام MIME type (مثلاً
text/plain): توی تنظیمات Nginx، بلاکhttpبایدinclude /etc/nginx/mime.types;رو داشته باشه. - خطای Content Security Policy: اگه CSP داری، دامنهی assetها یا nonce رو بهش اضافه کن. لاراول با
Vite::useCspNonce()به تگهایی که@viteمیسازه nonce اضافه میکنه.
سوالات متداول
۱. چرا npm run build روی local کار میکنه ولی توی CI یا روی سرور نه؟
سه علت رایج: (الف) نسخهی Node فرق داره؛ توی GitHub Actions حتماً node-version رو صریح بنویس. (ب) متغیرهای VITE_ که روی local توی .env داری، توی CI تعریف نشدن. (ج) devDependencies نصب نشدن (خطای ۲).
۲. میتونم public/build رو توی git commit کنم؟
میشه، ولی پیشنهاد نمیشه. فایلهای build با هر تغییر عوض میشن، history ریپو رو شلوغ میکنن و همیشه این ریسک هست که build commitشده با کد همخوان نباشه. لاراول هم بهصورت پیشفرض /public/build رو توی .gitignore گذاشته. اگه روی هاست اشتراکی هستی و CI نداری، روش آپلود دستی بالا تمیزتره.
۳. توی Docker چطور build کنم؟
با Dockerfile چندمرحلهای (multi-stage):
# Stage 1: build assets
FROM node:24-alpine AS assets
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Stage 2: production
FROM php:8.4-fpm
WORKDIR /var/www/html
COPY . .
# خروجی build رو بعد از کپی کد بیار تا چیزی روش بازنویسی نشه
COPY --from=assets /app/public/build ./public/build
اینطوری image نهایی Node نداره و build هر بار از صفر ساخته میشه. node_modules و public/build و public/hot رو هم توی .dockerignore بذار. (نصب PHP extensionها و composer install توی این نمونه نیومده.)
۴. Vite با Laravel Mix فرق داره؟
آره. از Laravel 9.19 به بعد، پروژههای جدید لاراول بهجای Mix (که روی webpack است) از Vite استفاده میکنن. Mix فایل mix-manifest.json میساخت و توی Blade از mix() استفاده میکردی؛ با Vite باید @vite() بنویسی و manifest توی public/build/manifest.json ساخته میشه. اگه پروژهی قدیمی رو مهاجرت دادی و هنوز جایی mix() داری، اون رو هم عوض کن.
۵. Node رو بدون nvm چطور روی سرور نصب کنم؟
با پکیجهای NodeSource:
curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash -
sudo apt install -y nodejs
قبل از اجرای هر اسکریپتی که از اینترنت با bash اجرا میشه، یه نگاه به محتواش بنداز.
۶. باید package-lock.json رو commit کنم؟
آره، حتماً. npm ci بدون package-lock.json (یا وقتی با package.json نمیخونه) اصلاً اجرا نمیشه، و بدون lock file هر build ممکنه نسخهی متفاوتی از پکیجها بگیره.
اگه بخوام کل مقاله رو توی یه جمله بگم: مسیر توی پیام خطا رو بخون، ببین public/build/manifest.json واقعاً اونجا هست یا نه، و بعد یه راه ثابت برای ساختن build انتخاب کن (روی VPS، توی CI، یا روی سیستم خودت) که هر deploy خودش چک کنه manifest سر جاشه. assetهای درست و سبک فقط برای رفع خطا نیستن، روی سرعت و Core Web Vitals هم اثر دارن؛ بخش Vite توی راهنمای سئو تکنیکال لاراول دقیقاً دربارهی همینه.
deployت هنوز درست نشده؟ پیام کامل خطا، خروجی npm run build و vite.config.js رو به نیکس، دستیار هوش مصنوعی کاپیتان کد بده تا باهات قدمبهقدم بگرده ببینه build کجا گم میشه. اگه هم ترجیح میدی کل pipeline (از build و deploy تا نگهداری سرور) یه بار درست راه بیفته و دیگه درگیرش نباشی، نگهداری و امنیت سایت و توسعهی سایت اختصاصی با لاراول دقیقاً برای همینه؛ کافیه پروژهات رو برامون بفرستی.
اگه تازه داری بکاند و deploy رو یاد میگیری و میخوای ببینی اینها کجای مسیرن، مقایسهی فرانتاند، بکاند و فولاستک و بهترین زبانهای برنامهنویسی برای یادگیری در ۲۰۲۶ رو هم ببین.
سوالی داشتی یا جایی گیر کردی، توی کامنتها بپرس.