我正在使用库Wicket来获取地图内容。如果我像往常一样将它作为脚本标记引用,它可以正常工作。工作链接如下。
当我们的项目使用RequireJS进行模块加载时,问题出现了。
这是我尝试过的以下代码。
with
table_a ( rec_id, col1, col2, col3 ) as (
select 2, 'val1', 'val2', 'val3' from dual union all
select 3, 'val4', '' , 'val6' from dual union all
select 8, '' , '' , '' from dual
)
-- end of test data; query begins below this line
select *
from table_a
unpivot ( value for type in ( col1 as 'col1', col2 as 'col2', col3 as 'col3') )
;
REC_ID TYPE VALUE
------ ---- -----
2 col1 val1
2 col2 val2
2 col3 val3
3 col1 val4
3 col3 val6
错误仍然如下。
未捕获的ReferenceError:wkt未在wicket-gmap3.js中定义:744
有没有人经历过同样的事情?
答案 0 :(得分:2)
wicket.js
文件呼叫define
。因此为它设置shim
是没用的,因为shim
仅对非AMD“模块”有意义(即文件不是真正的模块,但我们希望它们的行为就像它们一样)。 AMD模块调用define
。
另一方面,wicket-gmap3.js
不是AMD模块。所以你做需要shim
。但是,它取决于Wkt
在全球空间中的存在。 wicket.js
中的逻辑是这样的,当它调用define
时,它不会在全局空间中设置Wkt
。 (对于性能良好的AMD模块, 是正确的行为。)您需要自己执行泄漏。
将您的配置更改为:
define("wicket-glue", ["wicket"], function (wicket) {
Wkt = wicket; // Deliberately leak into the global space.
return wicket;
});
require.config({
waitSeconds: 200,
paths: {
'wicket': '/Vendor/Wicket/wicket',
'wicketGmap3': '/Vendor/Wicket/wicket-gmap3'
},
map: {
'*': {
wicket: 'wicket-glue',
},
'wicket-glue': {
wicket: 'wicket'
}
}
shim: {
wicketGmap3: {
deps: ['wicket']
}
},
});
我添加了一个名为wicket-glue
的新模块。我经常将这些模块与配置放在一起,这样它们就不需要额外的数据获取。如果你愿意的话,你也可以把它放在一个单独的文件中。 (如果我这样做,我会删除define
的第一个参数,并将文件命名为wicket-glue.js
,以便RequireJS从文件名中获取模块名称。)
我还添加了map
,基本上说“在所有模块中,当需要模块wicket
时,请加载wicket-glue
,但wicket-glue
{ {1}}是必需的,请加载wicket
“。
净效应是,只要需要wicket
,wicket
就会泄漏到全局空间,而Wkt
应该可以正常工作。