رفع خطای Vite manifest not found در لاراول (Production)

event 29 مهر 1405
update به‌روزرسانی: 01 آبان 1405
timer 14 دقیقه
رفع خطای Vite manifest not found در لاراول (Production)
favorite 0

فرض کن کد رو 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 @vite directive 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 دو حالت داره:

  1. حالت dev: اگه فایل public/hot وجود داشته باشه (این فایل رو npm run dev می‌سازه)، لاراول اصلاً سراغ manifest نمی‌ره و تگ‌ها رو به آدرس dev server ای که داخل همین فایل نوشته شده (مثلاً http://localhost:5173) وصل می‌کنه.
  2. حالت 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 کار می‌کنه و روی سرور نه؟

علت‌هایی که معمولاً پشت این خطا هستن:

  1. public/build هیچ‌وقت به سرور نرسیده. توی .gitignore پیش‌فرض پروژه‌ی لاراول هم /public/build هست هم /public/hot. پس اگه deploy‌ت فقط git pull باشه، build هیچ‌وقت با کد نمیاد و باید یه جای دیگه ساخته بشه.
  2. build ساخته شده، ولی جای اشتباه. رایج‌ترین حالتش روی هاست اشتراکیه: محتوای public رو ریختی توی public_html، ولی public_path() لاراول هنوز به .../your-app/public اشاره می‌کنه.
  3. 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:

  1. build.zip رو توی همون فولدر public‌ای که لاراول ازش استفاده می‌کنه آپلود کن.
  2. از حالت فشرده خارجش کن تا build/manifest.json و build/assets/ ساخته بشن.
  3. فایل 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 رو یاد می‌گیری و می‌خوای ببینی این‌ها کجای مسیرن، مقایسه‌ی فرانت‌اند، بک‌اند و فول‌استک و بهترین زبان‌های برنامه‌نویسی برای یادگیری در ۲۰۲۶ رو هم ببین.

سوالی داشتی یا جایی گیر کردی، توی کامنت‌ها بپرس.

Captain Code
verified
نویسنده

Captain Code

مشاهده پروفایل arrow_back

عاشق دنیای کدنویسی و به اشتراک‌گذاری دانش. ما در کاپیتان کد تلاش می‌کنیم بهترین محتوا را برای شما تولید کنیم.

مفید بود؟ لایک کنید 👋
اشتراک‌گذاری:

کاپیتان کد

این را برای پروژه‌ات می‌خواهی؟

پروژه را به کاپیتان کد بسپار، یا با نیکس همین مسئله را دیباگ کن.

forum

نظرات

lock_person

برای ثبت نظر وارد شوید

برای شرکت در گفتگو، لطفاً ابتدا وارد حساب کاربری‌تان شوید.

login ورود
chat_bubble_outline

هنوز نظری ثبت نشده

اولین نفری باشید که نظر خود را درباره این مطلب به اشتراک می‌گذارد!