请教关于 Laravel Blade 中 Vue 的几种使用方式

这里不讨论单页应用,因为我觉得对SEO不利(个人愚见)。

第一种:使用一个Vue Component,这是官方文档中的示例用法,运行成功。但是我觉得用一整个Component不太灵活,因为有些部件有按需变换。

resources/views/home.blade.php

<!doctype html>
<html lang="zh-CN">
<head>
    ...
   <link href="{{ asset('css/app.css') }}" rel="stylesheet">
    ...
</head>
<body>
<!-- 运行成功 -->
<div id="app">
    <example-component></example-component>
</div>
<script src="{{ asset('js/app.js') }}" defer></script>
</body>
</html>

第二种:使用多个Vue Components,曾Google到一个日本网友是这么用的,也就是将一个Component拆分为多个。

resources/views/home.blade.php

<!doctype html>
<html lang="zh-CN">
<head>
    ...
   <link href="{{ asset('css/app.css') }}" rel="stylesheet">
    ...
</head>
<body>
<!-- 也可以运行成功 -->
<div id="a">
    <a-component></a-component>
</div>
<div id="b">
    <b-component></b-component>
</div>
<div id="c">
    <c-component></c-component>
</div>
<script src="{{ asset('js/app.js') }}" defer></script>
</body>
</html>

第三种:于是我就想,这样不是很麻烦么?又要组织管理Blade,又要组织管理Component,两头转悠,难道就不能用传统方式,直接把Vue代码写在Blade代码里管理?然而,它果然就报错了:Uncaught ReferenceError: Vue is not defined

resources/views/home.blade.php

<!doctype html>
<html lang="zh-CN">
<head>
    ...
   <link href="{{ asset('css/app.css') }}" rel="stylesheet">
    ...
</head>
<body>
<!-- 报错:Uncaught ReferenceError: Vue is not defined -->
<div id="app">
    <v-btn>Hello World</v-btn>
</div>
<script src="{{ asset('js/app.js') }}" defer></script>
<script>
new Vue({
    el: '#app',
});
</script>
</body>
</html>

不应该啊,app.js里已经引用了Vue啊,为什么会not defined呢?

resources/js/app.js

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

因为刚开始用,还闹不明白,百度和Google了好几天,Stackoverflow也去提问了,依旧不知所以然,因此特来求教:

  1. 为什么第三种方式会出现Vue is not defined,应该如何解决?
  2. 是不是第三种方式有什么弊端所以不被推荐?因为我总感觉它更方便组织管理代码。(也许是我的错觉)
  3. 有什么更好的方式,或是最佳实践?

望各位不吝赐教,多谢!

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

我也不太懂,不过这是我的想法。

我觉得是 Blade 支持,所以你才可以在 Blade 代码里面那么写, 经过 Laravel 注册的,所以能用,毕竟编译 Blade 是 Laravel,不是 Vue。Laravel 充当中间媒介编译,这样才不会冲突,效率也好,当然像你说的那样麻烦些。不过很少这么用,都是在 JavaScript 文件里写 Vue。

Laravel 编译 Blade 时,顺便用 Babel(注意不是 Blade) 编译了你的 Vue 组件。

前后分离,也就是纯 Vue 的时候,当然也是编译你的 *.vue 代码。

我一开始是用 Laravel,后面

  1. Laravel(Blade)
  2. Laravel(React)
  3. Laravel + React,前后分离
  4. Laravel + React + Next.js

回帖前,还在写 Next.js 呢

5年前 评论
hetty (楼主) 5年前
小李世界 (作者) 5年前
hetty (楼主) 5年前
讨论数量: 2

关于单页应用seo的方案有很多种,例如ssr,nginx拦截转发等。googlebot(Evergreen Googlebot)已经支持抓取spa页面,百度也有有一个bot叫baiduspider render,具体不太了解。至于你这个报错,可能是script标签defer属性造成的。

5年前 评论
hetty (楼主) 5年前

我也不太懂,不过这是我的想法。

我觉得是 Blade 支持,所以你才可以在 Blade 代码里面那么写, 经过 Laravel 注册的,所以能用,毕竟编译 Blade 是 Laravel,不是 Vue。Laravel 充当中间媒介编译,这样才不会冲突,效率也好,当然像你说的那样麻烦些。不过很少这么用,都是在 JavaScript 文件里写 Vue。

Laravel 编译 Blade 时,顺便用 Babel(注意不是 Blade) 编译了你的 Vue 组件。

前后分离,也就是纯 Vue 的时候,当然也是编译你的 *.vue 代码。

我一开始是用 Laravel,后面

  1. Laravel(Blade)
  2. Laravel(React)
  3. Laravel + React,前后分离
  4. Laravel + React + Next.js

回帖前,还在写 Next.js 呢

5年前 评论
hetty (楼主) 5年前
小李世界 (作者) 5年前
hetty (楼主) 5年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!