Mustache.js: دعم وحدة ES

تم إنشاؤها على ٢٩ مايو ٢٠١٩  ·  18تعليقات  ·  مصدر: janl/mustache.js

مرحبا!

كنت أتساءل عما إذا كانت هناك خطة لدعم إصدار وحدة ES من Moustache.js ؟ إذا كان الأمر كذلك يمكنني المساهمة فيه.

لماذا ا؟
أنا أعمل في مشروع Deno ، وهناك نقاش حول القوالب (Deno يدعم فقط وحدات ES). المشكلة هي عدم وجود عارض قالب في الوقت الحالي. كانت إحدى الأفكار هي نقل الشارب إلى Deno ، لذا فإن المنفذ يعني تدفق كود مختلف يحتاج إلى صيانة. أعتقد أن وجوده مباشرة في الشارب سيكون مفيدًا لكلا المشروعين. ولكن في حالة الشارب ، فهذا يعني إضافة mustache.mjs إلى الريبو ، أو تعديل : أو تغيير mustache.js لجعل الوحدة ES متوافقة.

افكارك؟

المرجع: https://github.com/denoland/deno_std/issues/391

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

تحديث الحالة؛ كما ذكرت في العلاقات العامة التي فتحتها مقابل فرع esm-ify الخاص بي ، فقد حصلت الآن على بعض الاختبارات التي تضمن أن هذه الحزمة تعمل على النحو المنشود لأنظمة الوحدات المختلفة التي دعمناها لسنوات في # 724.

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

مع هذه الاختبارات في مكانها الصحيح ، أشعر بالراحة في المضي قدمًا في نقل هذا المشروع إلى كتابة الكود المصدري كوحدة ES وبناء خطوة لإنتاج ما لدينا في mustache.js اليوم - سيتم ذلك بالطبع في العلاقات العامة القادمة.

ال 18 كومينتر

مرحباzekth!

خطط مثيرة لديك مع دينو من الآن فصاعدًا. أنا واثق جدًا من جعل الوحدة ES الخاصة بالمشروع متوافقة ، وأتفق تمامًا مع أفكارك حول تجنب منفذ.

لديك أي أفكار محددة ما سيكون ضروريًا لتحقيق ذلك؟

إليك منفذ (قبيح حقًا) قمت به هذا الصباح (في الكتابة المطبوعة) https://github.com/zekth/deno_mustache/blob/master/mod.ts

لقد قمت بإجراء بعض الاختبارات فقط في البداية.
الشاغل الوحيد الذي يساورني هو جميع البيئات المختلفة التي تدعمها مع الشارب ، فوجود وحدة ES لملف js الرئيسي المتوافقة أفضل من mjs أعتقد ولكني لا أريد كسر أي شيء :)

شكرا جزيلا للإشارة! 👍

نظرًا لأن لديّ خبرة صفرية مع deno ، سأطلق بعض الأسئلة التافهة لإثارة بعض المناقشات:

  1. ما هي متطلبات دينو يجب أن يعمل هذا؟ هل يجب أن يكون ملف .mjs أم أنه يهتم بـ type="module" من package.json ؟
  2. أي متطلبات تسمية الملف؟
  3. هل TypeScript مهم هنا بطريقة ما؟

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

  1. لا توجد متطلبات خاصة لأنها تحتاج فقط إلى أن تكون المكتبة وحدة ES. مثال lodash يعمل بدون أي نقل. يتم تحميل الوحدة من خلال جلب HTTP ، بدون حزمة json أو أي شيء.
  2. لا اصطلاح تسمية
  3. يمكنك استخدام TypeScript من JavaScript ، ويتعامل Deno مع كليهما.

على سبيل المثال ، قد يبدو استخدام الشارب في دينو كما يلي:

