検索
ホームページウェブフロントエンドjsチュートリアルLocalStorageやその他の犯人によるDOMブロッキングを避ける方法

How to Avoid DOM Blocking by localStorage and Other Culprits

キーポイント

  • コンピューティング、DOMの更新、LocalStorageまたはIndexEdDBブロックDOMの更新を使用してデータの保存と取得などのJavaScript操作の同期とフロントエンドのパフォーマンスに影響を与えます。
  • Webワーカーを使用して、長期にわたるプロセスを処理できます。メインブラウザーアプリケーションは、バックグラウンドスクリプトを起動し、メッセージイベントを使用して通信することができますが、DOMまたはLocalStorageに直接アクセスできません。
  • ハードウェアアクセラレーションのCSSアニメーションは、独自のレイヤーで実行され、アニメーションの滑らかさが向上し、ほとんどの最新のブラウザではブロックされていません。
  • メモリストレージは、ディスクベースのストレージメカニズムよりも高速なデータ更新を提供します。メモリオブジェクトを使用してパフォーマンスを改善し、便利な場合はデータを永久に保存することをお勧めします。

ブラウザやnode.jsなどの実行環境でのJavaScriptプログラムは、単一のスレッドで実行されます。コードが[ブラウザ]タブで実行されると、他のすべての操作が停止します:メニューコマンド、ダウンロード、レンダリング、DOM更新、さらにはGIFアニメーション。

ユーザーは、小さなブロックで処理が迅速に進行するため、これに気付くことはめったにありません。たとえば、ボタンをクリック、イベントのスロー、関数の実行、計算の実行、DOMの更新。完了すると、ブラウザはキュー内の次のアイテムを自由に処理できます。

JavaScriptコードは、Ajaxリクエストを行うたびにアプリケーションがフリーズする場合に、それがどれほどイライラするかを想像できません。したがって、JavaScriptコードは、イベントとコールバックを使用して操作します。ブラウザまたはオペレーティングシステムレベルのプロセスを指示して、操作が完了した後に特定の機能を呼び出し、結果が準備ができています。

次の例では、ボタンクリックイベントが発生すると、CSSクラスをアニメーション化するハンドラー関数が実行されます。アニメーションが完了すると、匿名のコールバックがクラスを削除します。

// 单击按钮时引发事件
document.getElementById('clickme').addEventListener('click', handleClick);

// 处理按钮单击事件
function handleClick(e) {

  // 获取要设置动画的元素
  let sprite = document.getElementById('sprite');
  if (!sprite) return;

  // 动画结束时删除“animate”类
  sprite.addEventListener('animationend', () => {
    sprite.classList.remove('animate');
  });

  // 添加“animate”类
  sprite.classList.add('animate');
}
ES2015は約束を提供し、ES2017はエンコーディングを簡素化するためにASYNC/待ち望を導入しますが、それでも表面の下でコールバックを使用します。詳細については、「Modern JSのプロセス制御」を参照してください。

因子

残念ながら、一部のJavaScript操作は常に同期されます。

計算を実行します
  • update dom
  • LocalStorageまたはIndexEdDBを使用してデータを保存および取得します。
  • 次の例は、動きにCSSアニメーションを使用し、JavaScriptを手足に振る侵入者を示しています。右側の画像は、基本的なアニメーションGIFです。デフォルトの100,000 SESSIONSTORAGE操作を使用して[書き込み]ボタンをクリックします。
[Codepenサンプルリンク-Codepen Embedコードをここに挿入する必要があります]

この操作中に、DOMの更新がブロックされます。ほとんどのブラウザでは、侵入者が停止または立ち往生します。アニメーションGIFの特定のアニメーションは一時停止されます。より遅いデバイスは、「スクリプトの無反応」警告を表示する場合があります。

これは複雑な例ですが、基本操作がフロントエンドのパフォーマンスにどのように影響するかを示しています。

webワーカー

長期にわたるプロセスのソリューションの1つは、Webワーカーです。これらにより、メインブラウザアプリケーションはバックグラウンドスクリプトを開始し、メッセージイベントを使用して通信できます。たとえば、

// 单击按钮时引发事件
document.getElementById('clickme').addEventListener('click', handleClick);

// 处理按钮单击事件
function handleClick(e) {

  // 获取要设置动画的元素
  let sprite = document.getElementById('sprite');
  if (!sprite) return;

  // 动画结束时删除“animate”类
  sprite.addEventListener('animationend', () => {
    sprite.classList.remove('animate');
  });

  // 添加“animate”类
  sprite.classList.add('animate');
}

