مرحبا!
شكرا لك على هذه المكتبة الرائعة!
ومع ذلك ، أعتقد أن الحقل "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 لأنه سيؤدي إلى كسر الكتابة.
بعد الاطلاع على محتوى ./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 /
التعليق الأكثر فائدة
بعد الاطلاع على محتوى
./src/moment.js
أعيد كلامي إلى الوراء. المحتوى ليس له أي معنى من وجهة نظر ESM. بدلاً من استيراد وإعادة تصدير الرموز المفيدة مثلMoment
،isMoment
، إلخ ، يتم إنشاء كائن وتصديره. أعتقد أنها نقطة دخول لحزمة UMD ، أليس كذلك؟لكي تعمل الأدوات الحديثة ، نحتاج إلى حزمة ESM مناسبة ، والتي ستصدر جميع الرموز المفيدة بشكل فردي.
لقد تمكنت من استيراد الرموز التي أحتاجها (بدون تحميل حزمة Mom.js بأكملها) بهذه الطريقة:
لكن اضطررت إلى منع أخطاء الكتابة باستخدام
@ts-ignore
، والذي يسمح بالاستيراد ، لكنه يكسر جميع الكتابة للرموز المستوردة. أيضًا ، المسار قبيح ويجب ألا يستخدمه المستخدمون النهائيون (لأنه يكسر التغليف).لقد أجريت تجربة للتو. لقد قمت بإنشاء ملف يسمى
moment.esm.js
في جذر الحزمة بالمحتوى التالي:وإضافة حقل
module
للإشارة إليه من بيان الحزمة.ثم قمت باستيراده في تطبيقي:
تم استيراده بشكل صحيح مع عمل إعلانات الكتابة كما هو متوقع وعمل أيضًا بشكل صحيح أثناء إنشاء Webpack و Rollup. تم استيراد الرموز المحددة فقط دون تحميل حزمة كاملة بكل اللغات.
أعتقد أن هذه طريقة للذهاب ويمكن توسيعها لتصدير رموز أخرى موصوفة في الإعلانات.