モジュールを削除してメモリを節約する必要がある場合は、requirejsを使用することは可能ですか

StackOverflow https://stackoverflow.com/questions/3164049

質問

組み込み環境でアプリケーションを開発します。これは、Busybox Linuxシステムの上に完全なWebbrowserを備えた高レベルのコンピューティング環境です。唯一の例外は、システムにシステムメモリの量が限られていることです。

当社のアプリケーションはJavaScriptに組み込まれており、WebKitベースのWebbrowser内で実行され、順番にロードされた(これはあまり効率的ではない)多くのJavaScriptモジュールで構成されています。

一部のモジュールは、いくつかのモジュールで使用される共通の機能を提供します。現在のJavaScriptローダーをRequireJSで変換する過程にありますが、最初に対処する必要がある特定の必要性が1つあります。

requirejsを使用してロードされたときにモジュールをアンロードすることは可能ですか?以下を使用してモジュールを動的にロードすると仮定します。

require(["somemodule.js"], function(m) { m.run(); } );

これは、「SomeModule」の読み込みと実行に適しています。また、「SomeModule」のすべての依存関係を解決するのに適しています。

ある時点でメモリを取り戻す必要がある場合、例えば、無限の数のモジュールをロードして実行できるようにするには、しばらくしてからいくつかのモジュールを削除し始めなければなりません。それは、内部実装を変更せずにrequirejsで可能ですか?

誰かが以前にこの種の問題に対処したことがありますか?ほとんどのシングルページJSアプリは、メモリの使用が通常大きな関心事ではないデスクトップPCのウェブブラウザーで実行されます。

役に立ちましたか?

解決

requirejsには組み込みのアンロード機能はありませんが、おそらく追加できる追加の部分として追加できます。その機能を希望する場合は、お気軽に提案してください メーリングリスト またはaとして githubの問題.

あなたがそれがあなたの状況に役立つかどうかを確認するために実験したい場合、あなたがする必要があることは次のとおりです。

1)requirejsモジュールキャッシュから定義されたモジュールを削除します。多額のサポートを使用していない場合は、次のようなことができます。

var context = require.s.contexts['_'];
delete context.defined[moduleName];
delete context.specified[moduleName];
delete context.loaded[moduleName];

2)次に、スクリプトタグを削除して、それが役立つかどうかを確認してみることができます。

var scripts = document.getElementsByTagName('script');
for (var i = scripts.length - 1; i >= 0; i--) {
    var script = scripts[i];
    if (script.getAttribute('data-requiremodule') === moduleName) {
        script.parentNode.removeChild(script);
        break;
    }
}

モジュールは、他のモジュールを定義する閉鎖function(){}を介して別のモジュールを保持している場合、ガベージが収集されない場合があることに注意してください。他のモジュールも削除する必要があります。

関数引数としてモジュールを渡さないことでその影響を制限することを試みることができますが、依存モジュールを保持したいときはいつでも、関数定義内で必要( "somemodule")を使用するだけで、リターンを必要としない場合は長すぎる価値。

また、上記の例では、使用するモジュールについては、それ自体を定義するためにDEFを定義するために、それは次のように見えます(.JSサフィックスなし):

require(["somemodule"], function(m) { m.run(); } );

他のヒント

これを試して: require.undef(moduleName)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top