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オンデマンドシステムを構築
-9999 ピクセルの画像置換技術は、ここ 10 年近く人気があります。テキスト要素を画像に置き換え...
目次サイクルのために入室のためのその間しながら行うループから抜け出す要約するサイクルのためにループは...
目次事業背景テクノロジーの活用技術的な問題デザインのアイデア😱 困惑と苦痛に満ちた顔🙄考え始める🌲デ...
目次1. ダウンロード2. インストール3. my.ini ファイルを設定する(デフォルトのエンコー...
目次1. Dockerをインストールする2. ソナーイメージをインストールする3. ソナーを使ってコ...
この記事では主に、次のように共有されるネイティブ JS 音楽プレーヤーのサンプル コードを紹介します...
Tomcat が自動的にサービスを開始するように設定します。最近、問題が発生しました。サーバー上のプ...
この記事では、チャット機能を実現するためのVue+express+Socketの具体的なコードを参考...
1. それは何ですか? MySQL は最も人気のあるリレーショナル データベース管理システムです。W...
以下のように表示されます。 1. ssh -v -p [ポート番号] [ユーザー名]@[IPアドレス...
目次1. このキーワード2. カスタム属性3. 包括的なケース1:タブの実装付録要約する1. このキ...
インストール環境: CentOS7 64ビットMINI版公式ソースコードのコンパイルおよびインストー...
textarea タグはよく使われる HTML タグです。主に長いテキストを入力するときに改行するた...
この記事では、Vueを使用して特定の領域に透かしを描く方法を紹介します。具体的な内容は次のとおりです...
voidキーワードの紹介まず、void キーワードは JavaScript で非常に重要なキーワード...