15

私は何年もの間エンジニアの周りにいたので、コンテキストを提供しなければ、「何を達成しようとしていますか?」という形で何百もの答えが返ってくることを知っています。私の質問の動機となる背景を説明します。しかし、私が尋ねている質問のバックグラウンド コンテキストを混同しないでください。これは特に、ページ リクエスト間でオブジェクト コードをキャッシュできないようにする JavaScript セマンティクスに関連しています。Web アプリケーションを高速化する方法についてアドバイスを与えるつもりはありません。これは私の質問とはまったく関係がありません。おそらく、JavaScript コンパイラーまたは少なくとも動的言語のコンパイラーに取り組んだことがある人だけが答えられるでしょう。

バックグラウンド:

Web アプリケーションのパフォーマンスを改善しようとしています。その多くのリソースの中で、40,000 行、130 万文字の事前縮小された 1 つの巨大な JavaScript ファイルが含まれています。縮小後もサイズは大きく、ソースがクライアント側にキャッシュされている場合でも、同期的にロードされると window.onload イベントに約 100 ミリ秒追加されます。(リクエストログを見て、リソースがリクエストされていないことを観察することで、リソースがキャッシュされていない可能性を最終的に除外しました。)

キャッシュされた後も遅いことを確認した後、主要なブラウザーでの JavaScript キャッシングについて調査を開始し、それらのいずれもオブジェクト コードをキャッシュしないことを知りました。


私の質問は、この研究に基づくいくつかの仮説的な主張の形です。これらの主張が間違っている場合は、反論してください。

  1. JavaScript オブジェクト コードは、最新のブラウザーではキャッシュされません。

    「オブジェクト コード」とは、単純な線形化された解析ツリーを表すバイト コードからネイティブ マシン コードまで、あらゆるものを意味します。

  2. Web ブラウザの JavaScript オブジェクト コードは、キャッシュするのが困難です。

    つまり、キャッシュされた JS ソース ファイルを外部タグに含めている場合でも、スクリプトに関数定義のみが含まれている場合でも、そのスクリプトをページに含めるには直線的なコストがかかります。オブジェクトコードにコンパイルされます。

  3. JavaScript オブジェクト コードは、コンパイルするために JS ソースを評価する必要があるため、キャッシュするのが困難です。

    ステートメントには、静的な分析が困難な動的な方法でダウンストリーム ステートメントのコンパイルに影響を与える機能があります。

    3a. (3) は主に eval() のおかげで真です。

  4. 評価は、DOM に副作用をもたらす可能性があります。

  5. したがって、JavaScript ソースはすべてのページ リクエストでコンパイルする必要があります。

おまけの質問: 最新のブラウザーは、キャッシュされた JS ソース ファイルの解析ツリーをキャッシュしますか? そうでない場合、なぜですか?

編集:これらのアサーションがすべて正しい場合は、オブジェクト コードとしてキャッシュできなかった JS コードのサンプルを提供し、その理由を説明するなどして、それらが正しい理由を詳しく説明できる人に答えを提供します。いいえ。

アプリを高速化するためにここから先に進む方法についての提案に感謝し、ほとんど同意します。しかし、私が埋めようとしている知識のギャップは、JS オブジェクト コードのキャッシュに関連しています。

4

1 に答える 1

7

動的にコンパイルおよび評価されるという点で、あなたは正しいです。
そうでなければならないというあなたの言う通りです。

あなたの頼りになるのは、そのコンパイル時間を短縮しようとすることではありません。
最初はロードを減らし、ユーザーエクスペリエンスを可視化するために最低限のことを行い、次にモジュラー方式でコア機能を追加するために最低限のことを行い、次に怠惰に (タイマーまたは要求に応じて)エンドユーザーによって) 追加の機能、機能、繁栄をロードします。

プログラムが 10,000 行の手続き型コードである場合、問題があります。すべてが手続き的な
ものではないことを願っています。

だからそれを壊してください。これは、最初のページの読み込みが遅くなることを意味します。ただし、後続の要求では、100% 機能するまでに時間がかかる場合でも、ユーザーが「実行中」と認識する限り、応答時間が大幅に短縮される可能性があります。

すべてはユーザーの「速度」と「応答性」に対する認識であり、100% 機能するための最短ルートではありません。

シングルスレッド形式の JavaScript は、それと応答性の両方を行うことはできません。
したがって、最初に応答してください。

PS:ブートストラップを追加します。インテリジェントなブートストラップ。どの機能が必要かを識別できる必要があります。
RequireJS は依存関係をロードするためのものです。
依存関係が何であるかを理解するためではありません。

追加の利点 -- バージョン管理されたモジュールを指す短期キャッシュをブートストラップに設定できます。これはどのようにメリットがありますか?モジュールを更新する必要がある場合、ブートストラップでバージョンを更新するのは簡単なプロセスです。ブートストラップのキャッシュが期限切れになると、それは新しいモジュールを指します。これは、無限の寿命を持つことができます (別の名前 (バージョンまたはタイムスタンプが付いているため) のため)。

于 2012-09-19T15:51:10.240 に答える