16

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

私たちのアプリケーションは JavaScript で構築され、Webkit ベースの Web ブラウザ内で実行され、順番にロードされる多数の JavaScript モジュールで構成されています (これはあまり効率的ではありません)。

一部のモジュールは、複数のモジュールで使用される共通の機能を提供します。現在、requirejs を使用して現在の JavaScript ローダーを変換中ですが、最初に対処しなければならない特定のニーズが 1 つあります。

モジュールがrequirejsを使用してロードされている場合、モジュールをアンロードすることは可能ですか? 以下を使用してモジュールを動的にロードするとします。

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

これは、「somemodule」のロードと実行、および「somemodule」のすべての依存関係の解決にもうまく機能し、requirejs フレームワークは将来のリクエストのために「somemodule」への参照を保存します。

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

誰もこの種の問題を以前に扱ったことがありますか? ほとんどの単一ページ JS アプリは、デスクトップ PC の Web ブラウザーで実行され、通常はメモリ使用量が大きな問題になることはありません。

4

2 に答える 2

17

RequireJS には組み込みのアンロード機能はありませんが、組み込み可能な追加パーツとして追加することができます。この機能が必要な場合は、メーリング リストまたはGitHub の問題として提案してください。

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

1) 定義済みのモジュールを RequireJS モジュール キャッシュから削除します。マルチバージョン サポートを使用していない場合は、次のようにすることができます。

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

2) 次に、script タグを削除して、それが役立つかどうかを確認できます。

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(){} を介して保持されている場合、そのモジュールはガベージ コレクションされない可能性があることに注意してください。その他のモジュールも削除する必要があります。

モジュールを関数の引数として渡さないことでその影響を制限しようとすることができますが、依存モジュールを取得したいときはいつでも関数定義内で require("somemodule") を使用し、require return を保持しないでください。値が長すぎます。

また、上記の例では、require.def を使用して自分自身を定義するモジュールの場合、次のようになります (.js サフィックスなし)。

require(["somemodule"], function(m) { m.run(); } );
于 2010-07-02T19:26:36.073 に答える
2

これを試してください: require.undef(moduleName)

于 2013-04-09T10:46:10.937 に答える