2016-08-08 21 views
0

Ich erhalte einen undefinierten Fehler von einer neuen Bibliothek, die ich gerade an requireJS angeschlossen habe. Ich weiß, dass der undefinierte Fehler mit dem 'wNumb'-Modul in Verbindung steht, das nicht geladen wird, bevor es verwendet wird. Wenn ich 'wNumb' Modul in config.js wie folgt laden: require(['main', 'wNumb']); funktioniert alles.RequireJS lädt das Modul nicht, bevor es seine Variablen verwendet

// conifg.js 
require.config({ 
    paths: { 
    'main': 'main', 
    'socketio': './libs/socket.io/socket.io', 
    'plotly': './libs/plotly/plotly-latest.min', 
    'renderDataToPlotly': './scripts/renderDataToPlotly', 
    'noUISlider': './libs/noUiSlider.8.5.1/nouislider.min', 
    'wNumb': './libs/wnumb-1.0.2/wNumb', 
    'sliders': './scripts/sliders', 
    'makePlotlyWindowResponsive': './scripts/makePlotlyWindowResponsive' 
    } 
}); 

require(['main']); 

// main.js 
define([ 
    'socketio', 
    'sliders', //---------------------------------------------> NOTE: sliders.js loading here 
    'makePlotlyWindowResponsive', 
    'renderDataToPlotly' 
    ], 
    function(io, sliders, makePlotlyWindowResponsive, renderDataToPlotly) { 
    // 
    } 
); 

// sliders.js 
define(['noUISlider', 'wNumb'], function(noUISlider, wNumb) { 
    console.log(wNumb); // ---------------------------------------------------> undefined 
}); 

Frage: Warum ist das passiert? Sollte 'wNumb' nicht zu der Zeit console.log(wNumb); ausgeführt werden?

Danke

+0

Sind Sie sicher, dass das wNumb-Modul etwas definiert? Vielleicht wurde es geladen, aber es exportiert nichts –

+0

Ziemlich sicher. Wenn ''wNumb'' nichts exportiert, wird' 'config.js'' innerhalb der' require (['main', 'wNumb']); 'gesetzt, würde keinen Unterschied machen, tut es aber in der Tat. – thorstorm

+0

Haben Sie etwas in der Variable 'noUISlider'? –

Antwort

1

In der Tat, wenn Sie Probleme mit einer Bibliothek haben, die Sie mit RequireJS verwenden, sollten Sie überprüfen, wie es sich selbst exportiert. Die Dokumentation sagt Ihnen manchmal, mit was es kompatibel ist. Andernfalls müssen Sie den Quellcode lesen. So verwendet wNumb 1.0.2 mit RequireJS haben haben sie verhalten sie meist wie ein richtiges AMD-Modul müssen Sie einen Shim verwenden:

shim: { 
    wNumb: { 
     exports: "wNumb", 
    }, 
} 

Dies wird mit dem Modul gibt den Wert der globalen Variablen wNumb (die die gleiche ist wie window.wNumb). Auf diese Weise erhalten Sie Bibliotheken, die nichts über AMD wissen, sich aber im globalen Raum exportieren, um mit RequireJS zu arbeiten.

jedoch wenn Sie wNumb auf 1.0.4 aktualisieren können, die besser wäre, da diese Version die proper code eingeführt hat wNumb ein richtiges AMD-Modul zu machen: es ruft define, wenn es erkennt, dass es ein AMD-Loader zur Verfügung. Sie brauchen dann keine shim.

+0

Ich ging für die Änderung der 'wNumb'code selbst Einführung der [code] (https://github.com/leonggersen/wnumb/blob/8d55075e77bda7c91acbc552fc1cb28346ca6ce4/wNumb.js#L3) Sie wies darauf hin. Es ist gut zu wissen, was 'exports' in' shim' tatsächlich tut. Danke @Louis – thorstorm

0

fand ich heraus, was im Inneren des 'wNumb' Modul vorging. Ich las 'wNumb' Code und sah am Ende der Datei dieser: enter image description here

Offenbar 'wNumb' zum Fenster Objekt exportiert wurde. Wenn ich window.wNumb (1, auf dem Bild) innerhalb sliders.js verwende, gibt es die erwartete Funktion (2, auf dem Bild) zurück. Als Beweis: enter image description here