2014-07-10 29 views
4

我有一個Web應用程序使用Require來加載依賴關係。我有一組JS庫,使用Require config.shim對象包含在內。Require.js優化程序錯誤地訂購填充程序依賴關係

兩個這樣的例子庫是:

require.config({ 
    shim: { 
    "libs/leaflet": { 
     exports: "L" 
    } 
    "libs/leaflet-dvf": { 
     deps: ["libs/leaflet"], 
     exports: "L" 
    } 
} 

的第二個庫,leaflet-dvf需要第一,leaflet。第二個插件是第一個插件,它取決於第一個庫定義的全局範圍變量L

當我使用Require運行應用程序時,一切正常。我可以包括墊片庫,並且一切都很好。沒問題。

當我通過Require r.js Optimizer運行此代碼時,問題就出現了。優化器在構建單個優化的JS文件時會錯誤地排序依賴關係。在構建的文件中,leaflet-dvf代碼將在leaflet代碼之前出現。這會導致JS運行時錯誤,因爲依賴插件找不到所需的全局範圍變量L

我構建的配置是這樣的:

({ 
    baseUrl: "../js", 
    paths: { 
    "requireLib": "../js/libs/require" 
    }, 
    include: ["requireLib"], 
    name: "Main", 
    out: "bin/Main-built.js", 
    optimize: "none", 
    wrapShim: true 
}) 

當我運行了優化,使用犀牛,它建立我的輸出文件。在Main-built.js文件中,插件的代碼將出現在所需的庫之前。這會導致L undefined error

如何讓Optimizer尊重我的Shims的依賴順序,以便在我的Optimized JS文件中正確排列庫文件?

+0

[requireJS順序執行用於非AMD JS文件]的可能重複(http://stackoverflow.com/questions/17914786/requirejs-sequential-execution-for-non-amd-js-files) –

+0

這有點晚,但是如果你還沒有解決這個問題,你也需要在你的r.js配置文件中使用shim。應該修復它。 – Vishwanath

回答

1

我曾經有一個類似的問題,然後用挖空擴展和墊片無法正常工作。這是我們如何解決它的。

創建一個名爲模塊:leafletLib

define(["libs/leaflet","libs/leadleft-dvf"],function(leftlet,dvf){ 

    return leaflet; 
}); 

LeafletLib有主庫和所有的擴展。在具有傳單或傳單-dvf作爲依賴關係的模塊上,您可以調用leafletLib。這有點不好意思,但它可能適合你。

define(["leafletLib"],function(leafletLib){});