Laravel VueJS: создание многостраничного приложения без использования одностраничного приложения (SPA) - PullRequest
1 голос
/ 11 декабря 2019

Я пытаюсь создать многостраничное приложение Laravel 5.5 + VueJs. Я не хочу использовать подход SPA (одностраничное приложение), чтобы он выглядел как многостраничное приложение.

Это относится к странице регистрации по URL-адресу /register. С помощью команды php artisan make:auth я получаю регистрацию связанных файлов. Сценарии:

В web.php, у меня есть:

Auth::routes();

В app.js, у меня есть:

window.Vue = require('vue');
const app = new Vue({
    el: '#app',
    components: {
        Register: require('./components/Register.vue')
    }
});

Мой layout.blade.php находится вПапка resources/views/ содержит следующее содержимое:

    <div id="app">

                <?php
                  var_dump($component);
                ?>
                @if (isset($component))
                    <component :is={{ $component }} >
                        @endif

                        @yield('content')

                        @if (isset($component))
                    </component>
                @endif
   </div>

Файл register.blade.php содержит содержимое:

@extends('layout', ['component' => 'Register'])

@section('content')

@endsection

Register.vue остается внутри resources/js/components/ и имеет следующее содержимое:

<template>
    <div class="container">
        <div class="row">
            <div class="col-md-8 col-md-offset-2">
                <div class="panel panel-default">
                    <div class="panel-heading">Example Component</div>

                    <div class="panel-body">
                        I'm an example component!
                    </div>
                </div>
            </div>
        </div>
    </div>
</template>

<script>
    export default {
        mounted() {
            console.log('Register Component mounted.')
        }
    }
</script>

Итак, мой предполагаемый рабочий процесс: сначала будет вызван register.blade.php, который наследует layout.blade.php и отправит в качестве данных компонент Register, который должен отображаться там.

Я сам также не знаю, как register.blade.php будет иметь компонент Register в качестве параметра в данных в строке:

@extends('layout', ['component' => 'Register'])

И при просмотре исходного кода страницы я даже не вижу включенного в страницу файла app.js.

Конечно, я запускаю команду npm run dev перед каждым тестированием страницы.

Вопрос 1: Что не так с подходом, описанным выше? Однако каким должен быть правильный путь?

РЕДАКТИРОВАТЬ:

Мой webpack.mix.js имеет:

let mix = require('laravel-mix');
    mix.js('resources/assets/js/app.js', 'public/js')
        .styles([

            'resources/assets/css/style.css'

        ], 'public/css/style.css')
    ;

mix.options({
    extractVueStyles: 'public/css/vue-style.css'
});

РЕДАКТИРОВАТЬ2: На странице не отображается содержимое компонента Register. Я забыл упомянуть об этом раньше.

EDIT3: Вопрос 2: Разве комбинация Laravel + VueJs не предназначена для MPA (многостраничного приложения) в истинном смысле этого слова

1 Ответ

0 голосов
/ 11 декабря 2019

Я не думаю, что очень легко дать ответ на ваш вопрос, поэтому я поделюсь своим опытом. Вначале я реализовывал Vue.js так же, как вы:

  • Многостраничное приложение
  • Каждая страница имеет свои компоненты
  • Каждый раз, когда пользовательпереходит на другую страницу, возможно, загружается новый файл js.

Это был полный сбой. Вначале я использовал один app.js файл, но загружал тонны бесполезных компонентов для одной формы ... Почему мне нужно загружать все приложение, когда мне нужно всего два или три компонента? Поэтому мне пришлось создать тонны файлов xxx-app.js и нарушить принцип СУХОГО. Это было не самое лучшее ... Но это сработало и было легко реализовать.

ПОБОЧНОЕ ПРИМЕЧАНИЕ : я не использовал какой-либо чанкинг файлов или другие системы, которые могли удалитьтакого рода проблемы. Я был в самом начале с разработкой VueJS. Возможно, в то время я даже не знал, что это возможно.

Структура была примерно такой:

page1.blade.php

@extends('my.layout')

@push('scripts')
    <script src="asset('page1-app.js')"></script>
@endpush

@section('content')
    <page1-component attr1="{{ $attr1 }}" [...]></page1-component>
@endsection

Как видите, структура довольно проста:

  • Расширение требуемой компоновки для загрузки CSS и необходимых дополнительных сценариев
  • Вставка в стек scripts Vueвам нужен экземпляр
  • В разделе контента вызовите нужный вам компонент

Но проблемы возникли в части JavaScript ... Я использовал 1/3 возможностей современногоразработка приложений javascript. Каждый день появлялась новая проблема ... Сначала JQuery был бесполезен ... Затем техническая часть SEO была трудна для обработки ... Затем логика магазина Vuex была реплицирована и бесполезна, когда пользователь перезагружал страницу ... В оченьВскоре я понял, что этот подход был совершенно неверным ...

Ну, для приложения, над которым я работал, по крайней мере. Так что ИМХО и как во многих случаях ответ на ваш вопрос

Что не так с подходом, изложенным выше? Однако каким должен быть правильный путь?

- это Это зависит .

Если у вас небольшое приложение, простое в обслуживании и без сложного рабочего процесса, ваше решениеработает ... Вы просто должны помнить, что:

  1. Если вы включите в каждую страницу свой файл app.js, но вам потребуется только 1 или 2 компонента, он может стать немного тяжелым.
  2. Существует высокий риск избыточности.
  3. Состояние начальных компонентов зависит от атрибутов бэкенда, заданных для блейд-представления ... Если что-то не так, все приложение выходит из строя.

Если вы сталкиваетесь с этими проблемами, подумайте о переходе к полной логике SPA ... Легче поддерживать, вам не нужно каждый день придумывать обходной путь и так далее.

Если ваше приложение является "корпоративным" решением ... Избегайте смешивать Laravel и Vue в одной кодовой базе ... Разделите все и обработайте бэкэнд и внешний интерфейс как две совершенно разные сущности.

...