Jsdom: كيف يمكنني استخدام JSDom مع بناء جملة الوحدة النمطية ES6؟

تم إنشاؤها على ٢٩ يوليو ٢٠١٦  ·  4تعليقات  ·  مصدر: jsdom/jsdom

يصف Stack Overflow المشكلة بالتفصيل:

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

لكن سؤالي الأساسي هو هذا: يجب أن "يلتف" jsdom حتى يتم استخدامه ، ولكن من المستحيل "التفاف" استيراد وحدة ES6 (على سبيل المثال ، import foo form 'bar' ) لأنه يجب أن يأتي قبل أي رمز. وإذا كان كود استخدام DOM جزءًا من الاستيراد نفسه ، فيجب تغليفه بواسطة 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 بعد انتهاء الاختبار).

على أي حال ، آمل أن يساعد ذلك أي شخص آخر يسير في هذا الطريق ، وشكرًا مرة أخرى للمساعدة في حلها.

ال 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. لم يتم تنفيذ الاستيراد بعد (في العقدة). من المحتمل أن يتم حل هذا تلقائيًا إلى حد ما عندما تنفذ العقدة تلك لنا ، على الرغم من أننا قد نضطر إلى تنفيذ أداة تحميل فعلية.

أولاً ، شكرًا على رابط 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 بعد انتهاء الاختبار).

على أي حال ، آمل أن يساعد ذلك أي شخص آخر يسير في هذا الطريق ، وشكرًا مرة أخرى للمساعدة في حلها.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

potapovDim picture potapovDim  ·  4تعليقات

mitar picture mitar  ·  4تعليقات

drewish picture drewish  ·  4تعليقات

domenic picture domenic  ·  3تعليقات

cg433n picture cg433n  ·  3تعليقات