3

これは、私が得ていたビルドの失敗をまとめたものです。その症状は、shrinksafe で最適化すると、ビルドが次のエラーで失敗することでした。

 [exec] js: "<eval'ed string>#1(Function)#1(eval)", line 127: uncaught JavaScript runtime exception: TypeError: Cannot read property "1" from null
 [exec]     at <eval'ed string>#1(Function)#1(eval):127
 [exec]     at <eval'ed string>#1(Function)#1(eval):163

私のコードが次のようなパターンで nls ファイルを取り込んだ場合

"dojo/i18n!./nls/MyResource"

ただし、この構造は多くの Dojo コードで共通しており、クリーンにビルドされます。そこで、いくつかの dojo コードを自分のモジュールにコピーして実験したところ、nls リソースが dojo/dojo レイヤーにロードされた場合、レイヤーが正しくビルドされ、同じ nls リソースを自分のレイヤーにロードした場合、上記のエラーが発生することがわかりました。

したがって、これを最小限のケースに切り詰めて、dijit/form/_ComboBoxMenuMixin.js を自分のモジュールと対応する nls リソースにコピーしました。

3 つのテスト ケースがあり、1 つは機能し、他の 2 つは上記の失敗を示します。

私の質問:

「dojo/dojo」層に独自の nls リソースを含める必要があるようです。まさにこの層でなければなりません。さすがにこれはいけませんよね?私の代替手段は何ですか?

作業プロファイル:

layers: {
"dojo/dojo" : {
    customBase: false,
    include: [         
              "modules/nls/ComboBox",
    ],
    exclude: []
},
"MyLayer" : {
    customBase: false,
    include: [                            
              "modules/ComboCopy",                      
    ],
    exclude: []
},
}

失敗: 同じレイヤー内の nls

layers: {
"dojo/dojo" : {
    customBase: false,
    include: [         

    ],
    exclude: []
},
"MyLayer" : {
    customBase: false,
    include: [   
                  "modules/nls/ComboBox",                         
              "modules/ComboCopy",                      
    ],
    exclude: []
},
}

失敗しました。別のレイヤー名で nls をロードしてください

 layers: {
"myNlsLayer" : {
    customBase: false,
    include: [         
              "modules/nls/ComboBox",
    ],
    exclude: []
},
"MyLayer" : {
    customBase: false,
    include: [                            
              "modules/ComboCopy",                      
    ],
    exclude: []
},
4

1 に答える 1

8

NLS モジュールは、レイヤーに含まれていると指定しないでください。層モジュールが処理されると、すべての NLS 依存関係が関連する層に自動的にバンドルされ、可能な各ロケールに対応するファイル名サフィックスが付けられます。たとえば、レイヤーの場合、 、 などMyLayer.jsも取得します。これにより、訪問者は必要な言語バンドルのみをロードできます。MyLayer_en-us.jsMyLayer_es-es.js

レイヤ内に特定のロケールを強制的に含めたい場合 (たとえば、すべての訪問者が英語しか話さないことがわかっている場合)、includeLocales プロパティを使用してそうすることができます。

layers: {
    MyLayer: {
        includeLocales: [ 'en-us' ]
    }
}

最初のプロファイルが機能しているように見えても、実際に期待どおりに機能しているとは考えにくいため、ShrinkSafe がクラッシュする可能性があります。

その他の注意事項:

  1. ShrinkSafe は非推奨です。代わりに Closure Compiler または UglifyJS を使用する必要があります。
  2. このcustomBaseフラグはメイン層にのみ適用され、dojo/dojo「デフォルトの Dojo Base モジュールを自動的に含めない」ことを意味します。他のレイヤーに適用する必要はありません。
于 2013-06-30T01:39:14.787 に答える