import * as mustache from 'https://raw.githubusercontent.com/janl/mustache.js/master/mustache.js'
mustache.render(......

إذا كنت تريد المزيد من المعلومات ، يمكنك التحقق من هذا الحديث من Ryan: https://www.youtube.com/watch؟

رائع!

إذن ، إليك بعض الأفكار المشوشة لمشاركة بعض الأفكار والسياق. ما أفهمه من وحدات ES هو أنها من المفترض أن تكون قابلة للتحليل اللغوي من حيث ما هو export ed. هذا في تناقض مظلم مع سلائفه مثل CommonJS و AMD وغيرها والتي هي أكثر ديناميكية في طبيعتها.

مع وضع ذلك في الاعتبار ، أفترض أيضًا أن IIFE المحيط بجسم mustache.js اليوم ، والمقصود به اكتشاف نظام الوحدة النمطية الذي يعمل به الكود حاليًا ، لن يعمل في أرض الوحدة النمطية ES - يرجى تصحيحني إذا كنت مخطئا!

هذا يعني أنه يجب أن يكون هناك ملف .js | .mjs | .ts يحتوي على export ... سهل وبسيط كما هو الحال في المنفذ الخاص بك: zekth / deno_mustache / mod.ts # L689 .

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

نظرًا لأننا بالتأكيد لا نريد الاحتفاظ بتطبيقات مختلفة (وحدات ES + الباقي) متزامنة ، فإنه يبدأ في الشعور بأنه يستحق التفكير في خطوة بناء. على سبيل المثال ، إذا كتبنا الكود المصدري بأسلوب وحدة ES ، فإن خطوة البناء يمكن أن تحوله إلى وحدة غير ES كما لدينا اليوم. أو العكس إذا كان ذلك أقل تدخلاً.

كملاحظة أخيرة ، أنا من أشد المعجبين بعمل خطوات صغيرة قدر الإمكان. أنا متأكد بشكل عام من TypeScript ، ولكن هل من الجيد في الوقت الحالي إذا واصلنا التركيز على وحدات ES وقمنا بجولة مختلفة تركز على ما إذا كنت تريد التحويل إلى TypeScript / تصدير محرفات أم لا؟

أي أفكار أو تصحيحات أخرى تتبادر إلى الذهن؟

أنت محق تمامًا ، ستكون الخطوة الأولى هي إضافة مكدس TypeScript واستخدام المحول البرمجي لإخراج ملفات متعددة مثل Commonjs / ES5 / ES6 وما إلى ذلك (https://www.typescriptlang.org/docs/handbook/compiler-options .لغة البرمجة ) . لا يجبرنا استخدام مترجم TS على استخدام TypeScript ، يمكننا أيضًا استخدام كود ES6.

أوه ، هذا اقتراح رائع! محاولة استخدام مترجم TS كأداة بناء عادية من ES -> أنظمة الوحدات الأخرى في البداية. سيؤدي ذلك إلى جعل تحويل TS المقبول لاحقًا أقل خطورة بكثير.

هل أنت قادر على إعطاء هذا الاقتراب فرصة؟ ليس بالضرورة حل كل شيء دفعة واحدة ، ولكن على الأقل اللبنات الأساسية الأولى. سيكون من المفيد حقًا أن يكون لديك شيء ملموس للنظر فيه وإقامة مناقشات مستقبلية حوله.

لقد جربت الانتقال إلى وحدة ES.

انتهى إثبات المفهوم الخاص بي باستخدام rollup.js بدلاً من مترجم TypeScript (أو babel) بشكل أساسي بسبب إصدار UMD الذي ينشئونه - ما زلنا بحاجة إلى ذلك للحفاظ على التوافق مع أنظمة الوحدات القديمة أو عدم وجود نظام وحدة على الإطلاق.

هل هناك أي فرصة ترغب في منحها تجربة تشغيل مع deno لترى ما إذا كانت تعمل بالشكل الذي تتوقعه؟ phillipj / mustache.js # esm-ify mustache.mjs

phillipj سيفعل!

بعض الأخطاء ولكن أعتقد أن هذه إصلاحات طفيفة:

error TS2339: Property 'render' does not exist on type '{ name: string; version: string; tags: string[]; }'.

► file:///Users/vlegoff/projects/genesys/github/telemetry/t/mustache.ts:10:23

10 var output = mustache.render('{{title}} spends {{calc}}', view);
                         ~~~~~~

error TS2554: Expected 2 arguments, but got 1.

► https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:525:52

525   var context = (view instanceof Context) ? view : new Context(view);
                                                       ~~~~~~~~~~~~~~~~~

  An argument for 'parentContext' was not provided.

    ► https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:377:25

    377 function Context (view, parentContext) {
                                ~~~~~~~~~~~~~


error TS2339: Property 'escape' does not exist on type '{ name: string; version: string; tags: string[]; }'.

► https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:640:21

640     return mustache.escape(value);
                        ~~~~~~

error TS2339: Property 'clearCache' does not exist on type '{ name: string; version: string; tags: string[]; }'.

► https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:659:10

659 mustache.clearCache = function clearCache () {
             ~~~~~~~~~~

error TS2339: Property 'parse' does not exist on type '{ name: string; version: string; tags: string[]; }'.

► https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:668:10

668 mustache.parse = function parse (template, tags) {
             ~~~~~

error TS2339: Property 'render' does not exist on type '{ name: string; version: string; tags: string[]; }'.

► https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:678:10

678 mustache.render = function render (template, view, partials, tags) {
             ~~~~~~

error TS2339: Property 'to_html' does not exist on type '{ name: string; version: string; tags: string[]; }'.

► https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:690:10

690 mustache.to_html = function to_html (template, view, partials, send) {
             ~~~~~~~

error TS2339: Property 'render' does not exist on type '{ name: string; version: string; tags: string[]; }'.

► https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:693:25

693   var result = mustache.render(template, view, partials);
                            ~~~~~~

error TS2339: Property 'escape' does not exist on type '{ name: string; version: string; tags: string[]; }'.

► https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:704:10

704 mustache.escape = escapeHtml;
             ~~~~~~

error TS2339: Property 'Scanner' does not exist on type '{ name: string; version: string; tags: string[]; }'.

► https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:707:10

707 mustache.Scanner = Scanner;
             ~~~~~~~

error TS2339: Property 'Context' does not exist on type '{ name: string; version: string; tags: string[]; }'.

► https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:708:10

708 mustache.Context = Context;
             ~~~~~~~

error TS2339: Property 'Writer' does not exist on type '{ name: string; version: string; tags: string[]; }'.

► https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:709:10

709 mustache.Writer = Writer;
             ~~~~~~


Found 12 errors.

الشفرة:

import mustache from 'https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs';

var view = {
  title: 'Joe',
  calc: function() {
    return 2 + 4;
  },
};

var output = mustache.render('{{title}} spends {{calc}}', view);

console.log(output);

تريد مني أن أحاول إنشاء علاقات عامة على ملف .mjs الخاص بك؟

شكرا!

أدرك الآن أنه يجب علي مشاركة المزيد من السياق حول ما حاولت القيام به في البداية ، آسف.

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

ما لم أكن مسرورًا به هو رمز UMD الذي تم لفه حول الإخراج المترجم. شيئين أساسيين:

  1. لا يحتوي على احتياطي لعرض محتويات الحزمة على النطاق العالمي (فكر في window.Mustache ). هذا أمر حيوي لمستخدمينا الذين ليس لديهم نظام وحدة في مكانه.
  2. في المشاريع مع CommonJS ، يتم عرض محتويات هذه الحزمة على أنها module.exports.default بدلاً من module.exports . على الرغم من أن هذا قد يكون هو السلوك الصحيح والمتوقع عندما يكون CommonJS require() s وحدة ES ، إلا أنه سيؤدي إلى تعطيل التوافق مع الإصدارات السابقة ، والذي كنت آمل في تجنبه.

نظرًا لأن هدفي الرئيسي كان أولاً وقبل كل شيء نقل الكود المصدري ليكون وحدة ES ، وليس تقديم TypeScript ، فقد قررت تجربة برامج التحويل البرمجي / المجمعات المختلفة لمعرفة ما إذا كانوا قد فعلوا الأشياء بشكل مختلف لتجنب التحديين أعلاه.

ومن هنا السبب انتهى بي المطاف بـ rollup.js. إن إخراج UMD هو ما نحتاجه ولا يسبب أي تغييرات مفاجئة لمستخدمي هذه الحزمة.

سو على سؤالي الفعلي ؛ هل نحن بحاجة إلى الاهتمام بـ TypeScript في الوقت الحالي؟

ما فهمته في وقت سابق من هذه المناقشة هو أننا لم نتمكن من التفكير في الانتقال بالكامل إلى TypeScript حتى الآن ، لأنه سيساعد deno مع ذلك إذا كانت بالفعل وحدة ES ، لكن ربما أساء فهم ذلك قليلاً؟

أعتقد أن المشكلة الرئيسية هي التهيئة الأولى للشارب كما هو الحال هنا:
https://github.com/janl/mustache.js/blob/master/mustache.js#L14

وأيضًا هذا: https://github.com/janl/mustache.js/blob/master/mustache.js#L536
يمكن إعادة كتابتها كـ new Context(view, null)

الا تعتقد

أعتقد أن المشكلة الرئيسية هي التهيئة الأولى للشارب ..

ربما أنت على حق. في الإصدار .mjs حاولت نقل ذلك إلى كود المصدر الفعلي على الأقل ، بدلاً من أن يكون كائنًا تم تمريره من غلاف UMD:

var mustache = {
  name: 'mustache.js',
  version: version,
  tags: [ '{{', '}}' ]
}

سيكون من الرائع رؤية نهجك الذي من شأنه إصلاح أخطاء TypeScript 👍

يمكن إعادة كتابته كسياق جديد (عرض ، فارغ)

تقريبًا .. أليس new Context(view, undefined) يعادل عدم اجتياز وسيطة ثانية على الإطلاق؟

نعم صحيح حول new Context

سأحاول شيئًا ما :)

هنا العلاقات العامة: https://github.com/phillipj/mustache.js/pull/1
CI معطلة لكني لا أفهم لماذا تلقيت رسائل الفحص هذه

رائع ، شكرا جزيلا! مشغول للغاية في اليومين المقبلين ، سأبذل قصارى جهدي للمراجعة قبل نهاية الأسبوع.

تحديث الحالة؛ كما ذكرت في العلاقات العامة التي فتحتها مقابل فرع esm-ify الخاص بي ، فقد حصلت الآن على بعض الاختبارات التي تضمن أن هذه الحزمة تعمل على النحو المنشود لأنظمة الوحدات المختلفة التي دعمناها لسنوات في # 724.

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

مع هذه الاختبارات في مكانها الصحيح ، أشعر بالراحة في المضي قدمًا في نقل هذا المشروع إلى كتابة الكود المصدري كوحدة ES وبناء خطوة لإنتاج ما لدينا في mustache.js اليوم - سيتم ذلك بالطبع في العلاقات العامة القادمة.

تم فتح 728 للتدقيق العام.

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

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

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

mbrodala picture mbrodala  ·  16تعليقات

ForbesLindesay picture ForbesLindesay  ·  14تعليقات

amper5and picture amper5and  ·  5تعليقات

Immortalin picture Immortalin  ·  12تعليقات