В этом переполнении стека подробно описывается проблема:
http://stackoverflow.com/questions/38651209/how-can-i-wrap-an-import-with-jsdom
Но в основном мой вопрос таков: jsdom должен «обернуть» код, чтобы его можно было использовать, но невозможно «обернуть» импорт модуля ES6 (т.е. import foo form 'bar'
), потому что они должны быть перед любым кодом. И если код, использующий DOM, является частью самого импорта, он должен быть обернут JSDom.
Это можно обойти?
Поскольку модули 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 может решить проблему сейчас или отложить ее в сторону (_ полностью_ законный вариант), но в конечном итоге, если библиотека будет работать с этим набирающим популярность стандартом, кому-то придется заняться проблемой.
В любом случае, спасибо за рассмотрение вопроса.
Здесь вы столкнулись с двумя проблемами.
Во-первых, спасибо за вики-ссылку; это была часть головоломки, которая в конечном итоге привела меня к решению (в этом замечательном блоге: 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
после завершения теста).
В любом случае, я надеюсь, что это поможет любому, кто идет по этому пути, и еще раз спасибо за помощь в его решении.
Самый полезный комментарий
Во-первых, спасибо за вики-ссылку; это была часть головоломки, которая в конечном итоге привела меня к решению (в этом замечательном блоге: http://www.2ality.com/2014/09/es6-modules-final.html). В нем объясняется, что есть способ сделать импорт таким образом, чтобы он мог быть заключен в оболочку JSDom:
System.import
.Вот решение проблемы для других любителей ES6 / JSDom:
ПРИМЕЧАНИЕ. Если вы используете тестовую среду, такую как Mocha, вам нужно будет использовать ее асинхронную тестовую функциональность, чтобы заставить эту работу работать (т. Е. Вам нужен аргумент
done
в вашей функцииit
, а затем вам нужно будет вызватьdone
после завершения теста).В любом случае, я надеюсь, что это поможет любому, кто идет по этому пути, и еще раз спасибо за помощь в его решении.