Jsdom: Wie kann ich JSDom mit der ES6-Modulsyntax verwenden?

Erstellt am 29. Juli 2016  ·  4Kommentare  ·  Quelle: jsdom/jsdom

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?

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:

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.

Alle 4 Kommentare

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.

  1. Sie versuchen, jsdom als globale Umgebung zu verwenden, was nicht der Funktionsweise von jsdom entspricht. Selbst wenn Sie zu commonjs wechseln, würde Ihr Code nicht funktionieren. Siehe diese Wiki-Seite , die das Problem ein wenig detailliert beschreibt und meinen Kommentar zu einem ähnlichen Problem. Sie können dies vielleicht schaffen, indem Sie Babel und Scherz kombinieren.
  2. import ist nur noch nicht implementiert (in node). Es besteht die Möglichkeit, dass dies etwas automatisch gelöst wird, wenn der Knoten diese für uns implementiert, obwohl wir möglicherweise einen tatsächlichen Loader implementieren müssen.

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen