Jsdom: Как я могу использовать JSDom с синтаксисом модуля ES6?

Созданный на 29 июл. 2016  ·  4Комментарии  ·  Источник: jsdom/jsdom

В этом переполнении стека подробно описывается проблема:

http://stackoverflow.com/questions/38651209/how-can-i-wrap-an-import-with-jsdom

Но в основном мой вопрос таков: jsdom должен «обернуть» код, чтобы его можно было использовать, но невозможно «обернуть» импорт модуля ES6 (т.е. import foo form 'bar' ), потому что они должны быть перед любым кодом. И если код, использующий DOM, является частью самого импорта, он должен быть обернут JSDom.

Это можно обойти?

Самый полезный комментарий

Во-первых, спасибо за вики-ссылку; это была часть головоломки, которая в конечном итоге привела меня к решению (в этом замечательном блоге: http://www.2ality.com/2014/09/es6-modules-final.html). В нем объясняется, что есть способ сделать импорт таким образом, чтобы он мог быть заключен в оболочку JSDom: System.import .

Вот решение проблемы для других любителей ES6 / JSDom:

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
            })
    }
});

ПРИМЕЧАНИЕ. Если вы используете тестовую среду, такую ​​как Mocha, вам нужно будет использовать ее асинхронную тестовую функциональность, чтобы заставить эту работу работать (т. Е. Вам нужен аргумент done в вашей функции it , а затем вам нужно будет вызвать done после завершения теста).

В любом случае, я надеюсь, что это поможет любому, кто идет по этому пути, и еще раз спасибо за помощь в его решении.

Все 4 Комментарий

Поскольку модули JS не поддерживаются ни в одном движке, вы, вероятно, используете какой-нибудь транспилятор, такой как Babel или TypeScript, для преобразования исходного кода в обычный поддерживаемый JavaScript, который может работать в Node.js или браузерах. Вы должны сделать то же самое перед загрузкой кода в jsdom. У нас нет намерения поддерживать то, что еще не реализовано в браузерах.

Ну, я использую Babel как часть Mocha, то есть mocha --compilers js:babel-core/register test.js . Итак, я использую транспилятор «перед тем, как скармливать [свой] код jsdom». Это просто не помогает из-за проблемы, которую я описал.

Это правда, что модули ES6 новые и не поддерживаются в браузере, поэтому я полностью понимаю, что не поддерживает их. Однако основные библиотеки используют их в своей документации, как если бы они были стандартом (например, Redux, http://redux.js.org/docs/basics/ExampleTodoList.html) ... что имеет смысл, потому что они (возможно) являются стандартной модульной системой для JS.

Итак, я предполагаю, что я говорю, что модули ES6 никуда не исчезнут, и эта проблема, похоже, им присуща. JSDom может решить проблему сейчас или отложить ее в сторону (_ полностью_ законный вариант), но в конечном итоге, если библиотека будет работать с этим набирающим популярность стандартом, кому-то придется заняться проблемой.

В любом случае, спасибо за рассмотрение вопроса.

Здесь вы столкнулись с двумя проблемами.

  1. Вы пытаетесь использовать jsdom как глобальную среду, а jsdom работает иначе. Даже если вы перейдете на commonjs, ваш код не будет работать. См. Эту страницу вики , на которой немного подробно описана проблема и мой комментарий по аналогичной проблеме. Возможно, вам удастся добиться этого, объединив слова babel и jest.
  2. импорт просто еще не реализован (в узле). Скорее всего, это будет решено в некоторой степени автоматически, когда node реализует их для нас, хотя нам, возможно, придется реализовать фактический загрузчик.

Во-первых, спасибо за вики-ссылку; это была часть головоломки, которая в конечном итоге привела меня к решению (в этом замечательном блоге: http://www.2ality.com/2014/09/es6-modules-final.html). В нем объясняется, что есть способ сделать импорт таким образом, чтобы он мог быть заключен в оболочку JSDom: System.import .

Вот решение проблемы для других любителей ES6 / JSDom:

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
            })
    }
});

ПРИМЕЧАНИЕ. Если вы используете тестовую среду, такую ​​как Mocha, вам нужно будет использовать ее асинхронную тестовую функциональность, чтобы заставить эту работу работать (т. Е. Вам нужен аргумент done в вашей функции it , а затем вам нужно будет вызвать done после завершения теста).

В любом случае, я надеюсь, что это поможет любому, кто идет по этому пути, и еще раз спасибо за помощь в его решении.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги