目次
はじめに
なぜオンデマンドでロードするのでしょうか?
プロジェクトの準備
ルートとページを追加します
進行状況バーの実装
遅延読み込み用のプログレス バーをトリガーする
总结
ホームページ ウェブフロントエンド Vue.js プログレスバー付きの Vue 遅延読み込みを実装する

プログレスバー付きの Vue 遅延読み込みを実装する

Oct 28, 2020 pm 05:36 PM
javascript vue.js フロントエンド

次のVue.jsコラムでは、Vueの遅延読み込みにプログレスバーを追加する方法を紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。

プログレスバー付きの 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 &#39;lodash.random&#39;
import $eventHub from &#39;../components/eventHub&#39;
</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>
ログイン後にコピー

最後に、ProgressBarApp.vue またはレイアウト コンポーネント (同じ場所にある場合) に追加します。ルート ビュー 同じコンポーネント内で、アプリケーションのライフ サイクル全体を通じて利用できます:

<template>
    <p>
        <progress-bar></progress-bar>
        <router-view></router-view>
        <!--- 你的其它组件 -->
    </p>
</template>

<script>
import ProgressBar from &#39;./components/ProgressBar.vue&#39;
export default {
       components: { ProgressBar },
}
</script>
ログイン後にコピー

その後、ページの上部にスムーズな進行状況バーが表示されます:

プログレスバー付きの Vue 遅延読み込みを実装する

遅延読み込み用のプログレス バーをトリガーする

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

相关推荐:

2020年前端vue面试题大汇总(附答案)

vue教程推荐:2020最新的5个vue.js视频教程精选

更多编程相关知识,请访问:编程入门!!

以上がプログレスバー付きの Vue 遅延読み込みを実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP と Vue: フロントエンド開発ツールの完璧な組み合わせ PHP と Vue: フロントエンド開発ツールの完璧な組み合わせ Mar 16, 2024 pm 12:09 PM

PHP と Vue: フロントエンド開発ツールの完璧な組み合わせ 今日のインターネットの急速な発展の時代において、フロントエンド開発はますます重要になっています。 Web サイトやアプリケーションのエクスペリエンスに対するユーザーの要求がますます高まっているため、フロントエンド開発者は、より効率的で柔軟なツールを使用して、応答性の高いインタラクティブなインターフェイスを作成する必要があります。フロントエンド開発の分野における 2 つの重要なテクノロジーである PHP と Vue.js は、組み合わせることで完璧なツールと見なされます。この記事では、PHP と Vue の組み合わせと、読者がこれら 2 つをよりよく理解し、適用できるようにするための詳細なコード例について説明します。

フロントエンドの面接官からよく聞かれる質問 フロントエンドの面接官からよく聞かれる質問 Mar 19, 2024 pm 02:24 PM

フロントエンド開発のインタビューでは、HTML/CSS の基本、JavaScript の基本、フレームワークとライブラリ、プロジェクトの経験、アルゴリズムとデータ構造、パフォーマンスの最適化、クロスドメイン リクエスト、フロントエンド エンジニアリング、デザインパターン、新しいテクノロジーとトレンド。面接官の質問は、候補者の技術スキル、プロジェクトの経験、業界のトレンドの理解を評価するように設計されています。したがって、候補者はこれらの分野で自分の能力と専門知識を証明するために十分な準備をしておく必要があります。

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

Django はフロントエンドですか、バックエンドですか?それをチェックしてください! Django はフロントエンドですか、バックエンドですか?それをチェックしてください! Jan 19, 2024 am 08:37 AM

Django は、迅速な開発とクリーンなメソッドを重視した Python で書かれた Web アプリケーション フレームワークです。 Django は Web フレームワークですが、Django がフロントエンドなのかバックエンドなのかという質問に答えるには、フロントエンドとバックエンドの概念を深く理解する必要があります。フロントエンドはユーザーが直接対話するインターフェイスを指し、バックエンドはサーバー側プログラムを指し、HTTP プロトコルを通じてデータと対話します。フロントエンドとバックエンドが分離されている場合、フロントエンドとバックエンドのプログラムをそれぞれ独立して開発して、ビジネス ロジックとインタラクティブ効果、およびデータ交換を実装できます。

Go 言語のフロントエンド テクノロジーの探求: フロントエンド開発の新しいビジョン Go 言語のフロントエンド テクノロジーの探求: フロントエンド開発の新しいビジョン Mar 28, 2024 pm 01:06 PM

Go 言語は、高速で効率的なプログラミング言語として、バックエンド開発の分野で広く普及しています。ただし、Go 言語をフロントエンド開発と結びつける人はほとんどいません。実際、フロントエンド開発に Go 言語を使用すると、効率が向上するだけでなく、開発者に新たな視野をもたらすことができます。この記事では、フロントエンド開発に Go 言語を使用する可能性を探り、読者がこの分野をよりよく理解できるように具体的なコード例を示します。従来のフロントエンド開発では、ユーザー インターフェイスの構築に JavaScript、HTML、CSS がよく使用されます。

Golang とフロントエンド テクノロジーの組み合わせ: Golang がフロントエンド分野でどのような役割を果たすかを探る Golang とフロントエンド テクノロジーの組み合わせ: Golang がフロントエンド分野でどのような役割を果たすかを探る Mar 19, 2024 pm 06:15 PM

Golang とフロントエンド テクノロジーの組み合わせ: Golang がフロントエンド分野でどのような役割を果たしているかを調べるには、具体的なコード例が必要です。インターネットとモバイル アプリケーションの急速な発展に伴い、フロントエンド テクノロジーの重要性がますます高まっています。この分野では、強力なバックエンド プログラミング言語としての Golang も重要な役割を果たします。この記事では、Golang がどのようにフロントエンド テクノロジーと組み合わされるかを検討し、具体的なコード例を通じてフロントエンド分野での可能性を実証します。フロントエンド分野における Golang の役割は、効率的で簡潔かつ学びやすいものとしてです。

JavaScript で HTTP ステータス コードを簡単に取得する方法 JavaScript で HTTP ステータス コードを簡単に取得する方法 Jan 05, 2024 pm 01:37 PM

JavaScript で HTTP ステータス コードを取得する方法の紹介: フロントエンド開発では、バックエンド インターフェイスとの対話を処理する必要があることが多く、HTTP ステータス コードはその非常に重要な部分です。 HTTP ステータス コードを理解して取得すると、インターフェイスから返されたデータをより適切に処理できるようになります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法と、具体的なコード例を紹介します。 1. HTTP ステータス コードとは何ですか? HTTP ステータス コードとは、ブラウザがサーバーへのリクエストを開始したときに、サービスが

Django: フロントエンド開発とバックエンド開発の両方を処理できる魔法のフレームワークです。 Django: フロントエンド開発とバックエンド開発の両方を処理できる魔法のフレームワークです。 Jan 19, 2024 am 08:52 AM

Django: フロントエンド開発とバックエンド開発の両方を処理できる魔法のフレームワークです。 Django は、効率的でスケーラブルな Web アプリケーション フレームワークです。 MVCやMTVなど複数のWeb開発モデルをサポートし、高品質なWebアプリケーションを簡単に開発できます。 Django はバックエンド開発をサポートするだけでなく、フロントエンド インターフェイスを迅速に構築し、テンプレート言語を通じて柔軟なビュー表示を実現します。 Django はフロントエンド開発とバックエンド開発をシームレスに統合するため、開発者は学習に特化する必要がありません。

See all articles