
يبدو ، لماذا نحتاج إلى مكتبة أخرى للعمل مع التواريخ والأوقات التي توجد بها مكتبة لحظات معروفة ؟! الأكثر إثارة للاهتمام هو أن البديل اقترحه فريق Moment نفسه.
تم
إعلان مكتبة
Luxon كأداة قوية وحديثة ومريحة للعمل مع التواريخ والأوقات في JavaScript. تم إنشاء المكتبة من قبل إسحاق كامبرون ، عضو فريق تطوير Moment منذ عام 2013.
كان لدى المؤلف العديد من الأفكار لتطوير Moment ، والتي لم يستطع صنعها في إطار الكود الموجود. فيما يلي النقاط الرئيسية التي أردت تنفيذها:
- جرب بعض الأفكار حول كيفية جعل واجهة برمجة التطبيقات أكثر منطقية (ولكن هذه الأفكار لم تكن متوافقة مع المنهج الذي تبناه مومنت) ،
- تنفيذ العمل "خارج الصندوق" مع المناطق الزمنية دون ملحقات إضافية ،
- إعادة التفكير بشكل كامل في العمل مع التدويل ، مع مراعاة ظهور API Intl ،
- التبديل إلى مجموعة حديثة من الأدوات والمناهج في تشكيل كود JS.
لذلك ، قرر أن يكتب كل شيء من الصفر ، والذي استغرق حوالي عامين.
والنتيجة هي نوع من نسخة حديثة من Moment.
بدا أن الإصدار الناتج مثير للاهتمام لفريق تطوير Moment بأكمله ، لذلك تقرر الترويج للمكتبة الجديدة تحت رعاية الفريق.
مبادئ Luxon
- سلاسل المكالمات كما في لحظة.
- جميع الأنواع غير قابلة للتغيير.
- واجهة برمجة التطبيقات (API) أكثر وضوحًا: للكائنات المختلفة - طرق مختلفة مع معلمات محددة بوضوح.
- API Intl للتدويل (العودة إلى إصدار اللغة الإنجليزية إذا كان المتصفح لا يدعم API Intl).
- API Intl للعمل مع المناطق الزمنية.
- المزيد من الدعم الكامل لحساب المدة.
- دعم الفاصل الأصلي.
- وثائق رمز مضمنة.
أدت هذه المبادئ إلى التحسينات التالية:- كود Luxon هو أسهل بكثير لفهم وتصحيح.
- يؤدي استخدام إمكانات المستعرض المضمّنة للتدويل إلى تحسين سلوك المكتبة ، ومرة أخرى ، يجعل تصحيح الأخطاء أسهل.
- يتم تنفيذ دعم المنطقة الزمنية بشكل أفضل من أي مكتبة JS أخرى.
- يوفر Luxon أداة بسيطة وقوية للغاية للعمل مع المدة.
- المكتبة لديها وثائق جيدة.
لكن Luxon لها عيوبها:- يؤدي التركيز على استخدام القدرات المدمجة للمتصفح إلى صعوبات في دعم المتصفحات القديمة.
- بعض ميزات التدويل التي لم تدعمها المتصفحات حتى الآن لا يتم تنفيذها في المكتبة أيضًا (يجب أن تتوقع ظهور هذا الدعم في المتصفحات).
- قد يختلف تطبيق API Intl في متصفحات مختلفة ، على التوالي ، يختلف سلوك Luxon أيضًا.
التثبيت
يوفر Luxon وحدات لجميع منصات JavaScript الحديثة.
تحتوي الوثائق على
قائمة كاملة
بالمتصفحات المدعومة مع قيود التطبيق. بالنسبة للمتصفحات التي لا تحتوي على دعم دولي محدود أو لديها دعم محدود ، يوصى باستخدام polyfile (على وجه الخصوص ، ينطبق هذا على IE 10 أو 11).
عند العمل مع Node.js (6+) ، إذا كنت بحاجة إلى العمل مع لغات ، فستحتاج أيضًا إلى تثبيت حزمة
icu الكاملة وتعيين متغير البيئة لتمكين استخدام هذه الحزمة.
طريقة التثبيت القياسية من npm:
npm تثبيت - حفظ luxonيحتوي Luxon على دعم لكل من TypeScript و Flow ، وهناك أيضًا وحدة نمطية بتنسيق ES6.
مراجعة سريعة
تتكون مكتبة Luxon من خمس فئات رئيسية:
DateTime - التاريخ والوقت مع إعدادات المنطقة الزمنية وعرض ، وكذلك الأساليب ذات الصلة.
المدة - فترة زمنية (المدة) ، على سبيل المثال ، "شهرين" أو "يوم واحد ، 3 ساعات".
معلومات - طرق ثابتة للحصول على بيانات عامة في الوقت والتاريخ.
الفاصل الزمني -
الفاصل الزمني وطرق العمل معها.
الإعدادات هي طرق ثابتة تحدد السلوك العام لـ Luxon.
import {DateTime, Duration, Info, Interval, Settings} from 'luxon';
تاريخك الأول
أهم فئة في Luxon هي DateTime. يمثل DateTime التاريخ + الوقت جنبًا إلى جنب مع المنطقة الزمنية والإعدادات المحلية. هذه هي الطريقة التي يمكنك تعيين 15 مايو 2017 08:30 في المنطقة الزمنية المحلية:
var dt = DateTime.local(2017, 5, 15, 8, 30);
هذه هي الدعوة لتحديد الوقت الحالي:
var now = DateTime.local();
إنشاء من كائن
DateTime.fromObject({ month:12, day: 22, hour: 12, minutes: 20, zone: 'Europe/Kaliningrad' });
إنشاء من السلسلة بتنسيق ISO 8601
DateTime.fromISO("2017-05-15");
عند التحويل إلى سلسلة ، تقوم Luxon أيضًا بإرجاع سلسلة بتنسيق ISO 8601:
DateTime.local().toString();
الحصول على المكونات الفردية:
var dt = DateTime.local(); dt.year;
الإخراج المنسق
يحتوي Luxon على العديد من الطرق لتحويل DateTime إلى سلسلة ، اثنتان منها أهمهما toLocaleString و toISO ، الأول يحول إلى تنسيق يأخذ في الاعتبار ورنيش المستعرض ، والثاني يعد النص للمعالجة البرنامجية (على سبيل المثال ، للنقل إلى خادم):
dt.toLocaleString();
يحتوي Luxon على 24 "إعدادات مسبقة" جاهزة للإخراج المنسق (مثل DATETIME_MED و TIME_WITH_LONG_OFFSET).
يمكنك أيضًا إنشاء خيار التنسيق الخاص بك استنادًا إلى الرموز المميزة:
dt.setLocale('ru').toFormat('d MMMM tt - ZZZZZ');
تحويلات التاريخ والوقت
ملاحظة مهمة: كائنات Luxon غير قابلة للتغيير ، أي أي طرق تعديل مطبقة عليها ستُرجع النسخة المعدلة دون تغيير الكائن الأصلي. لذلك ، يجب فهم جميع المصطلحات الواردة في هذه المقالة (كما هو الحال في وثائق Luxon) مثل "التغيير" ، "التثبيت" ، "إعادة التعريف" على أنها "إنشاء مثيل جديد مع خصائص أخرى".
التحولات الرياضية
var dt = DateTime.local(2018, 12, 18, 20, 30);
تجاوز المعلمات الفردية
var dt = DateTime.local(); dt.set({hour: 3}).hour
التحويلات الدولية
يدعم Luxon العديد من تحويلات Intl المختلفة ، أحد أهمها التنسيق لمختلف اللغات:
var dt = DateTime.local(); var f = {month: 'long', day: 'numeric'}; dt.setLocale('fr').toLocaleString(f);
يمكن لفئة المعلومات إرجاع قوائم بالأشهر وأيام الأسبوع في لغة معينة:
Info.months('long', {locale: 'it'});
المناطق الزمنية
Luxon يدعم المناطق الزمنية. إذا قمت بإنشاء DateTime دون تحديد منطقة زمنية بشكل صريح ، فسيتم تحديد المنطقة المحلية افتراضيًا. إذا قمت بتغيير المنطقة الخاصة بـ DateTime ، فسيتم إعادة حساب الوقت والتاريخ مع مراعاة الفرق بين المناطق الزمنية.
var dt = DateTime.local(2018, 12, 18, 20, 00);
يدعم Luxon أيضًا العمل مع التاريخ والوقت بتنسيق UTC:
DateTime.utc(2018, 5, 15);
المدة
توفر فئة المدة القدرة على العمل لمدة ، على سبيل المثال ، "ساعتان و 7 دقائق". يمكنك إنشاء مدة مثل هذا:
var dur = Duration.fromObject({hours: 2, minutes: 7});
يمكن إضافة فترات زمنية وطرحها. المدة قد يكون لها قيمة سالبة.
dur.minus(dur).minus(dur);
وبالمثل ، يمكن إضافة المدة أو طرحها من DateTime.
DateTime.local().plus(dur);
المدة لها حروف (على غرار تاريخ DateTime):
dur.hours;
المدة لها أيضًا طرق مفيدة أخرى:
dur.as('seconds');
فترات
يتم تعريف الفواصل الزمنية بأنها الفترة الفاصلة بين نقطتين زمنيتين ؛ يتم استخدام فئة الفاصل الزمني للعمل معهم. يتم تضمين وقت البدء في الفاصل الزمني ، لكن وقت الانتهاء ليس كذلك: وفقًا لذلك ، يتم وضع علامة البداية عند التحويل إلى سلسلة مع قوس مربع ، وتكون النهاية مع قوس دائري.
var today = DateTime.local(2018, 12, 18); var later = DateTime.local(2020, 10, 12); var interval = Interval.fromDateTimes(today, later); interval.toString();
يمكن مقارنة الفواصل مع بعضها البعض ودمجها مع بعضها البعض:
var nextYear = Interval.after(DateTime.local(), {year: 1}); var prevYear = Interval.before(DateTime.local(), {year: 1}); prevYear.overlaps(nextYear);
Luxon واللحظة
تعيش مكتبة Luxon في مشروع "Moment" ، ولكنها ليست بديلاً كاملاً لمكتبة Moment. لا يوفر Luxon وظيفة Moment الكاملة ، على سبيل المثال ،
لم يتم تنفيذ
تنسيق التاريخ النسبي مؤخرًا إلا في إصدار متصفح Chrome 71 ، ولا يعمل بعد في المتصفحات الأخرى ، ولم يتم دعمه بعد في Luxon (على الرغم من أنه متوقع). ولكن حتى لو كانت المتصفحات تدعم الوظيفة المطلوبة ، يجب أن تفهم أنها ستكون متاحة فقط في هذه البيئات الجديدة. في المتصفحات القديمة ، ستعمل Luxon مع المشكلات ، بينما تعمل Moment في أي وقت وفي أي مكان.
بالإضافة إلى ذلك ، تمت إعادة تصميم واجهة برمجة تطبيقات Luxon بالكامل وهي مختلفة تمامًا عن واجهة برمجة تطبيقات Moment.
لاحظ الاختلافات الرئيسية بين Moment و Luxon.
الحصانة
كائنات Luxon غير قابلة للتغيير ، لكن Moment لا.
في المثال أدناه ، m1 و m2 هما نفس الكائن الذي تم تعديله بواسطة طريقة الإضافة.
var m1 = moment(); var m2 = m1.add(1, 'hours'); m1 === m2;
في حالة Luxon ، تقوم طريقة الجمع بإرجاع كائن d2 جديد دون تغيير d1 الأصلي.
var d1 = DateTime.local(); var d2 = d1.plus({ hours: 1 }); d1 === d2;
لهذا السبب ، لا يتطلب Luxon منشئي نسخ خاصين أو طرق استنساخ تستخدمها Moment للحصول على نسخ دون تغيير القيمة الأصلية.
الاختلافات الوظيفية الرئيسية
- يبدأ العد التنازلي للأشهر في Luxon من 1 ، وليس من البداية ، كما في Moment (وفي الأصل في كائن Date js).
- يتم تطبيق التعريب والمناطق الزمنية باستخدام API Intl الأصلي (أو polyphile) ، ولا يتم تضمينها في المكتبة.
- يحتوي Luxon على أنواع مدمجة وفترة زمنية.
- لا يدعم Luxon تنسيق التاريخ النسبي.
- لا يوجد لدى Luxon أيضًا طريقة أنسنة لتمثيل المدة بأسلوب "إنساني" (على سبيل المثال ، "بضع ثوان").
اختلافات نمط API
- في أساليب Luxon API ، توجد المعلمات الاختيارية عادةً في آخر.
- يحتوي Luxon على العديد من الطرق المنفصلة لإنشاء كائنات (على سبيل المثال ، fromISO) ، على عكس Moment ، التي لها وظيفة واحدة لهذا ، ويتم تعيين نوع الكائن بواسطة المعلمات.
- لدى Luxon محللون صارمون للغاية ، في حين أن Moment لديه أكثر ليبرالية ، أي إذا كان تنسيق سلسلة الإدخال مختلفًا عن المعيار ، فسيقوم Luxon فورًا بتقديم خطأ ، وستحاول Moment تصحيح بعض الأخطاء في التنسيق.
- يستخدم Luxon getters (dt.year ، dt.isValid) للحصول على قيمة الحقول الداخلية ، وليس أساليب مثل Moment (m.year () ، m.isValid ()).
- يسمح Luxon لطريقة واحدة بتعيين جميع المعلمات الضرورية على الفور ({السنة: 2016 ، الشهر: 4}) ، في لحظة يتم تعيينها واحدة فقط في كل مرة - سلسلة من المكالمات m.year (2016) .month (4).
- المدة في Luxon هي فئة منفصلة من المستوى الأعلى.
خلاف ذلك ، استعار Luxon الكثير من الأفكار من Moment ، حتى أن الوثائق تحتوي على جداول معادلة أساليب Moment و Luxon.
أحجام ملفات المكتبة
لوكون (v. 1.8.2)luxon.min.js - 61 كيلوبايت
لحظة (v. 2.23.0)moment.min.js - 51 كيلو بايت
moment.min.js + locale / ru.js - 59 كيلوبايت
moment-with-locales.min.js - 323 كيلو بايت
كما ترون ، بدون لغات Moment ، يكون الحجم أصغر بمقدار 10 كيلو بايت من Luxon ، ولكن مع إضافة عدة لغات ، يصبح الحجم متساوًا تقريبًا.
إذا كان الدعم مطلوبًا فورًا لجميع المناطق ، فهناك مكسب كبير من Luxon.
ملخص
المكتبة جاهزة تمامًا للاستخدام ويعد المؤلف بدعمها. تحتوي المكتبة بالفعل على 7K + نجوم على جيثب وشعبيتها تنمو فقط. ليس فقط المؤلف نفسه يرتكب الالتزامات في شفرتها ، ولكن على الأقل 6 مطورين آخرين.
سأفترض أن مكتبة Luxon هي استجابة لظهور دعم API Intl في المتصفحات. يدرك مطورو اللحظات أن العمل مع التواريخ على الويب يمكن أن يتغير بشكل كبير ويحاولون الاستعداد لهذه التغييرات. لكنهم لا يستطيعون التنبؤ بدقة بتطوير الويب ، ومعه المشروع الجديد (الذي يسمونه هم أنفسهم مشروع مختبرات Moment). هل سيتم نقل أفكار Luxon إلى Moment 3؟ هل سينتقل معظم المستخدمين من Moment إلى Luxon في وقت ما؟ ربما سيتم إعادة تسمية Luxon بلحظة؟ المطورين أنفسهم يعترفون أنهم لا يستطيعون الآن الإجابة على هذه الأسئلة.