Jest: دعم RequireJS

تم إنشاؤها على ١٥ مايو ٢٠١٤  ·  84تعليقات  ·  مصدر: facebook/jest

إذا فهمتها بشكل صحيح ، فلا توجد طريقة حاليًا لاستخدام هذا مع RequireJS بدلاً من أسلوب CommonJS الذي يتطلب (). هل هناك أي خطط لإضافة دعم لـ RequireJS؟ هل هو ممكن حتى؟

التعليق الأكثر فائدة

يمكن أن يكون برنامج babel-plugin-transform-amd-to-commonjs مفيدًا في حل مشكلة Jest + AMD ، خاصةً إذا كنت تستخدم بالفعل شيئًا مثل babel-jest.

لقد قمت بإعداد مثال لمشروع يوضح كيف يمكنك أن تطلب Jest بشفافية ملفات AMD عن طريق تشغيل التحويل في بيئة الاختبار.

لست متأكدًا من تفاصيل مثل هذا النهج في مشروع فعلي - لا سيما النهج الجيد لمشاركة التكوين بين Jest / RequireJS / Webpack / إلخ. سيكون دعم Jest لملف تكوينات .js خطوة نحو حل أكثر قابلية لإعادة الاستخدام (راجع https://github.com/facebook/jest/issues/2140).

ال 84 كومينتر

++

توجد في خارطة الطريق الخاصة بنا لدعم الوظائف الإضافية لنظام الوحدات النمطية لـ Jest (مثل طراز يتطلب js ، ووحدات es6 ، وما إلى ذلك) ، ولكن للأسف لم نصل إلى هذا الحد بعد.

دعنا نترك هذه المشكلة مفتوحة لتتبع التقدم المحرز في هذا ، على الرغم من - أعتقد أنه سيكون من المفيد جدًا دعم برامج تحميل need.js

jeffmo webpack يدعم Commonjs / es6 / amd. إذا تمكنا من إدخال المزاح كمكوِّن إضافي ، فربما يمكننا الحصول على كل هذه الأشياء مجانًا.

++

لدينا العديد من المشاريع في مؤسسة كبيرة ونخطط لاستخدام الدعابة ولكننا نطلب 100٪. أي إتا على تكامل ديجيسس؟

++

أود أيضًا تجربة المزاح ، لكن المشروع الحالي الذي أعمل عليه يستخدم RequireJS.

: +1:

اقترح أحدهم استخدام هذا كحاجز ، هل جربه أحد؟

https://github.com/Jakobo/redefine

_المجدية مع التحذيرات_. لقد قمت بتنفيذ القليل من البناء مع nodefy في بعض الريبو العشوائي الذي يمكن أن يفعل الحيلة كإيقاف فجوة. انظر scripts.cjs ضمن الحزم .

اختبار Litmus: تتوافق الأسماء المستعارة لوحدة AMD مع الوحدة المقابلة ضمن node_modules . إذا فشل اختبار عباد الشمس ، لكنك يائسًا ، يمكنك الإيماء بوحدات AMD النقية و / أو إضافة روابط رمزية إلى وحدات node_modules ، لكن الفكرة تجعلني حزينًا. من وجهة نظري ، تميل العناصر الخارجية التي أستخدمها إلى تنفيذ UMD وتثبيته بواسطة npm لأسماء تتماشى مع الأسماء المستعارة لـ AMD - ليست مشكلة كبيرة.

(لقد قمت بسحب uRequire قبل nodefy ، لكن قالب CommonJS يجعله مكافئًا وظيفيًا لـ nodefy - سآخذ الأداة المستهدفة. لقد تحققت أيضًا من amdefine ، لكن jest يستخدم مطابقة regex عند "يتطلب" - ربما يكون هناك AMD مجهول زاوية؟ هناك دائمًا UMD ، لكن تشفير UMD بمراجع متناثرة document يبدو وكأنه أخلاق سيئة.)

+1

++

نحن نستخدم رد الفعل والعمود الفقري والمتطلب في جميع التعليمات البرمجية الخاصة بالعميل الجديد. أود أن أكون قادرًا على استخدام الدعابة وتخفيف بعض آلام اختبار التفاعل. سيكون من الجيد أن تنزل الأشياء إلى مستوى الوحدة. حاليًا ، يتم إجراء اختباراتنا لرمز التفاعل باستخدام rspec و webdriver. بينما يعمل هذا فهو أقل من مثالي لأسباب واضحة.

هل هناك أي حل عملي حتى الآن؟ المشكلة الرئيسية التي أواجهها هي عبارات التعريف التي تغلف مكونات التفاعل.

+1

petehunt حولني إلى Webpack ، لذلك هذا شيء يجب مراعاته أيضًا.

+1

هل يمكن لأي شخص أن يوجهني إلى مثال على Jasmine / webpack أو jest / webpack الذي يقوم بتشغيل اختبارات المتصفح مع تغطية الكود؟

++

متى يمكن أن نتوقع الدعم من أجل needjs؟

+1

+1

+1

+1

+1

+1

إذا كنت تستخدم module.exports بدلاً من العودة لاستدعاء التعريف الخاص بك ، يمكنك إضافة هذا إلى معالجك المسبق.

يعمل بالنسبة لي: ممتاز:

// preprocessor.js
var ReactTools = require('react-tools');
module.exports = {
  process: function(src) {
    if (/define\(.*?\{/.test(src)) {
      //Remove AMD ceremony for use without require.js or almond.js
      src = src.replace(/define\(.*?\{/, '')
        .replace(/(}\);|}\))$/,'');
    }

    return ReactTools.transform(src);
  }
};

++

+1

+1

+1 للحصول على دعم RequireJS

+1

charliedowler هل تمانع في توضيح هذا النهج أكثر قليلاً. أنا أجربها وأواجه مشكلتين. لقد بدأت بإضافة

if (typeof(module) == 'object' && module.exports) { module.exports = <my_element>;  }

ومع ذلك ، فأنا أستخدم return ، لذا أتلقى خطأ محلل من المعالج المسبق. اعتقدت أنني يمكن أن أفلت من خلال تمديد RegEx لتتناسب أيضًا مع آخر عودة. لكن لا يبدو أنها تعمل على الإطلاق. ما زلت أتلقى خطأ "بيان الإرجاع غير القانوني". ربما يكون هناك شيء خاطئ في التعبير ، وهو لا يلحق به.

if (/define\(.*?\{/.test(src)) {
  src = src.replace(/(define\(.*?\{|return.*[\s]}\);?$)/g,'');  
}

هل هناك طريقة لكتابة src إلى stdout؟ لا يعمل console.log بسيط.

وأخيرًا ، على افتراض أن كل هذا يعمل. كيف تتعامل مع التبعيات؟ مثل React على سبيل المثال؟

+1

آه! كنت ألعب مع (وأستمتع كثيرًا بمزاح). حاولت سحبها إلى مشروع فعلي اليوم واكتشفت عدم وجود دعم يتطلب JS: سوب: ... كسر الصفقة لجميع المشاريع "الحقيقية" الحالية. حزين حقا. لقد كانت بالتأكيد فكرة مثيرة!

: +1:

+1

+1

: +1:

:ممتاز:

: +1:

: +1:

لذا فقد قمت بحل هذا باستخدام حزمة الويب لتجميع وحدات واختبارات AMD الخاصة بي معًا. سمح لي هذا أيضًا باستخدام جميع أنواع اللوادر الإضافية مع اختباراتي. https://github.com/ninjapanzer/Backbone-Flux-React-Webpack

: +1:

+1

+1

+1

شكرًا لك على الإبلاغ عن هذه المشكلة ونقدر سعة صدرك. لقد أبلغنا الفريق الأساسي للحصول على تحديث بشأن هذه المشكلة. نحن نبحث عن رد خلال الثلاثين يومًا القادمة وإلا سيتم إغلاق المشكلة.

+1

@ facebook-github-bot-4 ارجوك افعلها!

+1

+1

++

لقد كنت أعمل على Jestpack وهو بديل لـ Jest's 'HasteModuleLoader' لدعم Webpack. نتيجة لذلك ، فهذا يعني أنه يمكنك استخدام أي نظام وحدة يدعم Webpack بما في ذلك AMD.

في ملاحظة جانبية ، هل يعرف أي شخص أي مشاريع كبيرة مفتوحة المصدر (ish) تستخدم Jest بخلاف تلك التي تستخدم وحدات نمط FB السريعة لأنها ستكون مفيدة حقًا لاختبار أداء Jestpack؟

لقد كنت أعمل أيضًا على jest-requirejs وهو أكثر من محاولة لمعالج ما قبل الدعابة القياسي الذي يحلل ملف التكوين main.js ثم ينفذ deamdify ، والذي يزيل define التفاف

لا تزال تعمل على بناء جملة البرنامج المساعد / المُحمل ، وإعادة كتابة المسارات jest.dontMock("") ، jest.setMock("") و require.requireActual("") المسارات داخل بيئة الاختبار.

مرحبًا يا شباب ، هذا رائع حقًا. تعجبني فكرة Jestpack وكنت أقصد تسهيل دعم أدوات حل الوحدات الإضافية. أخيرًا ، أرغب أيضًا في تجديد موقع الويب والتوصية بحلول مثل Jestpack كجزء من دليل Getting Started (الذي يدور في ذهني :)). richardscarrott و sterpe يرجى إعلامي إذا كنت بحاجة إلى أي شيء.

أيضا cc mwolson و @ ColCh

(إلى أي شخص آخر: يرجى التوقف عن التصويت على التعليقات ، فهذا ليس مفيدًا. إذا كنت تريد شيئًا مصممًا للمزاح ، فيرجى إرسال طلب سحب. الكود يفوز بالحجج! لا يمكنني شخصيًا تحديد أولويات الميزات فقط لأن الناس في المجتمع يحتاجونها وأنا لا تستخدم _ جميع رافعات الوحدة النمطية_ الموجودة هناك بنفسي.).

Jestpack مثير للاهتمام ، على الرغم من أنني لست من المعجبين بضرورة إنشاء نقطة دخول واحدة لكل اختبار. https://github.com/Ticketmaster/jest-webpack-alias يحل المشكلة بشكل أكثر عمومية ، على حساب بعض المعالجة المسبقة ، والأخطاء المحتملة التي لم يتم اكتشافها بعد بسبب إعادة تنفيذ رمز دقة وحدة webpack.

أيضًا: من المحتمل أن تذكر أدلة بدء التشغيل أنه من الجيد تحديد الملفات التي يعمل عليها معالجك المسبق ، إذا كان لديك واحد ، وإلا فإنه يؤدي إلى إبطاء عمليات الاختبار إلى حد كبير.

يتم تشغيل المعالجات الأولية مرة واحدة فقط ويمكنك توفير وظيفة مفتاح ذاكرة التخزين المؤقت. jest لن يعيد تشغيل المعالج إذا لم يتغير الملف.

قد يكون هذا صحيحًا ، ولكن حتى التشغيل الأول كان كافيًا لإضافة حوالي 10 ثوانٍ تقريبًا إلى تنفيذ مجموعة الاختبار الخاصة بنا.

متفق عليه أن هذا ليس سريعًا. في FB ، تستغرق الجولة الأولى تقريبًا ضعف المدة التي تستغرقها عمليات التشغيل اللاحقة ، لكنني شخصيًا لا أرى أي شيء آخر لحل هذه المشكلة - نحن نستخدم babel والتحويلات المخصصة الأخرى في FB ؛ لا يمكننا إجراء الاختبارات بدون معالج مسبق :)

كان التخزين المؤقت للمعالج المسبق يعضني أثناء تطوير المعالج الأولي needjs. ما زلت في الغالب أستخدم [email protected] الذي لم يكن لديه ذاكرة تخزين

يجب أن تعمل بشكل جيد مع 0.5!

Webpack سريع جدًا في وضع dev-watch.

لأن:

  1. يحافظ Webpack على وقت التشغيل في الذاكرة (بدون إعادة التحميل)
  2. يقع كود المصدر المترجم في الذاكرة أيضًا.

لذلك ، في معالج Jest الأولي الخاص بي ، قمت بتطبيق (2) نقطة فقط.

باختصار ، ستعمل الحزمة ( ذاكرة FS وتنفيذ حالات الاختبار في ذاكرة FS .

هذه وجهة نظري ...

لكن لدينا مشكلة أخرى الآن: ليس من الممكن حقن ذاكرة FS في Jest في الوقت الحالي.

فكرت في استخدام Jest cache API الخاصة - لحقن المصدر المترجم مباشرة في ذاكرة التخزين المؤقت. قد يكون هذا اختراقًا ، لذلك كنت مخطئًا هنا:

آه ، يجب أن أذكر أن Karma مع Webpack كمعالج أولي يعمل ببطء شديد أيضًا. لذلك ، أعتقد أن انخفاض الأداء الرئيسي يرجع إلى إعادة تحميل وقت تشغيل حزمة الويب بين الملفات.

cpojer لقد هدفك هو جعل محمل الوحدة النمطية https://github.com/facebook/jest/issues/509 ، انتهى بي الأمر للتو إلى حل منطقي بالنسبة لي ولكن إذا كنت ' إذا كنت قادرًا على تقديم أي نظرة ثاقبة حول هذه المشكلة ، فسيكون من الجيد محاذاة محمل الوحدة النمطية لـ Jestpack مع HasteModuleLoader.

mwolson السبب وراء استخدام Jestpack لنقطة دخول منفصلة لكل ملف اختبار هو التأكد من أنه لا يزال بإمكانه الاستفادة من عمليات Jest المتعددة.

يمكن بالفعل تحديد moduleLoader كجزء من التكوين ، في الواقع.

++

نود هذا أيضا. يبدو Jest وكأنه قطعة رائعة من البرامج ولكن لا يمكنه إعادة كتابة كل شيء لدينا لحساب عدم وجود دعم RequireJS.

+1

هل أي شخص من المجتمع مهتم بالعمل على هذا؟ سأكون سعيدًا لدعم الناس من خلال هذا وإنشاء مكون Jest الإضافي الرسمي. من غير المحتمل أن نستثمر بكثافة في هذا في FB في أي وقت قريب. فريق Jest صغير جدًا (1.5 شخصًا) ولا يمكننا العمل على كل هذه الميزات ، لسوء الحظ.

استنادًا إلى الحالة الحالية لمجتمع JavaScript والمعيار ، لا يبدو أن تتطلب js نفسها مستقبلًا ضخمًا لتأليف كود JavaScript. لدينا الآن نظام موحد موحد في ES2015. تم دمج Babel و Jest الآن بشكل كامل ويعملان بشكل جيد معًا. سأوصي أي شخص بالتبديل إلى وحدات CommonJS أو ES2015 ، والتي ستوفر لك المزيد من الأدوات خارج الصندوق.

تتطلب JS أيضًا مستندًا هنا حول كيفية تحويل CommonJS إلى required.js والذي يمكن استخدامه لعمليات نشر الإنتاج ، راجع: http://requirejs.org/docs/commonjs.html

أنا شخصياً لا أرى أي تحسن في كتابة التعليمات البرمجية باستخدام يتطلب JS. سأكون سعيدًا أيضًا للمساعدة في كتابة كود يمكن أن يساعد في تحويل

cpojer لقد نجحت إلى حد ما مع نهج المعالج المسبق هنا https://github.com/sterpe/jest-requirejs/blob/master/index.js لكنني قمت فقط بتنفيذ تحويل للنص / الإضافات حتى الآن. لقد انتقل فريقنا تمامًا من طراز مطلوب ، لذا لم يكن لدي سبب لمواصلة السير في هذا المسار.

أوافق ، لا أرى قيمة تذكر في استخدام RequireJS لتأليف الكود. من المنطقي بالنسبة لي تجميع كود الوحدة النمطية CommonJS / ES2015 لتطلب js للإنتاج ، ولكن لا يبدو أنه من الرائع كتابة التعليمات البرمجية باستخدام هذا النمط يدويًا.

لقد قمت للتو بالترحيل من RequireJS إلى webpack. يوجد أكثر من 300 مكون في قاعدة الشفرة الخاصة بنا. كانت العملية برمتها سهلة بشكل مدهش وغير مؤلمة.

كانت الأداة التي استخدمتها هي https://github.com/Skookum/recast-to-cjs لتحويل الكود من AMD إلى نمط CommonJS.

أيضًا بمساعدة https://github.com/facebook/jscodeshift ، قمنا بترحيل قاعدة الشفرة الخاصة بنا من React 0.11 إلى 0.14 في غضون أيام قليلة.

آمل أن يساعد هذا شخصًا ما في نفس الموقف.

@ مضيفه لطيف! هذا هو بالضبط ما كنت أتحدث عنه من قبل :) سعيد لأنه نجح بشكل جيد بالنسبة لك.

هنا عملي حول:
https://github.com/1twitif/testRequireJSAmdModulesWithJest
إنه يعمل على الأقل في حالة الاستخدام هذه:
http://stackoverflow.com/questions/33889662/not-able-to-load-amd-modules-through-jest

بما أن هذا مغلق ، فهل هذا يعني أن Facebook لن يضيف دعمًا لهذا؟

إذا كنت تقصدني من خلال Facebook ، فعندئذ نعم ، فمن غير المرجح أن يكون هناك دعم "رسمي". لا ينبغي أن يمنعك ذلك من المساهمة في Jest والحصول على هذه الميزة ولكن أعتقد أن معظم الناس قد انتقلوا إلى وحدات ES أو CommonJS هذه الأيام.

نعم اعرف. لسوء الحظ ، لا يمكنني الابتعاد عن هذه التبعيات لأنها للعمل.

يمكن أن يكون برنامج babel-plugin-transform-amd-to-commonjs مفيدًا في حل مشكلة Jest + AMD ، خاصةً إذا كنت تستخدم بالفعل شيئًا مثل babel-jest.

لقد قمت بإعداد مثال لمشروع يوضح كيف يمكنك أن تطلب Jest بشفافية ملفات AMD عن طريق تشغيل التحويل في بيئة الاختبار.

لست متأكدًا من تفاصيل مثل هذا النهج في مشروع فعلي - لا سيما النهج الجيد لمشاركة التكوين بين Jest / RequireJS / Webpack / إلخ. سيكون دعم Jest لملف تكوينات .js خطوة نحو حل أكثر قابلية لإعادة الاستخدام (راجع https://github.com/facebook/jest/issues/2140).

msrose هذا رائع. شكرا جزيلا لمشاركة هذه.

أنا أفهم أن هذه مشكلة قديمة. يمكن أن ينجح التحويل البسيط:

exports.process = function (content) {
  return 'function define(name, deps, body) { module.exports = body.apply(undefined, deps.map(require)); }' + content;
}

أعتقد أن تحويل AMD -> CJS يمكن إجراؤه بعدة طرق ، على سبيل المثال ، deamdify ، غلاف محقون ، إلخ. المشكلة ، التي لا تزال دون حل ، هي بناء جملة نوع محمل / مكون إضافي. هذه هي أشياء مثل fooTemplate = require('tpl!foo.tpl') و barJson = require('json!bar.json') (كأشياء شائعة نسبيًا). ولكن كان هناك الكثير من هذه المشاريع والعالم الحقيقي require-js مليئة بهذا النوع من البنية.

سيكون رائعًا إذا كانت هناك طريقة سهلة لإعادة استخدام المكونات الإضافية الحالية require-js في نظام التحويل الذي يغذي في النهاية أداة تحميل الوحدة النمطية jest |.

+1

ReferenceError: define is not defined

+1

FAIL srcApp.test.js
● فشل اختبار مجموعة التشغيل

ReferenceError: define is not defined

يجب عليك استخدام umd بدلا من amd. إذا لم يكن ذلك ممكنًا ، فيجب عليك إضافة تحويل (على سبيل المثال ، المكون الإضافي babel المرتبط أعلاه).

عندما يتعلق الأمر ببنية loader! ، فإننا لا ندعم ذلك (نحن لا ندعمه مع Webpack أيضًا). الحل البديل هو تحويل الواردات (إزالة اللوادر) والسماح بتحويل Jest باستخدام transform config. مناقشة ذات صلة: # 4868

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