كمطورين لـ JavaScript وTypeScript، غالبًا ما نواجه أخطاء غير متوقعة أثناء العمل مع أنظمة وحدات مختلفة. إحدى المشكلات الشائعة هي الخطأ "لا يمكن استخدام عبارة الاستيراد خارج الوحدة النمطية". يظهر هذا عادةً عند العمل مع وحدات ES الحديثة (ESM) أو التعامل مع الإعدادات التي تتضمن أدوات حزم مثل بيئات Webpack أو Babel أو Node.js. في هذه المدونة، سنستكشف أسباب هذا الخطأ وسبب حدوثه والحلول العملية لحله.
الخطأ " لا يمكن استخدام عبارة الاستيراد خارج الوحدة النمطية" لا يحتاج إلى شرح: يحدث عندما تواجه JavaScript عبارة استيراد خارج وحدة ES صالحة. في JavaScript، تحدد أنظمة الوحدة كيفية تقسيم التعليمات البرمجية في ملفات متعددة وكيفية تفاعلها مع بعضها البعض، وحدات ES (الاستيراد/التصدير) وCommonJS (require/module.exports) هما نظاما الوحدة الأساسيان.
إذا لم يتعرف جافا سكريبت على الكود الخاص بك كوحدة ES، فإنه يعرض هذا الخطأ.ما الذي يسبب الخطأ "لا يمكن استخدام بيان الاستيراد خارج الوحدة النمطية"؟
إليك بعض الأسباب الأكثر شيوعًا لحدوث هذا الخطأ:
استخدام Node.js بشكل افتراضي : بشكل افتراضي، يستخدم Node.js وحدات CommonJS (CJS)، وليس وحدات ES. وهذا يعني أن صيغة الاستيراد/التصدير غير مدعومة أصلاً ما لم يتم تحديدها.
تم تكوين Babel/Webpack بشكل خاطئ: عند تجميع التعليمات البرمجية الخاصة بك، قد لا يتم تكوين أدوات مثل Babel أو Webpack للتعامل مع وحدات ES بشكل صحيح، خاصة إذا كانت البيئة المستهدفة لا تدعمها أصلاً.
: إذا كنت تستخدم وحدات ES في مشروع Node.js، فستحتاج إلى تحديده بشكل صريح عن طريق إضافة "النوع" : "الوحدة النمطية" في package.json الخاص بك.
: في بعض الأحيان، قد يؤدي استخدام .js بدلاً من .mjs لوحدات ES أو العكس إلى حدوث هذا الخطأ.
الطريقة الأولى: تعديل package.json:
{
"النوع": "الوحدة النمطية"
}
{ "type": "module" }
الطريقة الثانية: إعادة تسمية الملفات إلى .mjs:
إذا كنت لا ترغب في تعديل package.json الخاص بك، فيمكنك إعادة تسمية ملفاتك إلى .mjs (على سبيل المثال، Index.mjs) للإشارة بوضوح إلى أنها وحدات ES.
بالنسبة لـ Babel: قم بتحديث ملف .babelrc أو babel.config.json:
{
"الإعدادات المسبقة": ["@babel/وحدات الإعداد المسبق"]
}
{ "presets": ["@babel/preset-modules"] }
module.exports = {
الوحدة النمطية: {
قواعد: [
{
الاختبار: /\.js$/،
استبعاد: /node_modules/،
يستخدم: {
محمل: 'محمل بابل'،
خيارات: {
الإعدادات المسبقة: ['@babel/preset-env']
}
}
}
]
}
};
module.exports = { module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-env'] } } } ] } };
إذا كنت تقوم باستيراد وحدة نمطية منNode_modules، فتأكد من أن الحزمة تدعم وحدات ES. إذا لم يكن الأمر كذلك، فقد تحتاج إلى استخدام أداة تجميع مثل Webpack للتعامل معها.
.mjs: وحدات ES
وحدات ES
يتم تحميل وحدات ES بشكل غير متزامن، مما يسمح بأداء أفضل وتحميل متوازي للوحدات. كما أنها تدعم عمليات التصدير المسماة والصادرات الافتراضية والتبعيات الدورية. يتم دعم وحدات ES على نطاق واسع في المتصفحات الحديثة وNode.js (مع علامة "النوع": "الوحدة النمطية").
وحدات CommonJS
وحدات CommonJS غير مدعومة أصلاً في المتصفحات، ولكن يمكن نقلها إلى وحدات ES باستخدام أدوات مثل Babel أو Webpack. لا تزال وحدات CommonJS تُستخدم على نطاق واسع في مشاريع Node.js، لكن وحدات ES أصبحت أكثر شيوعًا نظرًا لأدائها الأفضل وقابليتها للتحليل الثابت.
يرجع سبب وجود هذين النظامين إلى تطور JavaScript والحاجة إلى نظام وحدات أكثر حداثة وموحدًا. وحدات ES هي مستقبل وحدات JavaScript، لكن وحدات CommonJS لا تزال تستخدم على نطاق واسع في المشاريع والبيئات الحالية.
نصائح التصحيح
: تأكد من أنك تقوم بتشغيل الإصدار 12.x من Node.js أو أعلى، حيث تم تقديم دعم وحدات ES محليًا في Node.js 12. إذا كنت في الإصدار الأقدم، لن تعمل وحدات ES. قم بتحديث الإصدار الخاص بك عن طريق زيارة موقع Node.js.
: إذا كنت تعمل في بيئة متصفح، فتأكد من أن متصفحك يدعم وحدات ES. معظم المتصفحات الحديثة تفعل ذلك، لكن الإصدارات الأقدم قد لا تفعل ذلك.
: في بعض الأحيان، قد يؤدي خطأ مطبعي بسيط في التعليمات البرمجية الخاصة بك إلى حدوث هذا الخطأ. تحقق مرة أخرى من التعليمات البرمجية الخاصة بك بحثًا عن أي أخطاء إملائية أو بناء جملة غير صحيح.
: إذا كنت تستخدم TypeScript وواجهت هذا الخطأ، فقم بتشغيل npx tsc لتجميع تعليمات TypeScript البرمجية في JavaScript، مما قد يساعد في اكتشاف المشكلات.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3