2016-09-26 8 views
15

W projektach laravel przed 5.3 Mam wykorzystywanych Vue.js pomocą znacznika script tak:Korzystanie Vue.js w laravel 5,3

<script type="text/javascript" src="../js/vue.js"></script> 

Chciałbym następnie utworzyć instancję Vue specyficzny dla tej strony jak ta :

<script> 
    new Vue({ 
     el: '#app', 
     data: { 
     message: 'Hello Vue.js!' 
     } 
    }); 
</script> 

, a następnie powiąż go z odpowiednim identyfikatorem div # w moim kodzie HTML.

Teraz, w wersji Laravel 5.3 Vue.js jest dostępny w pakiecie i jestem w pełni świadomy, że mogę używać komponentów opisanych w dokumentach za pomocą gulp/elixir, jednak moje pytanie brzmi: , jeśli chcę utworzyć Vue.js przykład jak już wspomniałem, tj. gdzie tworzę instancję Vue.js ściśle dla danej strony (nie komponentu) jak to zrobić?

Czy skonfigurować go tak jak kiedyś, importując bibliotekę vue.js w tagu skryptu lub czy mogę użyć wygenerowanego app.js?

Czy nie powinienem robić tego w ten sposób, czy powinienem tworzyć komponenty do wszystkiego?

Dla mnie nie ma sensu komponowanie czegoś, z czego korzystam tylko raz - myślałem, że celem komponentów jest to, że są one wielokrotnego użytku - można go używać w więcej niż jednym miejscu. Jak wspomniano w dokumentach Vue.js:

Komponenty są jedną z najpotężniejszych funkcji Vue.js. Pomagają ci w rozszerzeniu podstawowych elementów HTML w celu ponownego kodowania kodu wielokrotnego użytku.

Każda rada byłaby doceniona, dziękuję!

+0

Warto wspomnieć, że 'php rzemieślnik marka: auth' szafuje układ i widoki, które sprawiają, że korzystanie z pakietu" app.js "i" app.scss "... –

Odpowiedz

7

Jeśli chcesz włączyć vuejs do app.js korzystających łyk następnie można to zrobić z eliksiru:

Po pierwsze, trzeba laravel-eliksir-browserify oficjalny z KMP:

npm zainstalować laravel-eliksir-browserify oficjalny

Następnie umieść fol ryk w package.json:

"browserify": { 
    "transform": [ 
     "vueify", 
     "babelify" 
    ] 
    } 

Twoje Zasoby/aktywa/js/app.js plik będzie wtedy wystarczy:

require('./bootstrap'); 

bootstrap.js plik powinien być w folder "resources/assets/js". Nie mogę sobie przypomnieć, czy to ma zainstalowany z paszportem w mojej aplikacji, więc jeśli nie masz to wtedy laravel umieszczono następujący kod dla „bootstrap.js”:

window._ = require('lodash'); 

/** 
* We'll load jQuery and the Bootstrap jQuery plugin which provides support 
* for JavaScript based Bootstrap features such as modals and tabs. This 
* code may be modified to fit the specific needs of your application. 
*/ 

window.$ = window.jQuery = require('jquery'); 
require('bootstrap-sass'); 

/** 
* Vue is a modern JavaScript library for building interactive web interfaces 
* using reactive data binding and reusable components. Vue's API is clean 
* and simple, leaving you to focus on building your next great project. 
*/ 

window.Vue = require('vue'); 
require('vue-resource'); 

/** 
* We'll register a HTTP interceptor to attach the "CSRF" header to each of 
* the outgoing requests issued by this application. The CSRF middleware 
* included with Laravel will automatically verify the header's value. 
*/ 

Vue.http.interceptors.push((request, next) => { 
    request.headers['X-CSRF-TOKEN'] = Laravel.csrfToken; 

    next(); 
}); 

/** 
* Echo exposes an expressive API for subscribing to channels and listening 
* for events that are broadcast by Laravel. Echo and event broadcasting 
* allows your team to easily build robust real-time web applications. 
*/ 

// import Echo from "laravel-echo" 

// window.Echo = new Echo({ 
//  broadcaster: 'pusher', 
//  key: 'your-pusher-key' 
// }); 

Teraz w gulpfile.js można użyć:

elixir(function(mix) { 
    mix.browserify('app.js'); 
}); 

I w HTML trzeba:

... 
<div id="app"> 
    @{{message}} 
</div> 
... 

<script type="text/javascript"> 
    new Vue({ 
    el: '#app', 
    data: { 
     message: 'Hello Vue.js!' 
    } 
    }); 
</script> 

