这是我得到的构建失败的升华。症状是,当使用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: []
},
答案 0 :(得分:8)
不应将NLS模块指定为包含在图层中。处理图层模块后,它们的所有NLS依赖项将自动捆绑到相关图层中,文件名后缀对应于每个可能的区域设置。例如对于图层MyLayer.js
,您还会获得MyLayer_en-us.js
,MyLayer_es-es.js
等。这使访问者只能加载他们需要的语言包。
如果您想在图层中强制包含特定区域设置(例如,因为您知道所有访问者只会说英语),您可以使用includeLocales property执行此操作:
layers: {
MyLayer: {
includeLocales: [ 'en-us' ]
}
}
虽然您的第一个配置文件似乎可以正常工作,但它实际上不太可能达到预期效果,这可能就是ShrinkSafe崩溃的原因。
其他一些说明:
customBase
标志仅适用于主dojo/dojo
层,表示“不自动包含默认的Dojo基本模块”。您无需将其应用于其他图层。