Webワーカースクリプト:

// main.js
// 是否支持 Web Workers?
if (!window.Worker) return;

// 启动 Web Worker 脚本
let myWorker = new Worker('myworker.js');

// 从 myWorker 接收消息
myWorker.onmessage = e => {
  console.log('myworker sent:', e.data);
}

// 向 myWorker 发送消息
myWorker.postMessage('hello');

労働者は、他の労働者を生成して、複雑なスレッド操作をシミュレートすることもできます。ただし、ワーカーの機能は意図的に制限されており、ワーカーはDOMまたはLocalStorageに直接アクセスできません(実際にJavaScriptをマルチスレッドし、ブラウザの安定性を破壊します)。したがって、すべてのメッセージは文字列として送信されるため、jsonエンコードされたオブジェクトを渡すことができますが、domノードを通過させることはできません。

ワーカーは、特定のウィンドウプロパティ、WebSocket、およびIndexDBにアクセスできますが、上記の例を改善しません。ほとんどの場合、労働者は、レイトレース、画像処理、ビットコインマイニングなど、長期にわたる計算に使用されます。

(node.jsは、Webワーカーに似た子どものプロセスを提供しますが、他の言語で記述された実行可能ファイルを実行するオプションがあります。

ハードウェアアクセラレーションアニメーション

ほとんどの最新のブラウザは、独自のレイヤーで実行されているハードウェアアクセラレーションのCSSアニメーションをブロックしません。

デフォルトでは、上記の例では、左マージンを変更することで侵入者を移動します。このプロパティと左や幅などの同様のプロパティにより、ブラウザは各アニメーションステップでドキュメント全体を再ストリーミングして再描画します。

変換プロパティおよび/または不透明な特性を使用する場合、動物の効率がより効率的です。これらは実際に要素を個別の組成層に入れて、GPUが個別にそれらをアニメーション化できるようにします。

「ハードウェアアクセラレーション」チェックボックスをクリックすると、アニメーションはすぐにスムーズになります。次に、別のSessionStorage Writeを試してください。これはJavaScriptによって制御されるため、四肢の動きは依然として一時停止されることに注意してください。

メモリストレージ

メモリ内のオブジェクトの更新は、ディスクに書かれたストレージメカニズムを使用するよりもはるかに高速です。上記の例では、オブジェクトストレージタイプを選択し、[書き込み]をクリックします。結果は異なりますが、同等のSessionStorage操作の約10倍高速にする必要があります。

メモリは揮発性です:タブを閉じるか、ナビゲーションを離れると、すべてのデータが失われます。優れたトレードオフは、メモリオブジェクトを使用してパフォーマンスを改善し、それが便利なときにデータを永久に保存することです。

ゲームまたはシングルページアプリケーションには、より複雑なオプションが必要になる場合があります。たとえば、データが保存される時点:

// myworker.js
// 接收消息时启动
onmessage = e => {
  console.log('myworker received:', e.data);
  // ...长时间运行的进程...
  // 发送回消息
  postMessage('result');
};
しばらくの間、ユーザーアクティビティ(マウス、タッチまたはキーボードイベント)はありません

ゲームの一時停止またはバックグラウンドでのアプリケーションタグ(ページVivisibilityAPIを参照)
  • 自然な一時停止があります。プレーヤーの死、レベルの完了、家庭画の間を移動するなど。
  • WebパフォーマンスWebパフォーマンスはホットなトピックです。開発者はブラウザの制限により制限が少なく、ユーザーは高速でオペレーティングシステムのようなアプリケーションのパフォーマンスを期待しています。

できるだけ処理を行わないと、DOMが著しくブロックされることはありません。幸いなことに、長期にわたるタスクを避けられない場合、いくつかのオプションがあります。

ユーザーとクライアントは、速度の最適化に決して気付かないかもしれませんが、アプリケーションが遅くなったときに常に不満を言います!

domブロッキング(FAQ)

に関するFAQ

domブロッキングとは何ですか?なぜそれが問題なのですか?

domブロッキングとは、スクリプトが完了するのを待っているため、ブラウザがWebページをレンダリングできないことを意味します。これにより、Webページの読み込み速度が大幅に低下し、ユーザーエクスペリエンスが低下します。ブラウザは、HTMLタグを解析してDOMツリーを構築する必要があります。このプロセス中に、スクリプトが遭遇した場合、停止して実行する必要があります。これは、スクリプトがDOMツリー構造を変更する可能性があり、ブラウザが最新のビューを確認する必要があるためです。

domブロッキングを避ける方法は?

DOMブロッキングを避ける方法はいくつかあります。最も効果的な方法の1つは、非同期ロードスクリプトを使用することです。これは、スクリプトがバックグラウンドにロードされ、ページの残りの部分がロードされ続けることを意味します。別のアプローチは、スクリプトを延期することです。つまり、HTMLドキュメントが完全に解析された後にのみ実行されることを意味します。最後に、スクリプトをHTMLドキュメントの下部に移動して、最後のロードされたコンテンツにすることもできます。

同期スクリプトと非同期スクリプトの違いは何ですか?

同期スクリプトは、完全にロードおよび実行されるまでDOMコンストラクトをブロックします。これは、スクリプトが長い間読み込まれた場合、Webページ全体を遅らせることを意味します。一方、非同期スクリプトはDOMの構築をブロックしません。それらはバックグラウンドにロードされ、DOMが完全に構築されていなくても、準備ができたら実行できます。

スクリプトタグの「延期」属性とは何ですか?

スクリプトタグ内の「延期」プロパティは、HTMLドキュメントが完全に解析された後にスクリプトを実行する必要があることを示すために使用されます。これは、スクリプトがDOMコンストラクトをブロックしないため、Webページの読み込み時間を高速化することを意味します。ただし、これはまた、DOMが構築されたときにスクリプトが準備ができていない可能性があることを意味するため、DOM構造を変更しないスクリプトでのみ使用できます。

スクリプトをHTMLドキュメントの下部に移動するとどのように役立ちますか?

スクリプトをHTMLドキュメントの下部に移動すると、それらが最後のコンテンツがロードされていることが保証されます。これは、スクリプトが完了するのを待つことなく、Webページの残りの部分をレンダリングできることを意味します。ただし、この方法は、DOM構造を変更しないスクリプトでのみ使用できます。これは、DOMが構築されたときに準備ができていない可能性があるためです。

スクリプトタグの「非同期」属性とは何ですか?

スクリプトタグの「async」属性は、スクリプトを非同期にロードする必要があることを示すために使用されます。これは、スクリプトがバックグラウンドに読み込まれ、残りのWebページがロードされ続けることを意味します。 DOMが完全に構築されていなくても、スクリプトはすぐに実行できます。これにより、Webページの読み込み時間を大幅に改善できますが、DOM構造を変更しないスクリプトにのみ使用できます。

SEOに対するDOMブロッキングの影響は何ですか?

DOMブロッキングは、Webページの読み込み速度を大幅に低下させる可能性があり、SEOランキングに悪影響を及ぼします。 Googleのような検索エンジンは、ランキング要因の1つとして速度を読み込むWebページの読み込み速度です。したがって、DOMブロッキングを避けることは、検索エンジンの結果でページが高いことを確認するために非常に重要です。

仮想DOMとは何ですか?それはどのように役立ちますか?

仮想Domは、Reactなどの最新のJavaScriptフレームワークで使用される概念です。これは実際のDOMのコピーであり、変更は実際のDOMではなく、仮想DOMで最初に行われます。すべての変更が完了すると、Coordinationと呼ばれるプロセスを通じて、仮想DOMが実際のDOMと同期されます。これにより、実際のDOMでの直接操作の数が減り、Webページの読み込み時間が高速化されます。

私のWebページにdomブロッキングの問題があるかどうかを確認する方法は?

GoogleのPageSpeed Insightsなどのツールを使用して、WebページにDOMブロッキングの問題があるかどうかを確認できます。このツールは、Webページを分析し、DOMブロッキングなどの潜在的な問題を含む、パフォーマンスに関する詳細なレポートを提供します。

CSSはDOMブロッキングも引き起こしますか?

はい、CSSはDOMブロッキングを引き起こす可能性があります。ブラウザがCSSファイルに遭遇する場合、Webページのレンダリングを続けるには、停止してロードする必要があります。これは、CSSファイルにWebページの外観を変更するスタイルが含まれている可能性があるためです。これを回避するために、インラインの重要なCSSや非批判的なCSSなどのメソッドを使用できます。

以上がLocalStorageやその他の犯人によるDOMブロッキングを避ける方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
JavaScriptのコア:CまたはCの上に構築されていますか?JavaScriptのコア:CまたはCの上に構築されていますか?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc;それは、解釈されていることを解釈しました。

JavaScriptアプリケーション:フロントエンドからバックエンドまでJavaScriptアプリケーション:フロントエンドからバックエンドまでMay 04, 2025 am 12:12 AM

JavaScriptは、フロントエンドおよびバックエンド開発に使用できます。フロントエンドは、DOM操作を介してユーザーエクスペリエンスを強化し、バックエンドはnode.jsを介してサーバータスクを処理することを処理します。 1.フロントエンドの例:Webページテキストのコンテンツを変更します。 2。バックエンドの例:node.jsサーバーを作成します。

Python vs. Javascript:どの言語を学ぶべきですか?Python vs. Javascript:どの言語を学ぶべきですか?May 03, 2025 am 12:10 AM

PythonまたはJavaScriptの選択は、キャリア開発、学習曲線、エコシステムに基づいている必要があります。1)キャリア開発:Pythonはデータサイエンスとバックエンド開発に適していますが、JavaScriptはフロントエンドおよびフルスタック開発に適しています。 2)学習曲線:Python構文は簡潔で初心者に適しています。 JavaScriptの構文は柔軟です。 3)エコシステム:Pythonには豊富な科学コンピューティングライブラリがあり、JavaScriptには強力なフロントエンドフレームワークがあります。

