4 поширені помилки Vite у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 20 лютого, 2025
Використання Vite для створення фронтенд-ресурсів у вашому додатку Laravel може бути захоплюючим, але іноді ви можете стикнутися з певними помилками. У цій статті ми розглянемо чотири поширені помилки, з якими ви можете зіткнутися, а також підкажемо способи їх усунення, щоб ви могли знову зосередитися на розробці вашого додатку

Vite — чудовий інструмент, який дозволяє швидко створювати фронтенд-ресурси для вашого Laravel-додатку. Проте, як і з будь-яким іншим інструментом, на початку можуть виникнути деякі труднощі. Коли ви стикаєтеся з помилкою, це може затримати ваш прогрес, поки ви намагаєтеся зрозуміти, що пішло не так.

У цій статті я розгляну чотири типові помилки, які ви можете зустріти, використовуючи Vite з Laravel:

Сподіваюся, до кінця цієї статті ви краще зрозумієте, як виправити ці помилки та продовжити розробку свого додатку.

Для цілей цієї статті ми припустимо, що працюємо з новим додатком Laravel 11.

# Vite manifest не знайдено за адресою: public/build/manifest.json

Типова помилка, з якою ви можете зіткнутися, — "Vite manifest не знайдено за адресою: public/build/manifest.json". Це відбувається під час завантаження сторінки, коли плагін Vite для Laravel не може знайти файл manifest, згенерований під час процесу збірки. Давайте розглянемо, що таке файл manifest і дві ймовірні ситуації, коли ця помилка може виникнути.

# Використання стандартної конфігурації Laravel/Vite

Якщо ви не змінювали команди у файлі package.json, що постачається з новою установкою Laravel 11, ви можете запустити одну з наведених команд, щоб зібрати свої ресурси і згенерувати файл manifest:

Запустивши одну з цих команд, буде створено новий файл public/build/manifest.json, який виглядатиме приблизно так:

{
  "resources/css/app.css": {
    "file": "assets/app-rlbWHTKs.css",
    "src": "resources/css/app.css",
    "isEntry": true
  },
  "resources/js/app.js": {
    "file": "assets/app-Xaw6OIO1.js",
    "name": "app",
    "src": "resources/js/app.js",
    "isEntry": true
  }
}

Цей файл manifest.json зв'язує вихідні файли з CSS та JS, які обробив і зібрав Vite. Це означає, що у ваших Blade-шаблонах ви можете використовувати щось на кшталт:

@vite('resources/css/app.css')

І на виході ви отримаєте наступний HTML:

<link rel="preload" as="style" href="http://example.test/build/assets/app-rlbWHTKs.css" />

Отже, без файлу manifest.json інтеграція Vite з Laravel не знатиме, який зібраний файл відповідає вихідному файлу.

У більшості випадків виконання відповідного скрипта збірки (npm run dev або npm run build) створює файл manifest.json і вирішує проблему.

# Використання кастомізованої конфігурації Laravel/Vite

Якщо ви налаштували будь-які параметри Vite, можливо, плагін Vite для Laravel не може знайти файл manifest.json. Наприклад, якщо ви оновили файл vite.config.js, щоб зберігати зібрані файли у public/dist, додавши параметр buildDirectory:

import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';

export default defineConfig({
    plugins: [
        laravel({
            input: ['resources/css/app.css', 'resources/js/app.js'],
            buildDirectory: 'dist',
            refresh: true,
        }),
    ],
});

В цьому випадку зібрані файли зберігатимуться у public/dist, отже, файл manifest.json буде знаходитись за адресою public/dist/manifest.json. Але плагін Laravel Vite все ще шукає файл manifest.json у стандартному каталозі public/build, коли ви використовуєте директиву @vite у вашому Blade-шаблоні.

Щоб вирішити це, скористайтеся розширеними можливостями кастомізації плагіна Vite, щоб вказати місцезнаходження файлу manifest.json, замінивши директиву @vite у ваших Blade-шаблонах на:

{{ Vite::useBuildDirectory('dist')->withEntryPoints(['resources/css/app.css', 'resources/js/app.js']) }}

Як видно з прикладу вище, ми використовуємо метод useBuildDirectory, щоб вказати каталог збірки. Ми також використовуємо метод withEntryPoints, щоб вказати точки входу, які раніше передавалися директиві @vite. Після цього плагін Laravel Vite зможе знайти файл manifest.json у правильному каталозі, і помилка має бути виправлена.

# Не вдалося знайти файл у Vite manifest: resources/sass/app.scss

Ще одна поширена помилка під час використання Vite у проекті Laravel — "Не вдалося знайти файл у Vite manifest: resources/sass/app.scss". Ця помилка виникає, коли Vite не може знайти файл, вказаний у директиві @vite у ваших Blade-шаблонах.

