الخطألم يتم العثور على الوحدة النمطية: خطأ: لا يمكن حل ‘./something’ في Webpack يعني أن المجمع لم يتمكن من العثور على الوحدة النمطية التي قمت باستيرادها. وله عدة أسباب — حزم مفقودة، أو مسارات خاطئة، أو حساسية لحالة الأحرف، أو مشكلات في التكوين. وإليك كيفية إصلاح كل منهما.
📋 Table of Contents
- ماذا يعني هذا الخطأ
- السبب الأول: الحزمة غير مثبتة
- السبب 2: مسار نسبي خاطئ
- السبب 3: حساسية الحالة
- السبب 4: ملحق الملف مفقود في التكوين
- السبب 5: لم يتم تكوين الأسماء المستعارة للمسار
- السبب 6: استيراد دليل بدون ملف الفهرس
- السبب 7: وحدات Node.js الأساسية في حزمة المتصفح
- خطوات التصحيح
- الأسئلة المتداولة
- الخلاصة
ماذا يعني هذا الخطأ
ينشئ Webpack رسمًا بيانيًا للتبعية باتباع وارداتك. تعني عبارة “لا يمكن الحل” أنه اتبع عملية استيراد ولكن لم يتمكن من العثور على الملف أو الحزمة المستهدفة. عادةً ما يشير الخطأ إلى الوحدة النمطية التي لم يتمكن من العثور عليها والملف الذي استوردها – ابدأ من هناك.
السبب الأول: الحزمة غير مثبتة
# Error: Can't resolve 'lodash'
# The package isn't installed
# ✅ Install it
npm install lodash
# Verify it's in package.json and node_modules
npm list lodash
# If node_modules is corrupted, reinstall
rm -rf node_modules package-lock.json
npm install
السبب 2: مسار نسبي خاطئ
// 🐛 Wrong path - file is somewhere else
import { helper } from './utils/helper'; // but it's at ./lib/helper
// ✅ Fix the path
import { helper } from './lib/helper';
// Common mistakes:
// - Missing ./ for local files (Webpack looks in node_modules without it)
import x from 'components/Button'; // ❌ looks in node_modules
import x from './components/Button'; // ✅ relative to current file
// - Wrong number of ../ for parent directories
import x from '../../utils/x'; // count directories carefully
السبب 3: حساسية الحالة
// 🐛 Works on Mac/Windows (case-insensitive) but fails on Linux/CI
import Button from './components/button'; // file is Button.jsx
// ✅ Match the exact case of the filename
import Button from './components/Button'; // Button.jsx
// Case mismatches are the #1 cause of "works locally, fails in CI"
// because Linux file systems are case-sensitive
السبب 4: ملحق الملف مفقود في التكوين
// 🐛 Importing without extension, but Webpack doesn't know to try .tsx
import App from './App'; // App.tsx exists but Webpack can't resolve
// ✅ Add extensions to Webpack resolve config
// webpack.config.js
module.exports = {
resolve: {
extensions: ['.js', '.jsx', '.ts', '.tsx', '.json'],
// Now Webpack tries these extensions when none is specified
},
};
السبب 5: لم يتم تكوين الأسماء المستعارة للمسار
// 🐛 Using @ alias but Webpack doesn't know it
import Button from '@/components/Button'; // Can't resolve '@'
// ✅ Configure the alias in webpack.config.js
const path = require('path');
module.exports = {
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
},
},
};
// If using TypeScript, also add to tsconfig.json:
{
"compilerOptions": {
"baseUrl": ".",
"paths": { "@/*": ["src/*"] }
}
}
// Both must agree - Webpack for bundling, tsconfig for type checking
السبب 6: استيراد دليل بدون ملف الفهرس
// 🐛 Importing a folder that has no index file
import { utils } from './helpers'; // ./helpers is a folder
// ✅ Ensure the folder has an index.js/ts, or import the specific file
// ./helpers/index.js exports the utils, OR:
import { utils } from './helpers/utils'; // specific file
السبب 7: وحدات Node.js الأساسية في حزمة المتصفح
// 🐛 Can't resolve 'fs' or 'path' - Node modules don't exist in browsers
// A package tried to use Node.js core modules in browser code
// ✅ In Webpack 5, configure fallbacks or exclude them
module.exports = {
resolve: {
fallback: {
"fs": false, // not available in browser
"path": require.resolve("path-browserify"),
"crypto": require.resolve("crypto-browserify"),
},
},
};
// Or find a browser-compatible alternative to the package
خطوات التصحيح
- اقرأ الخطأ كاملاً – يقوم بتسمية الوحدة النمطية وملف الاستيراد
- تحقق من تثبيت الحزمة —
npm list <module> - التحقق من المسار والحالة – التهجئة الدقيقة والأحرف الكبيرة
- تحقق من Resolve.extensions – هل تم تكوين امتداد الملف؟
- التحقق من الأسماء المستعارة — هل تم تكوين @ أو أسماء مستعارة أخرى في كل من Webpack وtsconfig؟
- أعد تشغيل خادم التطوير – تتطلب تغييرات التكوين إعادة التشغيل
الأسئلة المتداولة
س: لماذا يعمل محليًا ولكنه يفشل في CI/الإنتاج؟
ج: دائمًا ما تكون حساسية حالة الأحرف — macOS/Windows غير حساسة لحالة الأحرف، أما Linux (CI/production) فهو حساس لحالة الأحرف. ./components/button يعمل محليًا ولكنه يفشل على Linux إذا كان الملفButton.jsx. قم دائمًا بمطابقة حالة اسم الملف تمامًا.
س: لقد قمت بتثبيت الحزمة ولكن لا يزال يظهر لي “لا يمكن الحل”. لماذا؟
ج: أعد تشغيل خادم التطوير (ذاكرة التخزين المؤقت لـ Webpack). تحقق من أن الحزمة موجودة فعليًا في العقدة node_modules وpackage.json. إذا كان استيرادًا محليًا، فتحقق من المسار والحالة. احذف Node_modules وأعد تثبيته إذا كانت قائمة الوحدات تبدو خاطئة.
س: كيف يمكنني الاستيراد دون تحديد امتدادات الملفات؟
ج: أضف الامتدادات إلىresolve.extensions في webpack.config.js (على سبيل المثال،['.js', '.jsx', '.ts', '.tsx']). ثم يحاول Webpack تجربة كل ملحق عند الاستيراد بدون ملحق. أعد تشغيل خادم التطوير بعد تغيير التكوين.
س: كيف أقوم بإعداد @ الأسماء المستعارة للمسار؟
ج: تكوينresolve.alias في webpack.config.js (تعيين @ إلى دليل src الخاص بك) وpaths في tsconfig.json في حالة استخدام TypeScript. يجب أن يتفق كلاهما – Webpack للتجميع، وTypeScript للتحقق من النوع. أعد التشغيل بعد التغيير.
س: لماذا لا يستطيع Webpack تحليل “fs” أو “path”؟
ج: هذه هي وحدات Node.js الأساسية غير الموجودة في المتصفحات. تحاول الحزمة استخدامها في كود المتصفح. تكوينresolve.fallback في Webpack 5 لتوفير بدائل للمتصفح (أو خطأ للاستثناء)، أو العثور على حزمة متوافقة مع المتصفح.
الخلاصة
“لم يتم العثور على الوحدة: لا يمكن الحل” في Webpack يعني أن المجمّع لم يتمكن من العثور على وحدة مستوردة. العمل من خلال الأسباب:تأكد من تثبيت الحزمة، وتحقق من المسار وحالة الأحرف (حساسية حالة الأحرف تسبب معظم حالات فشل CI)، وقم بتكوين Resolve.extensions لعمليات الاستيراد بدون امتدادات، وقم بإعداد الأسماء المستعارة للمسار في كل من Webpack وtsconfig، والتعامل مع الوحدات الأساسية للعقدة مع عمليات احتياطية لحزم المتصفح. اقرأ الخطأ بالكامل — فهو يسمي الوحدة المفقودة وملف الاستيراد، ويوجهك إلى المصدر. أعد تشغيل خادم التطوير بعد تغييرات التكوين. يتم حل معظم الحالات عن طريق إصلاح مسار الاستيراد (شاهد الحالة!) أو تثبيت الحزمة المفقودة. بمجرد أن يتمكن Webpack من متابعة عملية الاستيراد إلى ملف حقيقي، يتم مسح الخطأ.
🔗 Share this article
✍️ Leave a Comment