質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Q&A

解決済

3回答

6553閲覧

Vue.jsでのレンダリングが遅い

math346613

総合スコア24

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

0グッド

2クリップ

投稿2018/07/31 09:08

編集2018/08/01 20:49

Vue.jsとElement UIを使ってフロントエンドを開発しています

Vue.jsとElement UIを使っているのですがページにアクセスした際に
Vue.jsとElement UIの機能が反映されるまでに少し時間差があります

<el-tag>Hoge</el-tag>

の場合はHogeという文字が現れてからタグの装飾がされる、、ような感じです

またv-cloakを指定しても

<el-tag>Hoge</el-tag>自体が周りより遅れて描写されます

これはVue.jsが描写している時間とも言えますが他のサイトであまり見るようなことはありません

これらの原因は何でしょうか?

初心者なのでお手柔らかにお願いします

環境

Google Chrome 67.0.3396.99
Vue.js 2.5.7
npm 5.6.0
Laravel 5.6.24
CentOS 6.8

###ソースコード例

html

1<!DOCTYPE html> 2<html> 3<head> 4 <meta charset="UTF-8"> 5 <title>Hello</title> 6 <meta name="csrf-token" content="{{ csrf_token() }}"> 7 <link rel="stylesheet" href="{{ asset('css/app.css') }}"/> 8 <script type="text/javascript"> 9 window.Laravel = window.Laravel || {}; 10 window.Laravel.csrfToken = "{{csrf_token()}}"; 11 </script> 12</head> 13<body> 14<div id="app"> 15 <nav class="navbar navbar-expand-md navbar-light bg-success navbar-laravel"> 16 <div class="container"> 17 <a class="navbar-brand text-white font-weight-bold" href="{{ url('/') }}"> 18 {{ config('app.name', 'Laravel') }} 19 </a> 20 <button class="navbar-toggler" type="button" data-toggle="collapse" 21 data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> 22 <span class="navbar-toggler-icon"></span> 23 </button> 24 <div class="collapse navbar-collapse" id="navbarSupportedContent"> 25 <!-- Left Side Of Navbar --> 26 <ul class="navbar-nav mr-auto"> 27 </ul> 28 <!-- Right Side Of Navbar --> 29 <ul class="navbar-nav ml-auto"> 30 <!-- Authentication Links --> 31 @guest 32 <li><a class="nav-link text-white" href="{{ route('login') }}">{{ __('Login') }}</a></li> 33 <li><a class="nav-link text-white" href="{{ route('register') }}">{{ __('Register') }}</a></li> 34 @else 35 <li class="nav-item dropdown"> 36 <a id="navbarDropdown" class="nav-link dropdown-toggle text-white" href="#" 37 role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre> 38 {{ Auth::user()->name }} <span class="caret"></span> 39 </a> 40 41 <div class="dropdown-menu" aria-labelledby="navbarDropdown"> 42 <a class="dropdown-item text-success" href="{{ route('logout') }}" 43 onclick="event.preventDefault();document.getElementById('logout-form').submit();"> 44 {{ __('Logout') }} 45 </a> 46 <form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;"> 47 @csrf 48 </form> 49 <a class="dropdown-item text-success" href="{{ url('/user/register') }}"> 50 {{ __('詳細設定') }} 51 </a> 52 </div> 53 </li> 54 @endguest 55 </ul> 56 </div> 57 </div> 58 </nav> 59 <main class="my-5"> 60 <el-tag>HogeHoge</el-tag> 61 </main> 62</div> 63@include('common.footer') 64<script src="{{ asset('js/app.js') }}"></script> 65</body> 66</html>

app.js

1 2/** 3 * First we will load all of this project's JavaScript dependencies which 4 * includes Vue and other libraries. It is a great starting point when 5 * building robust, powerful web applications using Vue and Laravel. 6 */ 7 8require('./bootstrap'); 9 10window.Vue = require('vue'); 11import ElementUI from 'element-ui' 12import 'element-ui/lib/theme-chalk/index.css' 13import locale from 'element-ui/lib/locale/lang/ja' 14 15Vue.use(ElementUI, { locale }) 16 17/** 18 * Next, we will create a fresh Vue application instance and attach it to 19 * the page. Then, you may begin adding components to this application 20 * or customize the JavaScript scaffolding to fit your unique needs. 21 */ 22 23 24const app = new Vue({ 25 el: '#app', 26}); 27 28

jsやjQueryでも同様の現象が起こりますが
これはそもそもWEBページで読み込み後にjsで描画するのならば起こる現象なのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oikashinoa

2018/07/31 10:16

ソースを書かないと回答つかないですよ。
math346613

2018/07/31 11:29

ご指摘ありがとうございます 上記の例でも描写が遅れます これはVue.jsやElement UIを使う上では仕方がないのでしょうか?
oikashinoa

2018/07/31 14:04

js/app.jsとかも可能なら上げたほうが良いですよ。回答者で再現できるように出来るだけソースは"可能な限り"上げるべきです。(見せちゃまずいところは隠して下さいね)…本件詳しくないのと出張で試す事も出来ないので、他の方も頼ってください。あとheroku使っているのでしょうか?その辺も書いたほうが良いかも。
math346613

2018/08/01 20:50

拙い質問にアドバイスありがとうございます 以後気を付けたいと思います
math346613

2018/08/01 20:50

ローカル開発環境で試しております
guest

回答3

0

###解決方法 v-cloakを使う

v-cloakはデータバインディング完了までこのディレクティブがつけられた要素の描画は遅れさせ
初期表示時の画面のちらつきを抑える効果がある

HTML

