Less.js: كيفية تشغيل عمليات الاستيراد المتزامنة وغير المتزامنة

تم إنشاؤها على ٧ ديسمبر ٢٠١٤  ·  26تعليقات  ·  مصدر: less/less.js

كيف يقرر أقل استدعاء loadFile أو loadFileSync من fileManager ؟ وفقًا لهذا الرمز ، يتطلب تعيين معلمة isSync . لكن البحث القصير عن استدعاء لـ getFileManager يظهر أن هذا الخيار يستخدم فقط من قبل lib/less/functions/data-uri.js .

هل يمكن ضبط هذا الخيار بشكل صريح عند استدعاء render() ؟

feature request medium priority stale

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

هل هناك renderSync حتى الآن؟ إذا لم يكن الأمر كذلك ، فهل هناك حل بديل لـ render متزامن؟

تحرير: Nvm. بالنسبة لأي شخص في المستقبل يتعثر في هذا ، هذا ما فعلته:

less.renderSync = function (input, options) {
    if (!options || typeof options != "object") options = {};
    options.sync = true;
    var css;
    this.render(input, options, function (err, result) {
        if (err) throw err;
        css = result.css;
    });
    return css;
};

ال 26 كومينتر

يمكن تمرير isSync في كائن الخيارات لتقديمه. بيانات uri دائمًا
مزامنة لأن الوظائف لا يمكن أن تكون غير متزامنة.

لكن importManager لا يمرر أي خيار إلى getFileManager ...

يتم القيام به هنا

https://github.com/less/less.js/blob/32dbbee247f76af00eb7577053eccad2ee5f6110/lib/less-browser/file-manager.js#L61

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

أستطيع أن أرى كيف أن هذا محير. هل يسبب مشكلة؟

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

حسنًا ، ربما يجب أن أشرح حالة الاستخدام الخاصة بي:

لقد كتبت أقل محمل لحزمة الويب . نظرًا لأن webpack لديه آلية حل خاصة ، فأنا أستخدم مكونًا إضافيًا لربط حل ملف أقل عبر مدير الملفات.

يدعم Webpack أدوات التحميل المتزامنة وغير المتزامنة ، لكنني لم أجد طريقة لأقول أقل لتقديم مزامنة جميع الملفات أو بشكل غير متزامن. حاليًا ، يطلق عليه دائمًا loadFile . وهكذا استخدمت اختراقًا قذرًا للاتصال بـ loadFileSync عند طلب تجميع متزامن. لحسن الحظ ، يعمل عدد أقل بشكل متزامن عندما يتم استدعاء رد الاتصال بشكل متزامن (وهو ما لا ينبغي إجراؤه في الظروف العادية بالطبع).

أرى...

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

رائع!

هناك مشكلة واحدة فقط: من غير المعتاد جدًا القيام بشيء ما بشكل متزامن أثناء قبول callback (كما تفعل الدالة render ). أنت تقترح خيار sync مثل هذا:

less.render(
    input,
    { ... sync: true ... },
    function (err, result) {
    }
);

؟

Imho من الغريب أن يتم استدعاء رد الاتصال بشكل متزامن. أتوقع واجهة برمجة تطبيقات مثل هذا:

// async
less.render(input, option, callback);

// sync
var result = less.renderSync(input, option);

نعم أنت على حق ، هذا أفضل.

+1
يبدو أنه من المفيد أيضًا التفكير في تنفيذ renderSync لعدم تقييد تنفيذ الكود في رد الاتصال فقط. في نطاق رد الاتصال ، لن تطبع العديد من الطرق مثل console.err أو throw new Error() أو خطأ JavaScript متعمد أي شيء إلى وحدة التحكم ، بل ستوقف فقط تنفيذ التعليمات البرمجية ، مما قد يؤدي إلى أخطاء لا يمكن تتبعها. أتخيل أن هذا السلوك لا ينبغي أن يحدث.

في حالتي الخاصة ، سيتم استخدام renderSync في الأداة المساعدة لسطر الأوامر وبدلاً من التحكم في تدفق رد الاتصال باستخدام الوعود لضمان طباعة جميع المخرجات والأخطاء بالترتيب في كل مرة ، أفضل استخدام renderSync فقط وليس لدي ما يدعو للقلق.

(لا تحط من قدر المشكلة نفسها ، ولكن فقط للتأكد من أنها لن تصبح أكثر غرابة مما هي عليه):

Imho من الغريب أن يتم استدعاء رد الاتصال بشكل متزامن.

هذه مبالغة ... في هذا السطر من التعليمات البرمجية لا تفترض أن التكوين مضبوط بشكل غير متزامن ، أليس كذلك؟
عمليات الاسترجاعات هي مجرد عمليات رد نداء ، في حد ذاتها لا علاقة لها بأشياء المزامنة / غير المتزامنة.

حسنًا ، مما نحتاج إلى الحديث عن المصطلح callback : wink :.

أعلم أن بعض وظائف الاستدعاء تم تمريرها إلى forEach a callback (مثل MDN ). لن أسميها كذلك ، لأن رد الاتصال بالنسبة لي هو شيء يتم استدعاؤه عند انتهاء المهمة.

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

أعلم أن بعض وظائف الاستدعاء تم تمريرها إلى forEach a callback`

شخص ما يستخدم الكثير من node ؛) الجميع يسمي هذا الشيء "رد الاتصال". لذلك إذا كان أحدهم يدور حول "استدعاء وظيفة رد الاتصال عند الانتهاء من مهمة" فهذا لا يقل عن "رد الاتصال غير المتزامن".

لكن لا تقلق ، آسف ، لم أقصد أن أبدو مثل CO وأبدأ هذا النقاش اللغوي البحت (أردت فقط التأكد من أننا نتحدث نفس اللغة وأن المستندات تذكر في الواقع less.render متزامن).

PS فقط للتوضيح أكثر:

تضمين التغريدة

كان هذا النموذج less.render موجودًا منذ سنوات ، ولا يمكنك فقط تغييره من لا شيء لكسر zillion snippets هناك.

@ سبع مراحل كحد أقصى

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

مشكلتي مختلفة إلى حد ما ولكنها مرتبطة (https://github.com/less/less.js/issues/2546). سيؤدي تطبيق ميزة renderSync إلى حل مشكلتي ولكنها لن تكون الحل النهائي.

هل تمانع في إلقاء نظرة سريعة؟ سأكون ممتنا حقا.

شكرا.

شخص ما يستخدم الكثير من العقد

حسنًا ، هذا صحيح: ابتسامة:

لكن اصطلاح رد الاتصال للعقدة راسخ. أفترض أن رد الاتصال يتم استدعاؤه دائمًا بشكل غير متزامن في هذه الحالة.

بالإضافة إلى ذلك: كيف يتم التعامل مع الأخطاء عند حدوث خطأ؟ هل تم إلقاؤها (مثل معظم واجهات برمجة التطبيقات المتزامنة) أم تم تمريرها كوسيطة لرد الاتصال؟

كل ما في الأمر أن واجهة برمجة التطبيقات الحالية غامضة (على الأقل imho)

هل هناك renderSync حتى الآن؟ إذا لم يكن الأمر كذلك ، فهل هناك حل بديل لـ render متزامن؟

تحرير: Nvm. بالنسبة لأي شخص في المستقبل يتعثر في هذا ، هذا ما فعلته:

less.renderSync = function (input, options) {
    if (!options || typeof options != "object") options = {};
    options.sync = true;
    var css;
    this.render(input, options, function (err, result) {
        if (err) throw err;
        css = result.css;
    });
    return css;
};

هل هذه الميزة مطبقة بالفعل؟ هل هناك أي وثائق؟ يمكنني فقط العثور على الخيار async .

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

Aarilight شكرًا جزيلاً لك ، لقد ساعدت التعليمات البرمجية كثيرًا

يعتبر سلوك رد الاتصال المتزامن هذا أمرًا بديهيًا حقًا: confused:

Aarilight لا يعمل بالنسبة لي = (
حاولت

less.render(css, {sync : true}, (e, result) =>{
        if(e) {
         console.error(e)
    }

        output = result;
        return result
    });

وتسجيل الدخول https://github.com/less/less.js/blob/master/lib/less/render.js

            console.log('1')
            this.parse(input, options, function(err, root, imports, options) {
                console.log('2')
                if (err) { return callback(err); }

                var result;
                console.log('3')
                try {
                    console.log('4')
                    var parseTree = new ParseTree(root, imports);
                    console.log('5')
                    result = parseTree.toCSS(options);
                }
                catch (err) { 
                    console.log('6')
                    return callback(err); 
                }

                console.log('7')
                callback(null, result);
            });
            console.log('8')

وأرى 1 و 8 ثم 2،3،4،5،6،7 لبعض الملفات

-1 لتقسيم العرض إلى render و renderSync . إنها اتفاقية Node.js محرجة. ولا يسمح بإرسال خيار مزامنة للتخبط / البلع / التوافق أو مهام سير عمل أخرى مدمجة في أقل من ذلك يمر في كائن JS إلى وظيفة معينة. لا بأس من IMO تمرير رد اتصال اختياري عند استخدام خيار غير متزامن.

خيار آخر: ما رأيت المكتبات تبدأ في القيام به هو إعادة الوعد في كلتا الحالتين. بعد ذلك ، كل ما يتغير بين المزامنة / غير المتزامن هو عندما يتم الوفاء بالوعد ، لكن الكود الذي يتعامل مع النتيجة هو نفسه تمامًا.

و راجع للشغل:

{sync: true}

لا يوجد مثل هذا الخيار.

-1 لتقسيم العرض إلى renderSync. إنها اتفاقية Node.js محرجة.

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

أليست هذه وجهة نظر ذاتية تمامًا؟

نعم فعلا.

بغض النظر ، وجهة نظري الأخرى ليست ذاتية. وهذا يعني أنه يتم استخدام Less في عمليات الإنشاء التي قد تحتاج إلى التحديث إذا تم تقسيم الوظيفة. على سبيل المثال: Accord (https://github.com/jenius/accord) ، والذي أستخدمه حاليًا لمشروع واحد ، يلخص مجمعين مختلفين في واجهة برمجة تطبيقات واحدة ، ويمرر عادةً في كائن إلى أي وظيفة يتطلبها المحرك. لذلك ، من المحتمل ألا يكون تبديل الوظيفة المستخدمة بناءً على خيارات أقل التي يحددها المطور أمرًا صعبًا ، لكنني لست متأكدًا من عدد المكتبات التي ستؤثر. إنه مجرد شيء يجب أن تكون على دراية به.

اعتبارًا من الآن ، أدت إضافة syncImport: true إلى خياراتي إلى إصلاح هذا الأمر بالنسبة لي.

(لم يكن موجودًا في الوثائق ... لقد كنت محظوظًا بما يكفي لأن أتعثر عليه في شفرة المصدر)

تم وضع علامة على هذه المشكلة تلقائيًا على أنها قديمة نظرًا لعدم وجود نشاط حديث لها. سيتم إغلاقه إذا لم يحدث أي نشاط آخر. شكرا لمساهماتكم.

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