3

メインモジュールビューメソッドのようにサブモジュールのビューを変更しながら、メインビュー関数へのグローバル redraw = 呼び出しを回避するにはどうすればよいでしょうか:

m("body", [
           m("#head", {...}),
           Menu.show(this),
           Footer.show(this)
])

静的な show メソッドは次のようになります。

    function show(app)
    {
        if (inst == null)
            inst = new Footer(app);
        return inst.view(app);
    }

サブビューの変更がローカルな影響しか持たない場合に、メインビューメソッドを実行せずにサブビューのビューメソッドを実行する方法があれば、すでに優れたパフォーマンスが向上するはずです。これは理にかなっていますか?

アクセル

4

2 に答える 2

3

グローバルな再描画を防ぐことはできませんが、サブツリー ディレクティブを使用して、ビューの一部を選択的に再描画しないようにすることができます

ただし、これは影響を受けるサブツリーの再描画を無効にするパフォーマンスの最適化であるため、ディレクティブをサブツリーに再度置き換えない限り、ビューを更新できないことに注意してください。

于 2014-12-08T18:40:53.370 に答える
1

再描画は Mithril でのグローバルな操作であり、これにより強制される構造上の決定は設計によるものです。Mithril は、アプリケーション内の任意のポイントからビュー レンダリング プロセスをきめ細かく制御できる API を公開するのではなく、最適化された仮想 DOM モデルの反復を比較する特殊な差分アルゴリズムを通じてプロセス全体を処理します。

そうは言っても、コンテキストに応じて、差分ロジックとレンダリングの実装に影響を与える方法があります。

  1. またはm.redraw.strategyの引数を使用して適切なタイミングで呼び出すと、再描画を完全に防止するか、DOM の完全な再描画を回避できます。私のアプリケーションでは、特に複雑なモジュールがトリガーされ、ルートの変更に継続的に反応します (各項目自体がサブモジュール化された DOM 構造である複数のリスト、オプションの追加のウィジェットなど) -コントローラーで設定することにより、パフォーマンスを ~ に維持することができます。異なる DOM のチャンクのみを変更している場合でも 55FPS です (それでも大きなチャンクです!)。nonediffm.redraw.strategy( 'diff' )
  2. { subtree : 'retain' }差分ルーチンから削除したい仮想 DOM の部分を呼び出します。diff アルゴリズムで無視する (したがって、後続の再描画で影響を受けないようにする) DOM の大きなチャンクがある場合は、ビューでこの特別な引数を指定できます。後で subtree-retaining ディレクティブを削除することを決定した場合、内部 DOM ツリー全体を少なくとも 1 回は再レンダリングする必要があることに注意してください。これは、以前の反復が差分エンジンによって登録されていないためです。これを使用して、再推測または差分アルゴリズムを試みることをお勧めします。
  3. { key : 'uniqueIdentifier' }差分アルゴリズムが新しいものとして識別する可能性のある要素を強調表示するために使用します。再描画の間に DOM 内の古い場所に対して移動したビューのチャンクがある場合、差分アルゴリズムは古いものを破棄し、新しいものを最初からレンダリングします。固有のものを指定するkeyと、代わりに既存の DOM 構造を移動し、そこにパッチを適用する必要があることを確認できます。これは、大規模で複雑な DOM 構造がその場所を変更したものの、多数の小さな項目で使用するとパフォーマンスが低下し始める場合に役立ちます。たとえば、私のアプリケーションでは、リスト内を移動しただけの項目の再描画を避けるために、すべてのリスト項目 (それぞれが少なくとも 8 つの要素、イベント ハンドラーなどを持つサブモジュールでした) にキーを追加しました。削除することが判明したkey移動時に要素を最初から作成するだけで、パフォーマンスが 100% 向上しました。

しかし、私のアドバイスは、ミスリルが最善だと思うことをやらせることです. 他の MVC ライブラリのビュー コンポーネントに対する Mithril の主な利点の 1 つは、Mithril を使用すると、90% の時間で再描画サイクルを忘れて、必要なときにこれを実行できることです。これは利点です!心に留めておくべきもう 1 つのことは、Javascript MVC レンダリングを高速化するために無数の人々が無数の開発者の時間を費やしてきたことです。Mithril は最速の 1 つです。おそらく、Mithril コアは、ほとんどの状況で内部ロジックを推測するよりも最適化されている可能性があります。上記の私の経験が示すように、パフォーマンスを向上させるために余分なコードを導入することは、実際には私の期待に反するものでした。Mithril はそのままでも非常に高速です。これにより、私たちは他の問題に発明力を費やすことができます!

于 2014-12-08T14:31:15.717 に答える