2012-06-09 120 views
16

我有一個相當大的使用RequireJS的Backbone.js項目。隨着項目規模的增長(這裏的「大小」指的是單獨模塊文件的數量),間歇性錯誤開始出現。大多數時候,它是一個對象錯誤:間歇RequireJS加載錯誤

Uncaught TypeError: object is not a function

有時,抱怨沒有被加載的模塊。

一旦項目通過r.js優化器運行,這些錯誤就會消失。它們僅在RequireJS加載單個模塊時發生。

這讓我想起了我的問題 - 當模塊數量達到一定數量時,RequireJS開始有模塊加載問題嗎?

+1

我懷疑,這的確是一個RequireJS問題,而是一些瀏覽器相關的一個。它是否在不同的瀏覽器中一致地失敗? RequireJS是否將任何問題(例如加載腳本時超時)記錄到控制檯? – Lucero

+0

我在Chrome中看到的最多,但我也看到它也出現在Firefox中。沒有RequireJS日誌或錯誤。正在發生的錯誤是當我嘗試實例化從加載的模塊導出的Javascript函數(原型)時。這是拋出,因爲該模塊似乎沒有正確加載,因爲JavaScript不承認它是一個函數。這是錯誤實際發生的時間 - 這只是有時候。剩下的時間,代碼執行得很好。無論如何,沒有RequireJS超時錯誤。 – redhotvengeance

+0

聽起來像加載/初始化問題的順序給我。請注意,如果您的代碼中存在循環依賴關係,則可以獲取未定義的引用,我會先查找它們。我們有一個由RequireJS加載的幾百個JS文件的項目,並且沒有任何問題(無論是在Chrome還是其他瀏覽器中)。 – Lucero

回答

5

這絕對是我在過去幾天遇到過的一個錯誤。加載一個模塊會導致應用程序不同部分中的第二個完全不相關的模塊在之前完美工作的位置變得未定義。我已經使用了RequireJS很多 - 這不是一個腳本加載或循環依賴問題。

domReady -calls-> new View1() -iterates-> new SubView() -depends-> text!template 
     -calls-> new View2() --> undefined! 

這會導致其他地方完全不相關的模塊變得不確定:首先我需要在二線視圖的文本文件被重複了好幾次(1800+)時遇到的錯誤最常見。我通過將SubView功能集成到View模塊中來解決它一段時間。

domReady -calls-> new CombinedView1() -depends-> text!template 
     -calls-> new View2() --> ... all good ... 

隨着項目的發展,我再次碰壁,真的需要找到解決的辦法。包含更多模塊會導致先前定義的模塊隨機變得不確定。要求拋出沒有錯誤,瀏覽器也不會。我沒有使用CoffeeScript或類似的東西。

我花了一些時間創建了一個我的應用程序的版本,它具有相同的模塊和依賴性結構,依賴的視圖,模型和集合被刪除。這工作得很好,所以我只能假設存在某種內存問題?但Chrome從不拋出任何錯誤。

我想我的下一步將是填充我的骨架應用程序與一些耗費內存的循環,看看會發生什麼:我會讓你知道它是怎麼回事。

使用Require v2.0.1,所以沒有訂單插件 - 依賴項和包都使用shim config指令進行配置。 非AMD模塊加載:

  • 骨幹
  • 下劃線
  • jQuery的
  • 單張
  • 引導

P.S.道歉,如果這不是在正確的地方。我認爲這會更好,但我真的不能在任何地方看到評論按鈕。

更新: 這種依賴性結構打破了一貫:

Main 
    - View 1 
     - text!... 
     - View 2 
     - text!... 

替換空字符串文字每次工作正常:

Main 
    - View 1 
     - View 2 

那麼,爲什麼等待加載導致文本視圖1在主模塊中顯式設置爲依賴項時變爲未定義?當然,Main不應該被調用,直到它依賴的所有東西都被加載了?

+1

我得到了完全相同的問題。另請參閱https://groups.google.com/forum/?fromgroups#!topic/requirejs/Eym3R08Bmmg –

+0

顯然,還需要視圖1中View 2的「text!...」依賴性,才能使模塊再次正確加載。不漂亮,但它的作品。 –

+0

很高興聽到我不瘋狂 - 如果它是間歇性的,它顯然不能成爲循環依賴問題。顯然是更深層次的事情。我將跟隨您打開的Google網上論壇,@SteveBeer。 – redhotvengeance

5

我一直在爭取與同發佈最後的日子,這就是我發現的:

顯然,通過text.js插件需要模板的嵌套依賴性結構可能會導致競爭條件,當requirejs認爲它是頂級模塊時,它不能做好準備。我只是碰到了這個問題,當我有幾個這種類型的嵌套模塊依賴結構:

Router 
    -> View1 
    -> text!.../view1.html 
    -> View2 
     -> text!.../view2.html 
    -> View3 
    -> text!.../view3.html 
    -> View4 
     -> text!.../view4.html 
    -> View5 
    -> text!.../view5.html 
    -> View6 
     -> text!.../view6.html 
    -> View7 
    -> text!.../view7.html 
    -> View8 
     -> text!.../view8.html 

有了這個結構,我得到了像TypeErrors「視圖1不是構造函數」當路由器嘗試實例的意見。

而且需要在頂層欣賞到嵌套視圖模板解決了我的問題:

Router 
    -> View1 
    -> text!.../view1.html 
    -> text!.../view2.html 
    -> View2 
     -> text!.../view2.html 
    -> View3 
    -> text!.../view3.html 
    -> text!.../view4.html 
    -> View4 
     -> text!.../view4.html 
    -> View5 
    -> text!.../view5.html 
    -> text!.../view6.html 
    -> View6 
     -> text!.../view6.html 
    -> View7 
    -> text!.../view7.html 
    -> text!.../view8.html 
    -> View8 
     -> text!.../view8.html 

我真的不知道該怎麼require.js的作品,但是這看起來對我來說,這些嵌套文本!當設置父模塊的某個「準備就緒」標誌時,不會考慮調用。

+0

是的,這看起來是什麼導致了這個問題。我也使用了很多文字!電話,所以看起來問題在那裏。 – redhotvengeance