1<!DOCTYPE html> 2<html> 3<head> 4 <meta charset="UTF-8"> 5 <title>Hello</title> 6 <meta name="csrf-token" content="{{ csrf_token() }}"> 7 <link rel="stylesheet" href="{{ asset('css/app.css') }}"/> 8 <script type="text/javascript"> 9 window.Laravel = window.Laravel || {}; 10 window.Laravel.csrfToken = "{{csrf_token()}}"; 11 </script> 12</head> 13<body> 14<div id="app"> 15 <nav class="navbar navbar-expand-md navbar-light bg-success navbar-laravel"> 16 <div class="container"> 17 <a class="navbar-brand text-white font-weight-bold" href="{{ url('/') }}"> 18 {{ config('app.name', 'Laravel') }} 19 </a> 20 <button class="navbar-toggler" type="button" data-toggle="collapse" 21 data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> 22 <span class="navbar-toggler-icon"></span> 23 </button> 24 <div class="collapse navbar-collapse" id="navbarSupportedContent"> 25 <!-- Left Side Of Navbar --> 26 <ul class="navbar-nav mr-auto"> 27 </ul> 28 <!-- Right Side Of Navbar --> 29 <ul class="navbar-nav ml-auto"> 30 <!-- Authentication Links --> 31 @guest 32 <li><a class="nav-link text-white" href="{{ route('login') }}">{{ __('Login') }}</a></li> 33 <li><a class="nav-link text-white" href="{{ route('register') }}">{{ __('Register') }}</a></li> 34 @else 35 <li class="nav-item dropdown"> 36 <a id="navbarDropdown" class="nav-link dropdown-toggle text-white" href="#" 37 role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre> 38 {{ Auth::user()->name }} <span class="caret"></span> 39 </a> 40 41 <div class="dropdown-menu" aria-labelledby="navbarDropdown"> 42 <a class="dropdown-item text-success" href="{{ route('logout') }}" 43 onclick="event.preventDefault();document.getElementById('logout-form').submit();"> 44 {{ __('Logout') }} 45 </a> 46 <form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;"> 47 @csrf 48 </form> 49 <a class="dropdown-item text-success" href="{{ url('/user/register') }}"> 50 {{ __('詳細設定') }} 51 </a> 52 </div> 53 </li> 54 @endguest 55 </ul> 56 </div> 57 </div> 58 </nav> 59 <main class="my-5"> 60 <el-tag>HogeHoge</el-tag> 61 </main> 62</div> 63@include('common.footer') 64<script src="{{ asset('js/app.js') }}"></script> 65</body> 66</html>

のid="app"部分を

HTML

1<div id="app" v-cloak 2 3</div> 4

とすることでjsの処理をすべて終えてから画面に表示させる

###疑問1,なぜ描画が遅れるのか?

jsを使った初期描画ではこの動作がデフォルトとなる、これに対して多くの場合ローディング画面を表示するなどして対応している

###疑問2,asset('/js/app.js')を<head></head>内に記述する方法はなぜこの場合において有効ではないのか?

第一に<head></head>内に記述する方法では先にapp.jsを読み込むためにそもそもページロードが遅くなる,第二にapp.jsに操作したい要素を記述しておいてもapp.jsを先に読み込んでしまうとその要素が見つからないのでapp.jsの記述は無効となる なので多くの場合bodyタグの直前に記述される

###疑問3,v-showを使って描画中はローディング画面を魅せる方法はなぜこの場合無効であったか?
(この場合については的確に分かっていないので推測で書くことにする)
v-showを使うにはVue.jsの読み込みが必要だがそれがbodyタグの直前に存在するのでどうしても
body内を描画→app.jsの読み込み→v-showの利用となり、一瞬body内の要素がちらつくことになる(と推測)

結論としては

app.jsを含めた画面描画をする場合で他に方法を試してダメな場合は全体にv-cloakとする

投稿2018/08/02 13:29

math346613

総合スコア24

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

###解決方法 v-cloakを使う

v-cloakはデータバインディング完了までこのディレクティブがつけられた要素の描画は遅れさせ
初期表示時の画面のちらつきを抑える効果がある

これを

HTML

1<div id="app" v-cloak></div>

投稿2018/08/02 13:06

math346613

総合スコア24

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

html

1<script src="{{ asset('js/app.js') }}"></script>

この部分でvueのロードや準備をすると読みました(質問に追加していただいたふたつ目のソースがコレですよね?)

この位置に書かれているのは理由ありますか?
もっと早い段階に移動させてはいかがですか?(例えば window.Laravelなんとか の処理の前後)

投稿2018/08/01 21:38

oikashinoa

総合スコア2826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

math346613

2018/08/02 03:37

回答ありがとうございます その方法でやってみましたが今度は画面描画自体がされませんでした </body>の前に<script></script>を置く方法では画面描画がワンテンポ遅れる感じです Vueに限らずJQueryでも同様のことが見られます
math346613

2018/08/02 04:33

Resource Scheduling TIME Queueing ​ 5.04 ms Connection Start TIME Stalled ​ 1.51 ms DNS Lookup ​ 6 μs Initial connection ​ 9.56 ms Request/Response TIME Request sent ​ 0.36 ms Waiting (TTFB) ​ 5.87 ms Content Download ​ 146.57 ms Explanation 169.83 ms GoogleのデベロッパーツールのNetworkタブではapp.jsは上記のように動いていました
math346613

2018/08/02 11:58

ページ全体に対してv-cloakを使ったら出来ました!! ご親切にありがとうございました
oikashinoa

2018/08/02 12:18

おめでとうございます。可能なら、新たに解答欄に最終コードを書いていただけると私の勉強にもなるので嬉しいです。
math346613

2018/08/02 13:31

了解しました、今回いろいろと調べてきた中で自分が分かったことをまとめておきましたので一読ください お互い頑張りましょう!!
math346613

2018/08/02 13:31

本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問