dojo build - nls bundle,构建失败,除非bundle在“dojo / dojo”中?

时间:2013-06-23 15:55:01

标签: dojo dojo-build

这是我得到的构建失败的升华。症状是,当使用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: []
},

1 个答案:

答案 0 :(得分:8)

不应将NLS模块指定为包含在图层中。处理图层模块后,它们的所有NLS依赖项将自动捆绑到相关图层中,文件名后缀对应于每个可能的区域设置。例如对于图层MyLayer.js,您还会获得MyLayer_en-us.jsMyLayer_es-es.js等。这使访问者只能加载他们需要的语言包。

如果您想在图层中强制包含特定区域设置(例如,因为您知道所有访问者只会说英语),您可以使用includeLocales property执行此操作:

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

虽然您的第一个配置文件似乎可以正常工作,但它实际上不太可能达到预期效果,这可能就是ShrinkSafe崩溃的原因。

其他一些说明:

  1. 不推荐使用ShrinkSafe;你应该真的使用Closure Compiler或UglifyJS。
  2. customBase标志仅适用于主dojo/dojo层,表示“不自动包含默认的Dojo基本模块”。您无需将其应用于其他图层。