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 资源中。

我有三个测试用例,一个有效,另外两个给出上述失败。

我的问题:

好像我需要在“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.js,MyLayer_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 回答