يصف Stack Overflow المشكلة بالتفصيل:
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 حل المشكلة الآن أو التخلص من العلبة على الطريق (خيار شرعي تمامًا) ، ولكن في النهاية إذا كانت المكتبة ستعمل مع هذا المعيار الشائع بشكل متزايد ، فسيتعين على شخص ما معالجة المشكلة.
في كلتا الحالتين ، شكرا للنظر في القضية.
هناك مشكلتان تواجهان هنا.
أولاً ، شكرًا على رابط wiki ؛ لقد كانت قطعة في اللغز هي التي قادتني في النهاية إلى الحل (في هذه المدونة الرائعة: http://www.2ality.com/2014/09/es6-modules-final.html). كما يوضح ، هناك _is_ طريقة للقيام بالاستيراد بطريقة يمكن تغليفها بواسطة 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
})
}
});
ملاحظة: إذا كنت تستخدم إطار اختبار مثل موكا، وسوف تحتاج إلى استخدام انها وظيفة اختبار متزامنة لجعل هذا العمل (أي كنت في حاجة الى done
حجة في حياتك it
وظيفة، وبعد ذلك ستحتاج إلى استدعاء done
بعد انتهاء الاختبار).
على أي حال ، آمل أن يساعد ذلك أي شخص آخر يسير في هذا الطريق ، وشكرًا مرة أخرى للمساعدة في حلها.
التعليق الأكثر فائدة
أولاً ، شكرًا على رابط wiki ؛ لقد كانت قطعة في اللغز هي التي قادتني في النهاية إلى الحل (في هذه المدونة الرائعة: http://www.2ality.com/2014/09/es6-modules-final.html). كما يوضح ، هناك _is_ طريقة للقيام بالاستيراد بطريقة يمكن تغليفها بواسطة JSDom:
System.import
.إليك حل المشكلة لمحبي ES6 / JSDom الآخرين:
ملاحظة: إذا كنت تستخدم إطار اختبار مثل موكا، وسوف تحتاج إلى استخدام انها وظيفة اختبار متزامنة لجعل هذا العمل (أي كنت في حاجة الى
done
حجة في حياتكit
وظيفة، وبعد ذلك ستحتاج إلى استدعاءdone
بعد انتهاء الاختبار).على أي حال ، آمل أن يساعد ذلك أي شخص آخر يسير في هذا الطريق ، وشكرًا مرة أخرى للمساعدة في حلها.