Наприклад, ви могли б мати файл resources/sass/app.scss, який намагаєтеся включити у свій Blade-шаблон за допомогою директиви @vite:

@vite('resources/sass/app.scss')

Розглянемо можливі причини та рішення цієї помилки.

# Перевірте шлях до файлу та його наявність

По-перше, рекомендую перевірити, чи правильний шлях до файлу у Blade-шаблоні. Наприклад, ви можете використовувати @vite('resources/sass/app.scss'), тоді як файл насправді знаходиться за адресою resources/css/app.scss.

Також перевірте, чи існує вказаний файл у зазначеному місці.

Дублюйте (і навіть потрійно!) перевірте шляхи та назви файлів. Можливо, у шляху є помилка, або ви використали неправильне розширення файлу. Якщо шлях до файлу неправильний, вам потрібно його виправити, щоб вирішити помилку.

# Відновіть файл manifest

Ще одне потенційне рішення — спробувати зібрати ваші ресурси, використовуючи відповідний скрипт збірки (npm run dev або npm run build). Ви, можливо, використовуєте застарілий файл manifest, який не містить файл, що намагаєтеся включити у свій Blade-шаблон. Запуск скрипта збірки відновить новий файл manifest, який може включати файл, що ви намагаєтеся підключити, і виправить цю проблему.

# Перевірте, чи обробив Vite файл

Якщо ви все ще отримуєте цю помилку після перевірки наявності файлу та відновлення активів, це вказує на те, що Vite не обробив файл.

Швидкий спосіб це перевірити — подивитися на файл public/build/manifest.json і перевірити, чи вказаний файл у властивості src однієї з оброблених записів. Наприклад, якщо ми поглянемо на цей файл manifest.json, ми можемо побачити, що файл resources/sass/app.scss не вказано:

{
    "resources/css/app.css": {
        "file": "assets/app-rlbWHTKs.css",
        "src": "resources/css/app.css",
        "isEntry": true
    },
    "resources/js/app.js": {
        "file": "assets/app-Xaw6OIO1.js",
        "name": "app",
        "src": "resources/js/app.js",
        "isEntry": true
    }
}

Тоді як у цьому прикладі файл resources/sass/app.scss вказано:

{
    "resources/js/app.js": {
        "file": "assets/app-Xaw6OIO1.js",
        "name": "app",
        "src": "resources/js/app.js",
        "isEntry": true
    },
    "resources/sass/app.scss": {
        "file": "assets/app-DtFeYo_o.css",
        "src": "resources/sass/app.scss",
        "isEntry": true
    }
}

Якщо файл не вказано у manifest.json, ви хочете перевірити свій файл vite.config.js, щоб переконатися, що файл входить у процес збору. Наприклад, у цьому файлі vite.config.js ми можемо бачити, що файл resources/sass/app.scss не було включено в масив input:

import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';

export default defineConfig({
    plugins: [
        laravel({
            input: ['resources/css/app.css', 'resources/js/app.js'],
            refresh: true,
        }),
    ],
});

Є багато причин, чому файл може не бути включено в процес збору. Наприклад, можливо, ви у процесі переходу з CSS на SCSS, і ви забули оновити файл vite.config.js, щоб включити шлях до нового файлу SCSS. Це те, що я забував робити багато разів!

У такому випадку ви можете оновити файл vite.config.js, щоб включити правильний шлях до файлу:

import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';

export default defineConfig({
    plugins: [
        laravel({
            input: ['resources/sass/app.scss', 'resources/js/app.js'],
            refresh: true,
        }),
    ],
});

Запустивши свій скрипт збірки, ви тепер повинні включити файл resources/sass/app.scss у процес збору, і сподіваюся, проблема буде виправлена.

# Uncaught ReferenceError: $ не визначено (використання jQuery)

Ще одна помилка, з якою ви можете зіткнутися при використанні Vite — "Uncaught ReferenceError: $ не визначено", коли використовується jQuery. Ця помилка відбувається, коли у вашому коді JavaScript використовується змінна $, але jQuery не завантажено.

# Перевірте, чи встановлено jQuery

Можливо, причина цієї помилки в тому, що jQuery не було включено у ваш процес збору Vite. Перше, що потрібно перевірити — чи встановлено jQuery. Якщо ви використовуєте NPM для управління вашими JavaScript-залежностями, ви можете скористатися командою npm list, щоб дізнатися.

Наприклад, припустимо, що наш проект розташовано за адресою /Users/ashallen/www/my-laravel-app, ми можемо виконати таку команду для перевірки, чи встановлено jQuery:

npm list jquery

Якщо jQuery встановлено, ви побачите щось на зразок цього:

