私はRequireJSからWebpackに移行しようとしており、私たちのロケールファイルを処理する最良の方法は不明です。実行時にi18nモジュールをバンドルしてロードするには?
現在、各ロケールごとに別々のJSファイルを生成しています。これらのファイルには、i18nメッセージ用の7つ以上のモジュール定義とライブラリ構成(モーメントなど)が含まれています。実行時に
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('../moment')) :
typeof define === 'function' && define.amd ? define('moment-locale',['moment'], factory) :
factory(global.moment)
}(this, function (moment) { 'use strict';
var da = moment.defineLocale('da', {
...
});
return da;
}));
define('messages',[],function(){
var da_messages = {
...
};
return da_messages;
});
は、我々は我々のアプリの残りの部分とロードする適切な言語ファイルを決定します。たとえば、私たちのda_DKファイルは次のように見えます。私たちのアプリケーションコードは、どのロケールが読み込まれているか分かりません。ロケールに依存するモジュールはすべてrequire('moment-locale')
とrequire('messages')
となります。
私はWebpackと同様のことをしたいと思っていますが、まだこれを達成する良い方法が見つかりませんでした。
私は動的要求のためにrequire.context
を見ましたが、そうしないと、すべての可能なロケールが自分のアプリにバンドルされてしまいます。
また、各ロケールファイルが "dll"である可能性があると思ってDllPluginを調べましたが、dllマニフェストに特定のモジュール名(例:node_modules/moment/locale/de-at.js)私はrequire('moment-locale')
、それはそのDLLを見てする必要がありますので、Webpackは知っているので、より一般的にする必要があります。
module.exports = {
'messages': require('messages'),
'moment-locale': require('moment-locale'),
...
};
、その後:それはのように見える各ロケールのエントリを作成するように、私は仕事にこれを取得することができた
一つの方法は、私のロケールのバンドルの生成コードを更新しましたwebpackの設定では、library
フィールドを私のアプリケーション用の名前空間に設定しました。そして、私のアプリのウェブパック設定では、externals
でこれらのモジュールを参照しました。つまり、da_DK.jsが読み込まれると、ロード時に参照するための名前空間の下のwindow
のすべてのモジュールが参照されます。私はむしろこのアプローチを使用したくないですが、それがこれまでのところこれを実現するための唯一の方法です。
これを達成する別の方法がありますか?
ありがとうございました! 1.私は、数多くのロケールをサポートしており、各ロケールバンドルが約600KBのところに座っているので、このアプローチを避けたいと思います。 2.私はこのアプローチを試みましたが、実行時までロケールを知らないので、可能なすべてのロケールをバンドルするための動的require/require.contextを使用しなければならないと思います。 3.現在、ロケールごとにバンドルを生成していますが、実行時に負荷がかかり、残りのアプリケーションとやりとりするという課題がありました。 –
約2.ロケールを別のファイルに分割する場合は、ロケールを別々に要求することができます。 3.私は、各ロケールごとに個別のバンドルを作成することを話していました。 _both_ "app code"とロケールを含むバンドル。 –