2013-12-18 31 views
2

我在當前項目中使用requirejs,但有時它不加載依賴模塊並拋出錯誤「jQuery」undefined ...它不會總是發生...如果我刷新頁面,那麼它工作正常。我試圖增加waitSeconds,但沒有成功。requirejs有時不加載依賴模塊,並給出錯誤「jQuery」undefined

這裏:

require.config({ 
    paths: { 
     'jquery': 'lib/jquery-1.10.2.min',  
     'async': 'lib/async', 
     'slider': 'lib/jquery.bxslider.min', 
     'fixed-scroll': 'lib/iscroll', 
     'validation': 'validation-framework', 
     'main-nav': 'main-nav', 
     'global': 'global',  
     'page-animate': 'page-details-animation', 
     'details': 'page-details', 
     'pageMap': 'map' 
    }, 
    shim: { 
     'jquery': { 
      exports: '$' 
     }, 
     'details': { 
      deps: ['jquery'] 
     }, 
     'page-animate': { 
      deps: ['jquery'], 
      exports: 'pageAnimate.init' 
     }, 
     'slider': { 
      deps: ['jquery'], 
      exports: 'bxSlider' 
     }, 
     'fixed-scroll': { 
      exports: 'iScroll' 
     }, 
     'validation': { 
      deps: ['jquery'] 
     }  
    } 
}); 

require(['jquery', 'fixed-scroll', 'page-animate', 'main-nav', 'global', 'details', 'slider', 'pageMap', 'validation'], function() { 
    $('.page-details').pageDetails(); 
}); 

回答

3

由您報告的錯誤,我在這個問題看什麼看,我建議'details'需要一個墊片:

shim: { 
    [...] 
    'details': [ 'jquery' ] 
} 

我推斷這是由於到$('.page-details').pageDetails(),pageDetails必須由jQuery插件提供,並且該插件看起來像(根據所使用的名稱)聲明爲RequireJS的模塊爲'details'。你得到的錯誤與這個插件沒有被正確地修剪是一致的。一個jQuery插件需要加載jQuery來安裝自己,因此需要依賴。

是很好的瞭解,但不參與錯誤其他的事情:

  • jQuery的1.10.x並不需要進行勻。至少1.8以來一直如此。要求它作爲'jquery'(全部小寫),你會沒事的。

  • 您應該使用'jquery'模塊的值而不是依賴於全局$。所以,不要做:

    require(['jquery', ...], function() { 
        $.whatever(); 
    }); 
    

    ,但有功能參數命名$對應於'jquery'模塊:

    require(['jquery', ...], function ($) { 
        $.whatever(); 
    }); 
    

如果你曾經使用noConflict或需要支持的jQuery的多個版本(如果您使用需要特定版本的第三方庫,可能會發生這種情況),它會讓您的生活更輕鬆。