Teraz wystarczy uruchomić łyk

Jeśli nie używasz eliksir to powinno być jest w stanie zrobić coś podobnego z pakietami przeglądarki internetowej z przeglądarką internetową: http://pl.wikipedia.org/wiki/Komentarze_Wyszukiwania:lub Pakiety sieci Web: m npm.

Edit

Aby odpowiedzieć na to pytanie zaktualizowane, można Korzystania Oczywiście vue.js na jednej stronie. Osobiście używam nokautu do takich rzeczy (używam vue, ponieważ używa go paszport laravel), ale pod względem architektonicznym są takie same - są to biblioteki MVVM.

Punkt w MVVM polega na powiązaniu widoku z podstawowym modelem danych, więc gdy jeden aktualizuje drugi jest automatycznie aktualizowany (tj. Aktualizacje w domie automatycznie aktualizują model i wiceser). Komponenty Vue to prosty sposób na ponowne użycie bloków kodu, co jest naprawdę dobre do tworzenia widgetów lub złożonych komponentów, ale jeśli chcesz po prostu wyświetlać dane z modelu widoku na swojej stronie, zazwyczaj nie musisz tworzyć składnik do tego.

Co do generowania app.js, zależy to całkowicie od projektu. Nie można powiązać więcej niż jednego modelu widoku z widokiem, więc jeśli planujesz używać wielu modeli widoku w projekcie, musisz znaleźć sposób na dołączenie określonego modelu widoku dla swojej strony. Aby to osiągnąć, prawdopodobnie usunę model widoku z app.js i utrzymam tam bootstrap oraz zarejestrowane komponenty, a następnie utworzę osobne modele widoku, które będą musiały być zawarte na każdej stronie.

+0

Witam @craig_h dzięki za odpowiedź, I ' ve zaktualizowałem moje pytanie, aby to, o co proszę, było nieco jaśniejsze. – haakym

+0

@ craig-h dziękuję za edycję, więc jeśli dobrze cię zrozumiałem, mówisz o używaniu app.js, gdy potrzebuję komponentów i jeśli potrzebuję modelu widoku dla pojedynczej strony, powinienem upuścić ' 'na stronę i kontynuuj, tak jak to robiłem, czy to prawda? – haakym

+0

Jeśli użyjesz funkcji przeglądania jako opisanej, nie będziesz potrzebował tagu skryptu. Vue będzie dostępny do użycia tak jak zawsze, ponieważ zostanie skompilowany do pliku app.js. – Trip

22

Zostawię Laravel tak, jak to jest, z Webpakiem. Daje to możliwość dodania dobrej konfiguracji Webpack. Plus gulp watch działa teraz w maszynie wirtualnej Homestead Vagrant, ponieważ będzie używać Webpacka do oglądania zmian w plikach. A także sprawdź komponenty async.

Teraz na swoje pytanie odnośnie oddzielnych przypadkach Vue na stronie ... Zacznijmy app.js ...

App.js
Po pierwszym zainstalowaniu laravel 5.3, można znaleźć app.js punkt wejścia. Załóżmy wykomentuj główną instancję Vue:

resources/aktywa/js/app.js

/** 
* First we will load all of this project's JavaScript dependencies which 
* include Vue and Vue Resource. This gives a great starting point for 
* building robust, powerful web applications using Vue and Laravel. 
*/ 

require('./bootstrap'); 

/** 
* Next, we will create a fresh Vue application instance and attach it to 
* the page. Then, you may begin adding components to this application 
* or customize the JavaScript scaffolding to fit your unique needs. 
*/ 

Vue.component('example', require('./components/Example.vue')); 

// Let's comment this out, each page will be its own main Vue instance. 
// 
// const app = new Vue({ 
//  el: '#app' 
// }); 

Plik app.js nadal pozostaje miejsce dla globalnego rzeczy, więc dostępne są tu elementy dodane (takie jako składnik example widziany powyżej) do dowolnego skryptu strony, który go zawiera.

Zapraszamy Script Strona
Teraz utworzyć skrypt, który reprezentuje strony powitalnej:

resources/assets/js/pages/powitanie.js

require('../app') 
import Greeting from '../components/Greeting.vue' 

var app = new Vue({ 
    name: 'App', 
    el: '#app', 
    components: { Greeting }, 
    data: { 
     test: 'This is from the welcome page component' 
    } 
}) 

Blog Script Strona
Teraz stwórzmy inny skrypt, który reprezentuje Blog Strona:

Zasoby/aktywa/js/pages/blog.js

require('../app') 
import Greeting from '../components/Greeting.vue' 

