
يحتوي إصدار babel@7.0.0-beta52 على إشارة تكوين جديدة مطلوبة للمكون @babel/plugin-proposal-pipeline-operator
، والذي يكسر التوافق مع الإصدارات السابقة من المكون الإضافي. في هذه المقالة ، سوف تتعلم ما هو عامل pipeline
ولماذا يحتاج إلى التكوين.
UPD: ظهرت خطوط الأنابيب الذكية على babel@7.2.0: https://babeljs.io/blog/2018/12/03/7.2.0#smart-pipeline-operator-parsing-8289-https-githubcom-babel-babel- سحب -8289
الوضع الحالي
انطلق جيلبرت غارزا ، الذي اقترح في الأصل مشغل pipeline
، للحصول على بنية بسيطة لـ "سلاسل مرتبة من استدعاءات الوظائف بأسلوب وظيفي قابل للقراءة". ينشأ مشغل خط الأنابيب بلغات مثل F # و Hack و Elm و Elixir وغيرها ، وعندما تضيفه إلى JavaScript ، تنشأ مشكلتان مثيرتان للجدل:
- أين وكيف تستخدم العناصر النائبة؟
- كيف يجب أن يكون غير
async / await
في خط الأنابيب؟
العناصر النائبة
طرح كيفن سميث السؤال الأول في هذه التذكرة ، حيث اقترح استخدام نمط الأنابيب من لغة هاك . في Hack ، تكون العناصر النائبة مطلوبة لأي جانب يمين من خط الأنابيب ، على سبيل المثال:
namespace Hack\UserDocumentation\Operators\Pipe\Examples\MapFilterCountPiped; function piped_example(array<int> $arr): int { return $arr |> \array_map($x ==> $x * $x, $$) |> \array_filter($$, $x ==> $x % 2 == 0) |> \count($$); } var_dump(piped_example(range(1, 10)));
لقد اعتمدنا كأساس أنه يمكن استخدام العنصر النائب في أي تعبير ويحتوي على قيمة من خطوة خط الأنابيب الأخيرة. يمنحنا هذا النهج مرونة وفرصة كبيرة لكتابة التعبيرات.
الوجه الآخر للعملة هو تعقيد اللغة بسبب إضافة رمز جديد. حتى الآن ، اخترنا التجزئة ( #
) ، وعلى الرغم من أن المناقشة لا تزال مفتوحة ، فمن المحتمل أن يكون لأي رمز مميز تقاطعات مع استخدامات أخرى. على سبيل المثال ، يتم استخدام التجزئة أيضًا بواسطة الحقول الخاصة في الفصل ، تمامًا مثل أي متغيرات أخرى مميزة تُستخدم على أي حال .
غير متزامن / انتظار
احتوى الإصدار الأول من بيان pipeline
على بناء الجملة هذا في await
:
x |> await f
ما يمكن نشره في:
await f(x)
لسوء الحظ ، قد يتوقع المستخدمون مثل هذا النشر:
(await f)(x)
في حين انحرفت فكرة إضافة عدم async
pipeline
، تحدث أعضاء اللجنة ضد مشغل pipeline
لا يدعم عدم async / await
. نعم ، هناك خيارات لكيفية العمل مع الدالات التي ترجع Promise بدون بنية واضحة ، ولكن كل هذه الخيارات مرهقة للغاية أو تتطلب وظائف مساعدة.
الحلول المقترحة
نتيجة للمناقشات ، تم تشكيل مقترحين (بالإضافة إلى الخيار الأدنى): استخدام خطوط F # وخطوط الأنابيب الذكية. دعونا نلقي نظرة على هذه الاقتراحات.
ينطبق هذا العرض فقط على الوظائف الأساسية. في الإصدار الأدنى ، تتم إزالة دعم التزامن ولا توجد عناصر نائبة. يتوافق هذا الخيار مع سلوك المكون الإضافي babel من الإصدارات السابقة ، قبل ظهور التكوين ، ويتوافق مع المواصفات الحالية لمشغل pipeline
في المستودع. يتم استخدامه بشكل أكبر كمسودة مسبار لتحديد مزايا وعيوب الاقتراحات الأخرى ، ومن غير المحتمل أن يتم قبوله بدون التغييرات الأساسية الموجودة في الاقتراحات البديلة.
العناصر النائبة لأنابيب F # ليست مطلوبة على الإطلاق. في الإصدار الأساسي ، تغطي وظائف الأسهم الحاجة إلى العناصر النائبة التي تتطلب خربشة أقل ، وتستند إلى بنية ES2015 المألوفة للجميع.
في الوقت الحالي (وفقًا لمواصفات خطوط F #) ، يجب لف وظائف الأسهم بين قوسين:
let person = { score: 25 }; let newScore = person.score |> double |> (_ => add(7, _)) |> (_ => boundScore(0, 100, _));
الاستطلاعات جارية لتحديد ما إذا كان من الممكن استخدام دالات الأسهم بدون قوسين ، والتي تبدو زائدة نحويًا هنا.
أما بالنسبة إلى التزامن ، فانتظار العمل كدالة أحادية في خطوط الأنابيب F #:
promise |> await
ما يتكشف في:
await promise
وبالتالي يمكن await
في منتصف سلسلة طويلة من المكالمات غير المتزامنة:
promise |> await |> (x => doubleSay(x, ', ')) |> capitalize |> (x => x + '!') |> (x => new User.Message(x)) |> (x => stream.write(x)) |> await |> console.log;
من المحتمل أن تفتح مثل هذه المعالجة الخاصة await
إمكانية استخدام نفس المشغلين الأحاديين (على سبيل المثال ، نوع) ، ولكن المواصفات الأصلية لأنابيب F # لا تحتوي عليها.
تجلب خطوط الأنابيب Smar فكرة العناصر النائبة إلى استنتاجها المنطقي ، مما يسمح بالاستخدام الجزئي والتعبيرات التعسفية في التخصصات. يمكن كتابة السلسلة الطويلة السابقة على النحو التالي:
promise |> await # |> doubleSay(#, ', ') |> # || throw new TypeError() |> capitalize |> # + '!' |> new User.Message(#) |> await stream.write(#) |> console.log;
قواعد استخدام العناصر النائبة في خطوط الأنابيب الذكية بسيطة جدًا. إذا تم تمرير معرف واحد إلى خطوة خط الأنابيب ، فلا يلزم رمز مميز إضافي (عنصر نائب) ، وهذا ما يسمى "النمط المكشوف" :
x |> a; x |> fb;
على عكس Hack ، لا تتطلب الوظائف الأحادية رمزًا لعنصر نائب.
بالنسبة إلى التعبيرات الأخرى ، يلزم وجود عنصر نائب (يسمى "الرمز المميز للمفردات المعجمية") ، ويعتبر خط الأنابيب يعمل ضمن "نمط السمة" - "نمط الموضوع" . يؤدي عدم وجود رمز مميز للعنصر النائب في هذه الحالة إلى حدوث خطأ في بناء الجملة في وقت مبكر:
10 |> # + 1; promise |> await #;
إذا كان هناك أي عوامل تشغيل أو أقواس (بما في ذلك استدعاء طريقة) أو علامات الاقتباس أو أي شيء آخر باستثناء معرف ونقطة ، عندئذٍ يلزم رمز العنصر النائب. سيساعد ذلك على تجنب التعرض للرصاص في القدم والقضاء على عدم اليقين.
تحل خطوط الأنابيب الذكية مشكلة دعم التزامن بطريقة أكثر عمومية ، مما يسمح لنا باستخدام جميع التعبيرات الممكنة في خطوط الأنابيب ، ليس فقط في await
، ولكن أيضًا نوع ، yield
وأي عوامل أخرى.
بابل يدخل المشهد
بمجرد أن تم تجسيد الاقتراحات الثلاثة ، توصلنا إلى استنتاج مفاده أن هذه المناقشات لن تؤدي إلى حل التناقضات العميقة بين المقترحات. قررنا أن أفضل طريقة هي جمع التعليقات من المطورين باستخدام الجمل في الكود الحقيقي. نظرًا لدور Babel في مجتمع المطورين ، قررنا إضافة جميع الخيارات الثلاثة إلى المكوّن الإضافي لمشغل pipeline
.
نظرًا لأن تحليل الجمل الثلاث يكون قليلاً ، ولكنه مختلف ، يجب أولاً إضافة دعمهم إلى @babel/parser
(وهو babylon
) ، ويجب أن يعرف المحلل اللغوي الاقتراح الذي يجب دعمه الآن. وبالتالي ، يتطلب المكوّن الإضافي لمشغل pipeline
خيار "proposal"
، لتكوين بابل للتحليل والتحويل اللاحق.
لقد عملنا على هذا عبر الإنترنت لأننا بحاجة إلى إجراء جميع التغييرات التي تكسر التوافق العكسي قبل أن تتوقف babel @ 7 عن الإصدار التجريبي. في النهاية ، نود أن نجعل أحد خيارات خط الأنابيب افتراضيًا للمكوِّن الإضافي للتخلص من الحاجة إلى خيار التكوين.
نظرًا لهذه القيود ، قررنا إضافة خيار لتكوين المكون الإضافي وجعله إلزاميًا ، مما يجبر المستخدمين على تحديد أي من العروض يريدون استخدامها في مشروعهم. بمجرد اختيار عرض معين باعتباره السلوك الأساسي للمشغل ، نضع علامة على الخيار "proposal"
أنه قديم ، وسيعمل الخيار الأساسي افتراضيًا. سيعمل دعم العروض الملغاة حتى الإصدار الرئيسي التالي.
شارك
إذا كنت ترغب في المشاركة في مناقشة الاقتراح ، فستكون جميع المناقشات عامة ويمكنك العثور عليها في مستودع اقتراح مشغل خطوط الأنابيب . عرض تقديمي من اجتماع TC39 هو أيضا في خدمتكم. في النهاية ، يمكنك متابعة James DiGioia أو JS Choi أو Daniel Ehrenberg على Twitter.
ولكن الأهم من ذلك ، بمجرد الانتهاء من العمل على pipeline
، جربه في مشاريعك! نحن نعمل أيضًا على إضافة ميزات جديدة للاستبدال ، حتى تتمكن من التحقق من رمزك بشكل تفاعلي. نحتاج إلى تعليقات ، واستخدامه في كود حقيقي سيساعد حقًا في تجميعه. نشر تغريدات على babeljs .