JavaScriptフレームワーク:最新のWeb開発のパワーJavaScriptフレームワーク:最新のWeb開発のパワーMay 02, 2025 am 12:04 AM

JavaScriptフレームワークのパワーは、開発を簡素化し、ユーザーエクスペリエンスとアプリケーションのパフォーマンスを向上させることにあります。フレームワークを選択するときは、次のことを検討してください。1。プロジェクトのサイズと複雑さ、2。チームエクスペリエンス、3。エコシステムとコミュニティサポート。

JavaScript、C、およびブラウザの関係JavaScript、C、およびブラウザの関係May 01, 2025 am 12:06 AM

はじめに私はあなたがそれを奇妙に思うかもしれないことを知っています、JavaScript、C、およびブラウザは正確に何をしなければなりませんか?彼らは無関係であるように見えますが、実際、彼らは現代のウェブ開発において非常に重要な役割を果たしています。今日は、これら3つの間の密接なつながりについて説明します。この記事を通して、JavaScriptがブラウザでどのように実行されるか、ブラウザエンジンでのCの役割、およびそれらが協力してWebページのレンダリングと相互作用を駆動する方法を学びます。私たちは皆、JavaScriptとブラウザの関係を知っています。 JavaScriptは、フロントエンド開発のコア言語です。ブラウザで直接実行され、Webページが鮮明で興味深いものになります。なぜJavascrを疑問に思ったことがありますか

