Vue ファースト スクリーン パフォーマンス最適化コンポーネントVue ファースト スクリーン パフォーマンス最適化コンポーネントを実装するだけです。 最新のブラウザは多くの新しいインターフェイスを提供しています。 IE との互換性を考慮せずに、これらのインターフェイスを使用すると、コードの作成とパフォーマンスの最適化にかかる作業負荷を大幅に軽減できます。 もちろん、IE を考慮するために、コンポーネントをカプセル化するときに IE のバックアップを提供することもできます。 この記事のファースト スクリーン パフォーマンス最適化コンポーネントは、主に IntersectionObserver と requestIdleCallback の 2 つのインターフェイスを使用します。 説明するまず、最初の画面のシナリオを考えてみましょう。表示を主な目的とした最初の画面を作成する場合、通常は画像などのリソースがさらに読み込まれます。ユーザーが開いたときにすべてのリソースを読み込むのではなく、コンポーネントを読み込む前にユーザーが関連する位置までスクロールするようにしたい場合は、IntersectionObserver インターフェイスを選択できます。もちろん、onscroll イベントを使用してリスナーを実行することもできますが、パフォーマンスが低下する可能性があります。ロードする必要があるコンポーネントもありますが、ページの初期化時に同期的にロードされないようにする必要があります。この方法では、Promise や setTimeout などの非同期メソッドを使用できます。ただし、このコンポーネントのロードの優先度を下げたい場合は、requestIdleCallback インターフェイスを検討できます。関連するコードは、https://github.com/WindrunnerMax/webpack-simple-environment の vue--first-screen-optimization ブランチにあります。 インターセクションオブザーバーIntersectionObserver インターフェースは、Intersection Observer API に属し、ターゲット要素とその祖先要素または最上位ドキュメント ビューポートとの交差状態を非同期的に監視する方法を提供します。祖先要素とビューポートはルートと呼ばれます。つまり、IntersectionObserver API は要素が表示されているかどうかを自動的に監視できます。表示の本質は、ターゲット要素とビューポートが交差領域を生成することであるため、この API は交差オブザーバーと呼ばれます。互換性 https://caniuse.com/?search=IntersectionObserver。 const io = new IntersectionObserver(コールバック、オプション); // 観察を開始します io.observe(document.getElementById("example")); // 監視を停止します io.unobserve(element); // オブザーバーを閉じます io.disconnect();
さらに、コールバック関数が実行されると、次の情報を提供する IntersectionObserverEntry オブジェクト パラメータが渡されます。
{ 時間: 3893.92、 ルート境界: クライアントRect { 下: 920、 高さ: 1024, 左: 0, 右: 1024、 上: 0, 幅: 920 }, 境界クライアント矩形: クライアント矩形 { // ... }, 交差点矩形:クライアント矩形{ // ... }, 交差比率: 0.54、 ターゲット: 要素 } リクエストアイドルコールバックrequestIdleCallback メソッドは、ブラウザのアイドル期間中に呼び出される関数を受け入れることができます。これにより、開発者は、アニメーションや入力応答などの遅延されたキー イベントに影響を与えることなく、メイン イベント ループでバックグラウンドおよび低優先度の作業を実行できます。関数は通常、先入れ先出しの順序で実行されます。コールバック関数で実行タイムアウトが指定されている場合は、タイムアウト前に関数を実行するために実行順序を乱すことが可能です。互換性 https://caniuse.com/?search=requestIdleCallback。 const ハンドル = window.requestIdleCallback(コールバック[, オプション]);
成し遂げる実際、コンポーネントの作成では、主にこれら 2 つの主要な API の使用方法を理解する必要があります。まず、IntersectionObserver に注目しましょう。動的コンポーネント <component /> を使用する必要があるため、これに値を渡すときに、非同期コンポーネント読み込み () => import("component") 形式を使用する必要があります。リスニングする場合、読み込みが完了したらリスナーを破棄するか、視覚領域を離れたら破棄するかなどが考えられます。これは主に戦略的な問題です。ページが破棄されると、メモリ リークを防ぐために Intersection Observer を切断する必要があります。 requestIdleCallback の使用は比較的簡単です。Promise.resolve().then の非同期処理に似たコールバック関数を実行するだけです。 簡単な実装ロジックを以下に示します。通常、オブザーバーの使用方法は、まず div をプレースホルダーとして使用し、次にオブザーバーでプレースホルダーのコンテナーを監視します。コンテナーがビューポートにある場合、関連するコンポーネントを読み込みます。関連するコードは、https://github.com/WindrunnerMax/webpack-simple-environment の vue--first-screen-optimization ブランチにあります。インストールには yarn を使用してみてください。依存関係の問題を回避するために、yarn.lock ファイルを使用してバージョンをロックできます。 npm run dev で実行すると、Console でこれら 4 つの遅延ロード コンポーネントが作成される順序を確認できます。このうち、A のオブザーバーの遅延ロードは、ロード中のページがレンダリングされ、可視領域にあると判断されてからロードする必要があるため、最初の画面で直接見ることができます。D の遅延ロードは、D の外部コンテナーがビューに表示されるまでスクロール バーをスライドしてから表示する必要があります。つまり、D コンポーネントは一番下までスクロールしないと読み込まれません。また、$attrs と $listeners と同様に、component-params と component-events を通じて、遅延ロード コンポーネントに attrs と listeners を渡すこともできます。この時点で、遅延ロード コンポーネントが簡単に実装されました。 <!-- App.vue --> <テンプレート> <div> <セクション>1</セクション> <セクション> <div>2</div> <遅延読み込み :lazy-component="例" タイプ="オブザーバー" :component-params="{ content: '例A' }" :コンポーネントイベント="{ 'テストイベント': テストイベント、 }" </遅延読み込み> </セクション> <セクション> <div>3</div> <遅延読み込み :lazy-component="例" タイプ="アイドル" :component-params="{ content: '例 B' }" :コンポーネントイベント="{ 'テストイベント': テストイベント、 }" </遅延読み込み> </セクション> <セクション> <div>4</div> <遅延読み込み :lazy-component="例" タイプ="lazy" :component-params="{ content: '例 C' }" :コンポーネントイベント="{ 'テストイベント': テストイベント、 }" </遅延読み込み> </セクション> <セクション> <div>5</div> <遅延読み込み :lazy-component="例" タイプ="オブザーバー" :component-params="{ content: '例 D' }" :コンポーネントイベント="{ 'テストイベント': テストイベント、 }" </遅延読み込み> </セクション> </div> </テンプレート> <script lang="ts"> 「vue-property-decorator」から Component、Vue をインポートします。 「./components/lazy-load/lazy-load.vue」からLazyLoadをインポートします。 @成分({ コンポーネント: { LazyLoad }, }) デフォルトクラスAppをエクスポートし、Vueを拡張します。 保護された Example = () => import("./components/example/example.vue"); 保護されたテストイベント(コンテンツ: 文字列) { console.log(コンテンツ); } } </スクリプト> <スタイル lang="scss"> @import "./common/styles.scss"; 体 { パディング: 0; マージン: 0; } セクション { マージン: 20px 0; 色: #fff; 高さ: 500px; 背景: $color-blue; } </スタイル> コピー <!-- 遅延ロード.vue --> <テンプレート> <div> <コンポーネント :is="レンダリングコンポーネント" v-bind="コンポーネントパラメータ" v-on="コンポーネントイベント" </コンポーネント> </div> </テンプレート> <script lang="ts"> 「vue-property-decorator」から { Component、Prop、Vue } をインポートします。 @成分 デフォルトのクラスLazyLoadをエクスポートし、Vueを拡張します。 @Prop({ タイプ: 関数、必須: true }) lazyComponent!: () => Vue; @Prop({ 型: 文字列、必須: true }) タイプ: "オブザーバー" | "アイドル" | "レイジー"; @Prop({ 型: Object、デフォルト: () => ({}) }) コンポーネントパラメータ: Record<文字列、不明>; @Prop({ 型: Object、デフォルト: () => ({}) }) コンポーネントイベント!: Record<文字列、不明>; 保護されたオブザーバー: IntersectionObserver | null = null; 保護された renderComponent: (() => Vue) | null = null; 保護されたマウント() { これを初期化します。 } プライベートinit() { if (this.type === "オブザーバー") { // `window.IntersectionObserver` が存在する if (window.IntersectionObserver) { this.observer = 新しい IntersectionObserver(entries => { エントリ.forEach(item => { // `intersectionRatio` は対象要素の可視比率で、`0` より大きい場合は可視であることを意味します // ロード後に `observe` を解放せず、不可視の場合は破棄するなど、実装戦略の問題もあります。 if (item.intersectionRatio > 0) { コンポーネントをロードします。 // 読み込みが完了したら、`observe` のチェックを外します this.observer?.unobserve(item.target); } }); }); this.observer.observe(this.$el.parentElement || this.$el); } それ以外 { // 直接ロードします this.loadComponent(); } } そうでない場合 (this.type === "idle") { // `requestIdleCallback` が存在する // eslint 次の行を無効にする @typescript-eslint/ts コメントを禁止 // @ts を無視 if (window.requestIdleCallback) { リクエストIdleCallback(this.loadComponent, { タイムアウト: 3 }); } それ以外 { // 直接ロードします this.loadComponent(); } } そうでない場合 (this.type === "lazy") { // `Promise` が存在する if (window.Promise) { Promise.resolve().then(this.loadComponent); } それ以外 { // `setTimeout` を使用するようにダウングレードします タイムアウトを設定します(this.loadComponent); } } それ以外 { 新しいエラーをスローします(`type: "observer" | "idle" | "lazy"`); } } プライベートloadComponent() { this.renderComponent を this.lazyComponent に追加します。 this.$emit("ロードされました"); } 保護された破棄() { this.observer && this.observer.disconnect(); } } </スクリプト> 毎日の質問https://github.com/WindrunnerMax/EveryDay 参照するhttps://www.ruanyifeng.com/blog/2016/11/intersectionobserver_api.html https://developer.mozilla.org/zh-CN/docs/Web/API/IntersectionObserver https://developer.mozilla.org/zh-CN/docs/Web/API/Window/requestIdleCallback これで、Vue のファースト スクリーン パフォーマンス最適化コンポーネントのナレッジ ポイントのまとめに関する記事は終了です。Vue のファースト スクリーン パフォーマンス最適化コンポーネントの関連コンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: Docker、プレーヤー機能を備えたCMSオンデマンドシステムを構築
まずは緑色の無料インストール版のMySQLをダウンロードします。任意のフォルダに入れて構いません。今...
データ型: 列に格納できるデータとそのデータが実際にどのように格納されるかを定義する基本ルール。デー...
プロファイルを使用して遅いSQLを分析するMySQL の SQL パフォーマンス アナライザーの主な...
本格的な MySQL 最適化! MySQL のデータ量が少ない場合は最適化は不要です。データ量が多い...
通常、人事担当者と会うことはめったにありませんが、一度会うと、それが生死を分けることもあります。 H...
目次1. podmanの紹介2. Dockerと比較した利点3. 互換性4. バックグラウンド サー...
MySQL 5.7.13 Mac用インストールチュートリアル、非常に詳細で、以下のように記録されてい...
背景Navicat は、最高の MySQL 視覚化ツールです。ただし、ビューのインポートとエクスポー...
目次1. ファイルを開くパラメータの紹介2. ファイルの読み取り3. ファイルを書き込む4. 閉じる...
この記事では、centos7 環境でバイナリ インストール パッケージを使用して mysql5.6 ...
プロジェクト内のページの長さはおよそ2000px以上あり、背景画像にはテクスチャやグラデーションがあ...
目次序文基本的な使い方文法エラー処理プロミスチェーン呼び出し非同期と待機よく使われる方法1. Pro...
この記事の例では、Baidu検索ボックスを実装するためのJSの具体的なコードを参考までに共有していま...
この記事では、例を使用して、MySQL データベースの列を追加、削除、および変更する方法について説明...
現象プロジェクトにはネストされたフレックス構造がいくつかあります。 <スタイル> /* ...