2013-06-10 9 views
10

Meine Anwendung Verwendung require.js zu laden, ich habe einen zufälligen Fehler (geschieht 1 mal für 50 reload) Require.js in der Konsole zu schreiben:Require.js Fehler zufällig fehlgeschlagen Ressource

Fehler beim Laden Ressource: der Server mit einem Status von 404 geantwortet (Not Found)

Tat require.js versucht jquery von einem falschen Verzeichnis aufzunehmen ... ich weiß nicht, warum, die meiste Zeit die Anwendung funktioniert gut ...

Meine Config ist ziemlich einfach:

require.config({ 
    shim: { 
    underscore: { 
     exports: '_' 
    }, 
    backbone: { 
     deps: ['underscore', 'jquery'], 
     exports: 'Backbone' 
    }, 
    animate_from_to: { 
     deps: ['jquery'] 
    }, 
    bootstrap: { 
     deps: ['jquery'] 
    }, 
    zoom: { 
     deps: ['jquery'] 
    }, 
    shop_util: { 
     deps: ['jquery'] 
    }, 
    pricer: { 
     deps: ['jquery'] 
    }, 
    filter: { 
     deps: ['jquery'] 
    }, 
    paginator: { 
     deps: ['jquery'] 
    }, 
    }, 
    paths: { 
    bootstrap:  'lib/bootstrap', 
    jquery:   'lib/jquery-1.9.1', 
    zoom:    'lib/jquery.zoom.min', 
    animate_from_to: 'lib/jquery.animate_from_to-1.0.min', 
    backbone:   'lib/backbone.min', 
    underscore:  'lib/underscore.min', 
    text:    'lib/require-text', 
    shop_util: 'lib/shop_util', 
    pricer:   'lib/pricer', 
    filter:   'lib/filter', 
    paginator:  'lib/paginator', 
    } 

}); 

Danke

+0

Welches Verzeichnis versucht es zu laden? – landons

+0

Es versucht, aus dem Verzeichnis der Datei "require.config" zu laden. /js/jquery.js anstelle von /js/lib/jquery.1-9-1.js –

+0

Interessant. Tritt das gleiche Verhalten in mehreren Browsern auf? – landons

Antwort

20

Es scheint, dass Sie einen anderen Einstieg in Ihre Anwendung irgendwo anders als Ihre Daten-Haupt-Skript (js/main.js). Selbst wenn es sich um ein nachfolgendes Skript auf derselben Seite handelt, können Sie sich nicht darauf verlassen, dass Ihr Hauptscript für die Datenverarbeitung abgeschlossen ist, bevor das nächste Skript ausgeführt wird, since it's loaded with async attribute.

<script data-main="js/main" src="js/lib/require.js"></script> 
<!-- foo.js might run before js/main.js !!! --> 
<script src="js/foo.js"></script> 

Sie können dies unter Beweis stellen, indem eine console.log Aussage am Ende js/main.js und einen in foo.js (oder was auch immer) hinzufügen. Normalerweise werden Sie das von js/main.js und dann von foo.js sehen, aber in dem Fall von 1 von 50 werden Sie sehen, dass sie in der anderen Reihenfolge passieren.

Es gibt verschiedene Strategien, um damit umzugehen:

1 - Haben alle Ihre App Einleitung, die erforderlich ist aus Ihren Daten-Haupt-Skript

Gilt für Einzelseiten-Apps, natürlich. Alles in einer Datei:

require.config({ 
    // snip 
}); 
require(['mymodule'], function(mymodule) { 
    // do stuff 
}); 

2 - Verwenden Sie einen Inline-Skript direkt nach dem require.js Script-Tag

Anstatt das obige Skript in einer separaten Datei mit Daten-Haupt verwiesen zu haben, nur haben ein zweites Skript-Tag rechts unten. Dies ist das erste Beispiel listed in the docs.

gilt vor allem für Einzelseiten-apps

3 - Ihre Konfiguration in globale Variable erfordern Laden vor dem require.js Script-Tag

Zweites Beispiel listed in the docs.

<script> 
    var require = { 
     paths: { // define them} 
     shim: { // define them } 
    }; 
</script> 
<script src="scripts/require.js"></script> 

gilt vor allem für Einzelseiten-apps

4 - Nest Ihre Anrufe benötigen die die Config erste

Dies funktioniert am besten für mehrseitige Anwendungen zu laden und wird derjenige empfohlen in the multi-page shim app example

<script src="js/lib/require.js"></script> 
<script> 
    //Load common code that includes config, then load the app 
    //logic for this page. Do the require calls here instead of 
    //a separate file so after a build there are only 2 HTTP 
    //requests instead of three. 
    require(['./js/common'], function (common) { 
     //js/common sets the baseUrl to be js/ so 
     //can just ask for 'app/main1' here instead 
     //of 'js/app/main1' 
     require(['app/main1']); 
    }); 
</script> 

Verwandte Fragen here, here und here

+1

Ganz richtig! Ich wählte die 4. Methode, die "require.js compliant" laut mir. Vielen Dank ! –

+0

Soll require.j das nicht tun, basierend auf der Reihenfolge der Dateien im Array-Argument? – Yuck

+0

@Yuck Nein, ist es nicht. Das ist der Async-Teil von AMD - Sie wissen nicht, in welcher Reihenfolge die Dateien aufgelöst werden, sondern nur, bevor sie Ihre Funktion aufrufen. – explunit

Verwandte Themen