大規模な GWT プロジェクトで、JavaScript の一部をその場で遅延ロードすることは可能ですか? オーバーレイのように。
PS: Iframes は解決策ではありません。
大規模な GWT プロジェクトで、JavaScript の一部をその場で遅延ロードすることは可能ですか? オーバーレイのように。
PS: Iframes は解決策ではありません。
iPhoneまたはiPodtouchを使用して、「1つの先行」アプローチで大きなGWTアプリケーションをロードしてみてください...ロードされることはありません。
モジュールアプローチは、管理がより複雑ですが、小規模なクライアントデバイスには適しています。
では、iFrameを使用せずにJavaコードからモジュールをロードするにはどうすればよいですか?
アプリケーションを複数の GWT モジュールに分割することも考えられますが、これによりモジュール間でコードを共有する機能が制限されることを覚えておく必要があります。したがって、あるモジュールが別のモジュールが参照する同じクラスを参照するクラスを持つ場合、共通クラスのコードは 2 回インクルードされます。
事実上、モジュールは独自の名前空間を作成します。これは、2 つの別個のクラス ローダーを介して同じクラスをロードした場合に Java で得られるものと似ています。実際、GWT コンパイラはコード内で参照されているメソッドのみをコンパイルする (つまり、デッド コードの削除を行う) ため、1 つのモジュールが共通クラスから他のモジュールへのメソッドの異なるサブセットを含むことが考えられます。
したがって、すべてを 1 つのモノリシック モジュールとしてロードし、最初のラウンドで前払いする方が、複数のモジュールを使用するよりも優れているかどうかを検討する必要があります。その累積コード サイズは、単一モジュールのアプローチよりも大幅に大きくなる可能性があります。
ユーザーがモジュールの同じバージョンを 1 回だけロードするように GWT が設計されていることを考えると (それはその後キャッシュされます)、ほとんどの場合、1 回限りの事前ヒットが望ましいです。
ロードするモジュールに必要な (または必要な可能性がある) すべての Java コードが単一の JavaScript ファイルにコンパイルされるため、GWT はこれを容易にサポートしません。この単一の JavaScript ファイルは大きくなる可能性がありますが、重要なモジュールの場合、同等の手書きの JavaScript ファイルよりも小さくなります。
生成された単一の JavaScript ファイルが大きすぎるというシナリオはありますか?
これがあなたが探しているものだと思います。
<body onload="onloadHandler();">
<script type="text/javascript">
function onloadHandler() {
if (document.createElement && document.getElementsByTagName) {
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = './test.js';
var heads = document.getElementsByTagName('head');
if (heads && heads[0]) {
heads[0].appendChild(script);
}
}
}
function iAmReady(theName) {
if ('undefined' != typeof window[theName]) {
window[theName]();
}
}
function test() {
// stuff to do when test.js loads
}
</script>
-- test.js
iAmReady('test');
Firefox 2、Windows 用の Safari 3.1.2、IE 6、および Opera 9.52 でテストされ、動作しています。それらの上位バージョンも同様に機能するはずです。
ロードは非同期であることに注意してください。呼び出した直後にロードされたファイルで関数または変数を使用しようとするappendChild()
と、ほとんどの場合失敗します。そのため、スクリプトのロードが完了したときに初期化関数を強制的に実行するコールバックをロードされたスクリプト ファイルに含めました。 .
ロードされたスクリプトの下部で内部関数を呼び出して、ロード後に何かを実行することもできます。