Dieser Stack Overflow beschreibt das Problem im Detail:
http://stackoverflow.com/questions/38651209/how-can-i-wrap-an-import-with-jsdom
Aber im Grunde ist meine Frage folgende: jsdom muss Code "verpacken", um verwendet zu werden, aber es ist unmöglich, einen ES6-Modulimport zu "verpacken" (dh import foo form 'bar'
), da sie vor jedem Code stehen müssen. Und wenn DOM-verwendender Code Teil des Imports selbst ist, muss er von JSDom umschlossen werden
Gibt es einen Weg, dies zu umgehen?
Da JS-Module in keiner Engine unterstützt werden, verwenden Sie vermutlich einen Transpiler wie Babel oder TypeScript, um Ihre Quelle in normales, unterstütztes JavaScript zu konvertieren, das in Node.js oder Browsern ausgeführt werden kann. Sie sollten dasselbe tun, bevor Sie Ihren Code an jsdom füttern. Wir haben nicht die Absicht, etwas zu unterstützen, das noch nicht in Browsern implementiert ist.
Nun, ich benutze Babel als Teil von Mocha, dh mocha --compilers js:babel-core/register test.js
. Also verwende ich einen Transpiler "bevor ich [meinen] Code an jsdom füttere". Es hilft einfach nicht, wegen des von mir beschriebenen Problems.
Es ist wahr, dass ES6-Module neu sind und im Browser nicht unterstützt werden, daher würde ich absolut verstehen, dass sie nicht unterstützt werden. Große Bibliotheken verwenden sie jedoch in ihrer Dokumentation als wären sie der Standard (z. B. Redux, http://redux.js.org/docs/basics/ExampleTodoList.html) ... was Sinn macht, weil sie (wohl) sind das Standard-Modulsystem für JS.
Ich denke also, was ich sagen möchte, ist, dass ES6-Module nicht verschwinden, und dieses Problem scheint ihnen immanent zu sein. JSDom kann das Problem jetzt lösen oder die Dose auf den Weg bringen (eine _völlig_ legitime Option), aber wenn die Bibliothek letztendlich mit diesem immer beliebter werdenden Standard arbeiten soll, muss jemand das Problem angehen.
So oder so, danke für die Berücksichtigung des Problems.
Es gibt zwei Probleme, auf die Sie hier stoßen.
Zunächst einmal vielen Dank für den Wiki-Link; es war ein Puzzleteil, das mich letztendlich zur Lösung führte (in diesem tollen Blog: http://www.2ality.com/2014/09/es6-modules-final.html). Wie es erklärt, gibt es eine Möglichkeit, Importe so durchzuführen, dass sie von JSDom verpackt werden können: System.import
.
Hier ist die Lösung des Problems für andere ES6/JSDom-Liebhaber:
import jsdom;
jsdom({
html: '<div></div>',
done: () => {
// don't do this:
// import setup from 'setup';
// do this:
System.import('setup')
.then((setup) => {
// test code that uses setup
})
}
});
HINWEIS: Wenn Sie ein Testframework wie Mocha verwenden, müssen Sie dessen asynchrone Testfunktionalität verwenden, damit dies funktioniert (dh Sie benötigen ein done
Argument in Ihrer it
Funktion, und dann müssen Sie done
aufrufen, nachdem der Test abgeschlossen ist).
Wie auch immer, ich hoffe, dass das jedem anderen hilft, diesen Weg zu gehen, und danke noch einmal für die Hilfe bei der Lösung.
Hilfreichster Kommentar
Zunächst einmal vielen Dank für den Wiki-Link; es war ein Puzzleteil, das mich letztendlich zur Lösung führte (in diesem tollen Blog: http://www.2ality.com/2014/09/es6-modules-final.html). Wie es erklärt, gibt es eine Möglichkeit, Importe so durchzuführen, dass sie von JSDom verpackt werden können:
System.import
.Hier ist die Lösung des Problems für andere ES6/JSDom-Liebhaber:
HINWEIS: Wenn Sie ein Testframework wie Mocha verwenden, müssen Sie dessen asynchrone Testfunktionalität verwenden, damit dies funktioniert (dh Sie benötigen ein
done
Argument in Ihrerit
Funktion, und dann müssen Siedone
aufrufen, nachdem der Test abgeschlossen ist).Wie auch immer, ich hoffe, dass das jedem anderen hilft, diesen Weg zu gehen, und danke noch einmal für die Hilfe bei der Lösung.