2016-12-21 154 views
1

我正在使用庫Wicket地圖的東西。如果我將它作爲正常腳本標記引用它,它工作正常。工作鏈接如下。RequireJS加載Wicket庫

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

問題出現在我們的項目使用RequireJS作爲模塊加載器時。

這是我試過的以下代碼。

require.config({  
    waitSeconds: 200, 
    paths: { 
     'wicket': '/Vendor/Wicket/wicket', 
     'wicketGmap3': '/Vendor/Wicket/wicket-gmap3' 
    }, 
    shim: { 
     wicket: { 
      exports: 'Wkt' 
     }, 
     wicketGmap3: {    
      deps: ['wicket'] 
     }   
    }, 
}); 
require(['wicket', 'wicketGmap3'],(Wkt) => { 
    $(() => { 
     angular.bootstrap(document, ['app']); 
    }); 
}); 

錯誤仍然如下。

Uncaught ReferenceError: Wkt is not defined at wicket-gmap3.js:744

有沒有人遇到過相同的問題?

回答

2

wicket.js文件的電話號碼是define。因此,爲shim設置沒有用處,因爲shim僅適用於非AMD「模塊」(即不是真正的模塊,但我們希望表現得好像是它們的文件)。 AMD模塊請撥define。另一方面wicket-gmap3.js不是AMD模塊。所以你需要它shim。但是,這取決於全球空間中存在的Wktwicket.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,但並讓RequireJS需要從文件名模塊名命名該文件wicket-glue.js。)

我還添加了一個map基本上「中說:所有模塊,當需要模塊wicket時,請改爲加載wicket-glue,但在wicket-glue時需要wicket,請加載wicket「。

實際結果是,無論何時需要wicketWkt將泄漏到全局空間,wicket-glue應該正常工作。