RequireJS加载Wicket库

时间:2016-12-21 03:43:20

标签: javascript requirejs wkt

我正在使用库Wicket来获取地图内容。如果我像往常一样将它作为脚本标记引用,它可以正常工作。工作链接如下。

  

https://arthur-e.github.io/Wicket/sandbox-gmaps3.html

当我们的项目使用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

有没有人经历过同样的事情?

1 个答案:

答案 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“。

净效应是,只要需要wicketwicket就会泄漏到全局空间,而Wkt应该可以正常工作。