node.jsは、型を使用してストリーミングしますnode.jsは、型を使用してストリーミングしますApr 30, 2025 am 08:22 AM

node.jsは、主にストリームのおかげで、効率的なI/Oで優れています。 ストリームはデータを段階的に処理し、メモリの過負荷を回避します。大きなファイル、ネットワークタスク、リアルタイムアプリケーションの場合。ストリームとTypeScriptのタイプの安全性を組み合わせることで、パワーが作成されます

Python vs. JavaScript:パフォーマンスと効率の考慮事項Python vs. JavaScript:パフォーマンスと効率の考慮事項Apr 30, 2025 am 12:08 AM

PythonとJavaScriptのパフォーマンスと効率の違いは、主に以下に反映されています。1)解釈された言語として、Pythonはゆっくりと実行されますが、開発効率が高く、迅速なプロトタイプ開発に適しています。 2)JavaScriptはブラウザ内の単一のスレッドに限定されていますが、マルチスレッドおよび非同期I/Oを使用してnode.jsのパフォーマンスを改善でき、両方とも実際のプロジェクトで利点があります。

JavaScriptの起源:その実装言語の調査JavaScriptの起源:その実装言語の調査Apr 29, 2025 am 12:51 AM

JavaScriptは1995年に発信され、Brandon Ikeによって作成され、言語をCに実現しました。 2。JavaScriptのメモリ管理とパフォーマンスの最適化は、C言語に依存しています。 3. C言語のクロスプラットフォーム機能は、さまざまなオペレーティングシステムでJavaScriptを効率的に実行するのに役立ちます。

See all articles

ホット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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。