var app = new Vue({ 
    name: 'App', 
    el: '#app', 
    components: { Greeting }, 
    data: { 
     test: 'This is from the blog page component' 
    } 
}) 

Pozdrowienie Komponent
Zasoby/aktywa/js/komponenty/Greeting.vue

<template> 
    <div class="greeting"> 
     {{ message }} 
    </div> 
</template> 

<script> 
    export default { 
     name: 'Greeting', 
     data:() => { 
      return { 
       message: 'This is greeting component' 
      } 
     } 
    } 
</script> 

Witamy Blade Zobacz
Załóżmy zaktualizować powitalny widok ostrza, że ​​statki z laravel:

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <meta charset="utf-8"> 
     <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
     <meta name="viewport" content="width=device-width, initial-scale=1"> 

     <title>Laravel</title> 
    </head> 
    <body> 
     <div id="app"> 
      <example></example> 
      @{{ pageMessage }} 
      <greeting></greeting> 
     </div> 

     <script src="/js/welcome.js"></script> 
    </body> 
</html> 

Pomysł byłoby to samo dla widoku blogu.

Elixir
Teraz przynieść to wszystko razem w pliku haustem używając eliksiru zdolność do scalania opcje konfiguracyjne WebPACK z własną (czytaj więcej na ten temat here):

gulpfile.js

const elixir = require('laravel-elixir'); 

require('laravel-elixir-vue-2'); 

/* 
|-------------------------------------------------------------------------- 
| Elixir Asset Management 
|-------------------------------------------------------------------------- 
| 
| Elixir provides a clean, fluent API for defining some basic Gulp tasks 
| for your Laravel application. By default, we are compiling the Sass 
| file for our application, as well as publishing vendor resources. 
| 
*/ 

elixir(mix => { 
    var config = elixir.webpack.mergeConfig({ 
      entry: { 
      welcome: './resources/assets/js/pages/welcome.js', 
      blog: './resources/assets/js/pages/blog.js' 
      }, 
      output: { 
      filename: '[name].js' // Template based on keys in entry above 
      } 
     }); 

    mix.sass('app.scss') 
     .webpack('app.js', null, null, null, config); 
}); 

Uruchom gulp lub gulp watch, a zobaczysz zarówno welcome.js i blog.js opublikowane.

Myśli
Jestem obecnie dzieje trasę SPA, jeśli chodzi o „aplikacji internetowych” i tylko przy użyciu API laravel jako backend (lub jakiegokolwiek innego języka/ram). Widziałem kilka przykładów, gdzie Vue SPA powstało w Laravel, ale naprawdę uważam, że powinno to być całkowicie oddzielne repo/projekt, niezależnie od zaplecza. W SPA nie ma szablonowych widoków Laravel/PHP, więc buduj SPA oddzielnie. BTW, SPA miałoby komponenty "strony" (które są zwykle wywoływane przez VueRoutera i oczywiście składałyby się z większej ilości komponentów zagnieżdżonych ... zobacz mój przykładowy link do projektu poniżej).

Jednak dla "strony internetowej" uważam, że Laravel jest nadal dobrym wyborem do serwowania widoków z ostrzami i nie ma potrzeby korzystania z tego SPA. Możesz zrobić to, co opisałem w tej odpowiedzi. Możesz także podłączyć swoją witrynę do swojej aplikacji internetowej. Na swojej stronie internetowej masz link "login", który przeniesie użytkownika z witryny do SPA Webapp, aby się zalogować. Twoja strona internetowa jest przyjazna dla SEO (chociaż istnieje dobry dowód na to, że Google widzi treści na stronach javascript SPA).

Aby zapoznać się z podejściem SPA, podałem przykład w Vue 2.0 tutaj: https://github.com/prograhammer/example-vue-project (działa świetnie, ale wciąż trwa).

Edit:

Możesz również wyewidencjonowania Commons Chunk Plugin. W ten sposób przeglądarki mogą osobno buforować niektóre współdzielone zależności modułów. Webpack automatycznie może wyciągnąć współdzielone importowane zależności i umieścić je w osobnym pliku.Tak więc masz jedną stronę: common.js (udostępnione) i welcome.js. Następnie na innej stronie znowu masz common.js i blog.js, a przeglądarka może ponownie użyć buforowanej common.js.

+4

@haakym zaznacz to jako poprawną odpowiedź. Po długich poszukiwaniach bez wytchnienia dla poprawnego wyjaśnienia, jak sobie z tym poradzić w 5.3, jest to naprawdę jedyne prawdziwe wyjaśnienie, jakie widziałem. – jacurtis