次のVue.jsコラムでは、Vueの遅延読み込みにプログレスバーを追加する方法を紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。
通常、Vue.js を使用してシングル ページ アプリケーション (SPA) を作成する場合、ページが読み込まれるときに、必要なすべてのリソース (JavaScript など)および CSS ファイル)が一緒にロードされます。これにより、大きなファイルを操作する際のユーザー エクスペリエンスが低下する可能性があります。
Webpack を使用すると、import
キーワードの代わりに import()
関数を使用して、Vue.js でページをオンデマンドで読み込むことができます。
Vue.js で SPA が動作する一般的な方法は、ユーザーがページを更新せずにアプリケーションを使用できるように、すべての関数とリソースをパッケージ化して一緒に配信することです。オンデマンドでページを読み込むようにアプリケーションを明示的に設計していない場合、すべてのページが一度に読み込まれるか、不必要なプリロードのために大量のメモリが事前に使用されることになります。
これは、多くのページを持つ大規模な SPA にとって非常に有害であり、ローエンドの携帯電話や低いネットワーク速度を使用すると、ユーザー エクスペリエンスが低下します。オンデマンド読み込みを使用すると、ユーザーは現在必要のないリソースをダウンロードする必要がなくなります。
Vue.js は、動的モジュールの読み込みインジケーター関連のコントロールを提供しません。プリフェッチやプリロードを行ったとしても、ロードプロセスをユーザーに知らせる対応するスペースがないため、プログレスバーを追加してユーザーエクスペリエンスを向上させる必要があります。
まず、進行状況バーが Vue Router と通信する方法が必要です。 イベントバスモードの方が適しています。
イベント バスは、Vue インスタンスのシングルトンです。すべての Vue インスタンスには $on
と $emit
を使用するイベント システムがあるため、これを使用してアプリケーション内の任意の場所にイベントを配信できます。
まず、components
ディレクトリに新しいファイル eventHub.js
を作成します:
import Vue from 'vue' export default new Vue()
次に、プリフェッチとプリロードを無効にするように Webpack を設定します。これにより、次のことが可能になります。これを機能ごとに行うことも、グローバルに無効にすることもできます。ルート フォルダーに vue.config.js
ファイルを作成し、関連する設定を追加してプリフェッチとプリロードを無効にします。
module.exports = { chainWebpack: (config) => { // 禁用预取和预加载 config.plugins.delete('prefetch') config.plugins.delete('preload') }, }
Use npx
Vue ルーターをインストールして使用します。
$ npx vue add router
router/index.js
にあるルーター ファイルを編集し、ルートを更新して使用できるようにします。 import()
import
ステートメントの代わりの関数:
次のデフォルト設定:
import About from '../views/About.vue' { path: '/about', name: 'About', component: About },
これを次のように変更します:
{ path: '/about', name: 'About', component: () => import('../views/About.vue') },
必要に応じて、オンデマンドで何かをロードすることを選択する 一部のページに対してグローバルにプリフェッチとプリロードを無効にする代わりに、特別な Webpack アノテーションを使用し、vue.config.js
で Webpack を構成しないようにすることができます:
import( /* webpackPrefetch: true */ /* webpackPreload: true */ '../views/About.vue' )
import()
と import
の主な違いは、import()
によってロードされる ES モジュールは実行時にロードされ、ES モジュールは import
によってロードされることです。 ES モジュールはコンパイル時にロードされます。これは、import()
を使用してモジュールのロードを遅らせ、必要な場合にのみモジュールをロードできることを意味します。
ページの読み込み時間 (または読み込み完了) を正確に見積もることができないため、実際進行状況バーを作成することはできません。ページがどれだけ読み込まれたかを確認する方法もありません。ただし、進行状況バーを作成して、ページの読み込み時に完了させることができます。
実際の進捗状況を反映することはできないため、描かれている進捗状況は単なるランダムなジャンプです。
最初に lodash.random
をインストールします。このパッケージは、プログレス バーの生成プロセス中に乱数を生成するために使用されます。
$ npm i lodash.random
次に、Vue を作成します。コンポーネントcomponents/ProgressBar.vue
:
<template> <p> </p> <p> </p> <p></p> <p></p> </template>
次に、スクリプトをコンポーネントに追加します。まず、スクリプト内で random
と $eventHub
をインポートします。これは後で使用します。
<script> import random from 'lodash.random' import $eventHub from '../components/eventHub' </script>
インポート後、スクリプト内で後で使用する変数をいくつか定義します。
// 假设加载将在此时间内完成。 const defaultDuration = 8000 // 更新频率 const defaultInterval = 1000 // 取值范围 0 - 1. 每个时间间隔进度增长多少 const variation = 0.5 // 0 - 100. 进度条应该从多少开始。 const startingPoint = 0 // 限制进度条到达加载完成之前的距离 const endingPoint = 90
次に、コンポーネントの非同期読み込みを実装するロジックをコーディングします。
export default { name: 'ProgressBar', data: () => ({ isLoading: true, // 加载完成后,开始逐渐消失 isVisible: false, // 完成动画后,设置 display: none progress: startingPoint, timeoutId: undefined, }), mounted() { $eventHub.$on('asyncComponentLoading', this.start) $eventHub.$on('asyncComponentLoaded', this.stop) }, methods: { start() { this.isLoading = true this.isVisible = true this.progress = startingPoint this.loop() }, loop() { if (this.timeoutId) { clearTimeout(this.timeoutId) } if (this.progress >= endingPoint) { return } const size = (endingPoint - startingPoint) / (defaultDuration / defaultInterval) const p = Math.round(this.progress + random(size * (1 - variation), size * (1 + variation))) this.progress = Math.min(p, endingPoint) this.timeoutId = setTimeout( this.loop, random(defaultInterval * (1 - variation), defaultInterval * (1 + variation)) ) }, stop() { this.isLoading = false this.progress = 100 clearTimeout(this.timeoutId) const self = this setTimeout(() => { if (!self.isLoading) { self.isVisible = false } }, 200) }, }, }
mounted()
関数で、イベント バスを使用して非同期コンポーネントの読み込みをリッスンします。 。まだ読み込まれていないページに移動したことがルートによって通知されると、読み込みアニメーションが開始されます。
最後にスタイルを追加します:
<style> .loading-container { font-size: 0; position: fixed; top: 0; left: 0; height: 5px; width: 100%; opacity: 0; display: none; z-index: 100; transition: opacity 200; } .loading-container.visible { display: block; } .loading-container.loading { opacity: 1; } .loader { background: #23d6d6; display: inline-block; height: 100%; width: 50%; overflow: hidden; border-radius: 0 0 5px 0; transition: 200 width ease-out; } .loader > .light { float: right; height: 100%; width: 20%; background-image: linear-gradient(to right, #23d6d6, #29ffff, #23d6d6); animation: loading-animation 2s ease-in infinite; } .glow { display: inline-block; height: 100%; width: 30px; margin-left: -30px; border-radius: 0 0 5px 0; box-shadow: 0 0 10px #23d6d6; } @keyframes loading-animation { 0% { margin-right: 100%; } 50% { margin-right: 100%; } 100% { margin-right: -10%; } } </style>
最後に、ProgressBar
を App.vue
またはレイアウト コンポーネント (同じ場所にある場合) に追加します。ルート ビュー 同じコンポーネント内で、アプリケーションのライフ サイクル全体を通じて利用できます:
<template> <p> <progress-bar></progress-bar> <router-view></router-view> <!--- 你的其它组件 --> </p> </template> <script> import ProgressBar from './components/ProgressBar.vue' export default { components: { ProgressBar }, } </script>
その後、ページの上部にスムーズな進行状況バーが表示されます:
NowProgressBar
は、非同期コンポーネント読み込みイベントをイベント バスでリッスンしています。特定のリソースがこの方法で読み込まれると、アニメーションがトリガーされる必要があります。次に、ルート ガードをルートに追加して、次のイベントを受信します:
import $eventHub from '../components/eventHub' router.beforeEach((to, from, next) => { if (typeof to.matched[0]?.components.default === 'function') { $eventHub.$emit('asyncComponentLoading', to) // 启动进度条 } next() }) router.beforeResolve((to, from, next) => { $eventHub.$emit('asyncComponentLoaded') // 停止进度条 next() })
为了检测页面是否被延迟加载了,需要检查组件是不是被定义为动态导入的,也就是应该为 component:() => import('...')
而不是component:MyComponent
。
这是通过 typeof to.matched[0]?.components.default === 'function'
完成的。带有 import
语句的组件不会被归为函数。
在本文中,我们禁用了在 Vue 应用中的预取和预加载功能,并创建了一个进度条组件,该组件可显示以模拟加载页面时的实际进度。
原文:https://stackabuse.com/lazy-loading-routes-with-vue-router/
作者:Stack Abuse
相关推荐:
更多编程相关知识,请访问:编程入门!!
以上がプログレスバー付きの Vue 遅延読み込みを実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。