2016-03-23 9 views
1

Ich konvertiere gerade eine Reihe von JavaScript-Modulen in ECMAScript 6-Klassen. Wir verwenden require.js für den AMD-Loader und schreiben die define ([], ...) Logik manuell.Objekt unterstützt diese Aktion nicht neu x() nach babel transform

Wir verwenden Babel, um die ES 6-Klassen zurück zu ES 5 definierten Modulen zu übertragen. Meine bablerc Datei sieht wie folgt aus:

{ 
"presets": ["es2015"], 
"plugins": ["transform-es2015-modules-amd"] 
} 

Eine einfache Klasse sieht wie folgt aus

import x from "dev/x" 
import ko from "knockout" 
import z from "dev/z" 

export class y extends x { 
... 
} 

Die Ausgabe sieht MOSTLY rechts:

define(["exports","dev/x", "knockout", "dev/z"], function(x, knockout, z){ 

Object.defineProperty(exports,"__esModule",{value: true}); 

// Bunch of generated crap 
var y = exports.y = function(_x)...(_x2.default); 
} 

Also, wenn ich versuche zu tun:

var foo = new y(); 

Ich bekomme ein "Objekt nicht s Unterstützen Sie diese Aktion "JavaScript exception.

Ich habe versucht, den generierten Code zu ändern (was ich will nicht zu tun) zu lesen:

var y = exports = function(_x)...(_x2.default); 
Aber das nichts zu tun hat. Allerdings, wenn ich diese Zeile auf diese ändern:

return function(_x)...(_x2.default); 

oder fügen Sie diese Zeile:

var y = exports = function(_x)...(_x2.default); 
return y; 

Alles funktioniert, wie es sollte. Ich möchte die generierte Datei nicht jedes Mal ändern müssen, wenn wir eine Änderung vornehmen, ich möchte nur, dass Babel es tut und recht hat! Was fehlt mir hier?

UPDATE: Ich benutze system.js Teil der Druandal-Bibliotheken (durandaljs.com), die die Aufrufe zu erfordern, indem eine Funktion namens Aquire eine Modul-ID übergeben und es lädt. Also mache ich einen Anruf wie folgt aus:

system.acquire(moduleNameAndPath).then(function acquiredModuleFunc(acquiredModule) { 
    if (acquiredModule !== null || acquiredModule !== undefined){ 
     var item = new acquiredModule(); // Object doesn't support here... 
    } 
} 

wir dies mit einem Pseudo-polymorphen Verhalten einzuführen, wenn Ansicht Modelle erstellt, die eine Ansicht gebunden ist.

+0

Wenn Sie es als 'var y ändern = Exporte = ...' dann exportieren Sie nichts überhaupt, nur Neuzuweisung 'exports'. Wo genau machst du 'var foo = new y();' es ist nicht in deinem Beispiel-Modul, so ist es nicht klar. – loganfsmyth

+0

Entschuldigung ja, ich bin das Objekt in einem anderen Modul alle zusammen neu. Ich verwende Require, um sicherzustellen, dass das Modul geladen ist (sonst würde es überhaupt nicht funktionieren). Ich merke, dass ich mit dieser ersten Änderung nichts exportiere, aber das ist nur etwas, das ich bei einer anderen Suche gesehen habe, also dachte ich nur, ich würde es dort hineinwerfen, so wie ich es versucht habe. Hier geht es darum, was die Ausgabe von Babel ist ... – iMortalitySX

+2

Was Sie in dem anderen Modul machen, ist wahrscheinlich der wichtige Teil. Babels Leistung ist, was ich erwarten würde. Sie geben einen benannten Export namens "y" aus, in dem sich ein Konstruktor befindet. In dem Modul, in dem Sie es laden, müssen Sie entweder Babel benutzen oder 'define ([" y "], function (yModule) {new yModule.y();})' – loganfsmyth

Antwort

1

Sie exportieren den Konstruktor unter dem Namen y. In Ihrem Import (acquire) scheinen Sie versuchen, new auf dem Modulobjekt selbst zu verwenden. Stattdessen versuchen

system.acquire(moduleNameAndPath).then(function(acquiredModule) { 
    var Y = acquiredModule.y; 
    var item = new Y(); 
}); 
+0

Dies funktioniert, aber die Anzahl der Stellen, die ich ändern muss und die sich aufgrund der Kontrollen von Drittanbietern nicht ändern können, macht diese Lösung für mich nicht verfügbar Ich stimme Ihnen jedoch zu, dass dies der akzeptierte Weg zu sein scheint Muster), und ich werde irgendwann zu diesem Punkt kommen, ich muss mich langsam bewegen, damit ich keinen Haufen anderer Sachen zerbringe. " – iMortalitySX

+1

Ich akzeptiere dies als die Antwort, da es der richtige Weg ist. Die Idee ist dass, wenn du an alle ES6 kommst, nichts mehr von Bedeutung ist, aber ich war kein Aware Das wir ein irgendwie unakzeptiertes Muster hatten. Ich habe die Zeit damit verbracht, den Code zu reparieren. Danke für die Hilfe! – iMortalitySX

Verwandte Themen