my-laravel-app@ /Users/ashallen/www/my-laravel-app
└── jquery@3.7.1

Якщо його не встановлено, вивід може виглядати так:

my-laravel-app@ /Users/ashallen/www/my-laravel-app
└── (empty)

Якщо його не встановлено, ви можете встановити його як залежність для розробки, використовуючи наступну команду:

npm install jquery -D

# Перевірте, чи імпортовано jQuery

Після встановлення jQuery вам потрібно буде зробити його доступним у всіх файлах, де ви хочете використовувати $. Наприклад, ви можете включити його у свій файл resources/js/app.js, якщо використовуєте його там:

import './bootstrap';
import $ from 'jquery';

// Тепер ви можете звертатися до змінної $ тут...

Припустимо, у нас є файл resources/js/MyClass.js, який використовує jQuery. Ми створимо простий приклад файла чисто для демонстрації:

export default class MyClass {
    init() {
        $('body').on('click', function () {
            console.log('Body clicked');
        });
    }
}

Клас resources/js/MyClass.js має єдиний метод init, який прикріплює обробник подій на клік до елемента body. Коли тіло клацають, у консолі з'являється повідомлення.

Потім, у нашому файлі resources/js/app.js, імпортуємо клас resources/js/MyClass.js та викликаємо метод init:

import './bootstrap';
import $ from 'jquery';
import MyClass from "./MyClass.js";

new MyClass().init();

Тепер, коли сторінка завантажується, помилка "Uncaught ReferenceError: $ не визначено" виникне, оскільки змінна $ недоступна у файлі resources/js/MyClass.js; вона доступна лише у файлі resources/js/app.js. Щоб вирішити цю помилку, у нас є два варіанти:

Якщо ми вирішимо імпортувати jQuery у файлі resources/js/MyClass.js, можемо оновити файл таким чином:

import $ from 'jquery';

export default class MyClass {
    init() {
        $('body').on('click', function () {
            console.log('Body clicked');
        });
    }
}

Альтернативно, якщо ми оберемо призначити змінну $ об'єкту window у файлі resources/js/app.js, можемо оновити файл так:

import './bootstrap';
import MyClass from "./MyClass.js";
import $ from 'jquery';

// Призначення змінної $ об'єкту window
window.$ = $;

new MyClass().init();

Після внесення будь-яких із цих змін помилка "Uncaught ReferenceError: $ не визначено" повинна, сподіваюся, зникнути.

Ці види помилок іноді важко помітити і виправити, особливо в продуктивних середовищах, де ви можете побачити помилку лише після розгортання вашого додатку. Саме тому я настійно рекомендую використовувати інструмент на кшталт Sentry, щоб допомогти вам відстежувати і налагоджувати ці помилки. Sentry — чудовий інструмент моніторингу помилок, який дозволяє відстежувати ваш фронтенд JavaScript-код і бекенд Laravel-код на наявність помилок та винятків. Це прекрасний спосіб отримати повну картину того, що йде не так у вашій програмі та швидше виправити помилки.

# vite: Доступ заборонено

Ще одна помилка, з якою ви можете зіткнутися, запустивши команду Vite — "vite: Доступ заборонено". Ця помилка зазвичай виникає, коли ви намагаєтеся виконати команду Vite без достатніх прав доступу.

Наприклад, ви могли встановити свої залежності NPM, використовуючи sudo npm install замість npm install. Внаслідок цього директорія node_modules та її вміст могли стати власністю користувача root, а не вашого облікового запису користувача. Це означає, що необхідні файли не можуть бути доступні, коли ви намагаєтеся виконати команду Vite.

Зазвичай рішенням цієї проблеми є зміна власності директорії node_modules та її вмісту, щоб ви могли виконувати команди Vite. Один із можливих способів зробити це — рекурсивно змінити власність директорії node_modules та її вмісту на ваш обліковий запис користувача. Припустимо, що ваш обліковий запис користувача — ash-allen. Ви можете виконати наступну команду, щоб змінити власність:

sudo chown -R ash-allen ./node_modules

Команда chown змінює власність директорії node_modules та її вмісту на обліковий запис користувача ash-allen. Ми використовуємо прапор -R для команди chown, щоб рекурсивно змінити власність директорії та вмісту. Після виконання цієї команди ви повинні мати можливість виконувати команди Vite, не стикаючись із помилкою "vite: Доступ заборонено".

# Висновок

У цій статті ми розглянули чотири поширені помилки, з якими ви можете зіткнутися, використовуючи Vite з Laravel:

Ми розглянули причини цих помилок і можливі рішення для кожної з них. Сподіваюся, тепер ви краще розумієте, як усунути ці помилки та знову зосередитися на розробці свого Laravel-додатку з Vite.