Moment: أضف دعمًا للحزم المتوافقة مع ESM

تم إنشاؤها على ١٢ نوفمبر ٢٠١٩  ·  3تعليقات  ·  مصدر: moment/moment

مرحبا!

شكرا لك على هذه المكتبة الرائعة!

ومع ذلك ، أعتقد أن الحقل "module" في بيان الحزمة (ملف package.json ) يجب أن يشير إلى حزمة ESM ، على سبيل المثال ./src/moment.js .

يجب أن تكون الحزم التي تدعم ESM (Webpack و Rollup وغيرهما) قادرة على العثور على حزمة ESM باستخدام حقل module أجل استخدام تقنيات التحسين الحديثة (مثل اهتزاز الشجرة). في الوقت الحالي ، يتم استخدام حزمة UMD ./moment.js بدلاً من ذلك.

يؤدي هذا إلى تحميل المكتبة بأكملها في المشاريع الممكّنة لـ ESM ، حتى إذا قمت باستيراد رمز واحد منها.

على سبيل المثال ، استيراد مثل هذا:

import { isMoment } from 'moment';

سيستورد كل شيء من المكتبة ، ومع ذلك ، تم طلب وظيفة واحدة فقط.

ولا يمكنك استخدام import { isMoment } from 'moment/src/moment'; كحل بديل في مشاريع TypeScript لأنه سيؤدي إلى كسر الكتابة.

BuilRelease Help Wanted

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

بعد الاطلاع على محتوى ./src/moment.js أعيد كلامي إلى الوراء. المحتوى ليس له أي معنى من وجهة نظر ESM. بدلاً من استيراد وإعادة تصدير الرموز المفيدة مثل Moment ، isMoment ، إلخ ، يتم إنشاء كائن وتصديره. أعتقد أنها نقطة دخول لحزمة UMD ، أليس كذلك؟

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

لقد تمكنت من استيراد الرموز التي أحتاجها (بدون تحميل حزمة Mom.js بأكملها) بهذه الطريقة:

// @ts-ignore
import { isMoment, Moment } from 'moment/src/lib/moment/constructor';

لكن اضطررت إلى منع أخطاء الكتابة باستخدام @ts-ignore ، والذي يسمح بالاستيراد ، لكنه يكسر جميع الكتابة للرموز المستوردة. أيضًا ، المسار قبيح ويجب ألا يستخدمه المستخدمون النهائيون (لأنه يكسر التغليف).


لقد أجريت تجربة للتو. لقد قمت بإنشاء ملف يسمى moment.esm.js في جذر الحزمة بالمحتوى التالي:

export { isMoment, Moment } from './src/lib/moment/constructor';

وإضافة حقل module للإشارة إليه من بيان الحزمة.

ثم قمت باستيراده في تطبيقي:

import { isMoment, Moment } from 'moment';

تم استيراده بشكل صحيح مع عمل إعلانات الكتابة كما هو متوقع وعمل أيضًا بشكل صحيح أثناء إنشاء Webpack و Rollup. تم استيراد الرموز المحددة فقط دون تحميل حزمة كاملة بكل اللغات.

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

ال 3 كومينتر

بعد الاطلاع على محتوى ./src/moment.js أعيد كلامي إلى الوراء. المحتوى ليس له أي معنى من وجهة نظر ESM. بدلاً من استيراد وإعادة تصدير الرموز المفيدة مثل Moment ، isMoment ، إلخ ، يتم إنشاء كائن وتصديره. أعتقد أنها نقطة دخول لحزمة UMD ، أليس كذلك؟

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

لقد تمكنت من استيراد الرموز التي أحتاجها (بدون تحميل حزمة Mom.js بأكملها) بهذه الطريقة:

// @ts-ignore
import { isMoment, Moment } from 'moment/src/lib/moment/constructor';

لكن اضطررت إلى منع أخطاء الكتابة باستخدام @ts-ignore ، والذي يسمح بالاستيراد ، لكنه يكسر جميع الكتابة للرموز المستوردة. أيضًا ، المسار قبيح ويجب ألا يستخدمه المستخدمون النهائيون (لأنه يكسر التغليف).


لقد أجريت تجربة للتو. لقد قمت بإنشاء ملف يسمى moment.esm.js في جذر الحزمة بالمحتوى التالي:

export { isMoment, Moment } from './src/lib/moment/constructor';

وإضافة حقل module للإشارة إليه من بيان الحزمة.

ثم قمت باستيراده في تطبيقي:

import { isMoment, Moment } from 'moment';

تم استيراده بشكل صحيح مع عمل إعلانات الكتابة كما هو متوقع وعمل أيضًا بشكل صحيح أثناء إنشاء Webpack و Rollup. تم استيراد الرموز المحددة فقط دون تحميل حزمة كاملة بكل اللغات.

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

أنا أؤيد هذا.

راجع https://momentjs.com/docs/#/ -project-status /

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