رفع خطای MODULE_NOT_FOUND در Nodejs
خطای "Cannot find module" یا "MODULE_NOT_FOUND" زمانی رخ میدهد که IDE شما قادر به شناسایی یک بسته NPM خاص نباشد. برای رفع این خطا لازم است اقداماتی که در ادامه آموزش به آن ها اشاره می شود را انجام داده و پس از آن یکبار پروژه را به جهت بررسی رفع خطا اجرا نمائید.
1. اطمینان از نصب پکیج NPM
برای رفع خطای "Cannot find module" در Node.js، اطمینان حاصل کنید که پکیج NPM نصب شده و در فایل package.json پروژه شما موجود است. اگر این فایل در مسیر پروژه موجود نبود؛ میتوانید یک پکیج را با استفاده از دستور npm i از NPM نصب کنید، برای مثال:
npm i example
نکته: example نام پکیج مدنظر می باشد.
اگر از مدیریت پکیج جایگزین مانند Yarn و PNPM استفاده میکنید باید از دستورات زیر بهره ببرید:
# Yarn
yarn add example
# PNPM
pnpm add example
پس از نصب، بسته در بخش dependencies فایل package.json اضافه خواهد شد. اگر پکیج فقط برای زمان توسعه استفاده میشود و جهت اجرای نهایی برنامه ضروری نیست میتوانید آن را بهعنوان یک development dependency نصب کنید. پکیجهایی مانند nodemon و ts-node در این دسته قرار میگیرند.
# NPM
npm i -D nodemon
# Yarn
yarn add -D nodemon
# PNPM
pnpm add -D nodemon
پس از نصب، این پکیج در بخش devDependencies فایل package.json قرار خواهد گرفت.
2. نصب مجدد بسته
اگر مشکل رفع نشد؛ پکیج را یکبار دیگر در پروژه خود نصب کنید، حتی اگر قبلاً این کار را انجام دادهاید:
# NPM
npm i -D example
# Yarn
yarn example
# NPM
yarn add example
3. نصب مجدد تمامی بستهها
اگر با انجام اقدامات قبل باز هم مشکل رفع نشد؛ میتوانید تمام پکیجهای NPM نصبشده در پروژه خود را حذف کرده و دوباره نصب کنید. این کار با استفاده از دستورات زیر امکان پذیر است:
# NPM
rm package-lock.json
rm node_modules -r
npm cache clear
npm install
# Yarn
rm yarn.lock
rm node_modules -r
yarn cache clean
yarn install
# PNPM
rm pnpm-lock.yaml
rm node_modules -r
pnpm store prune
pnpm install
دستور npm cache clear به پاککردن کش پکیج NPM کمک میکند و هرگونه فایل مرتبط با ماژول خراب را از بین میبرد.
4. TypeScript: نصب type definitionها
زمانی که پکیجی را به یک فایل TypeScript وارد کنید؛ اما هیچ تعریف تایپی (type definitions) برای آن شناسایی نشود؛ خطای MODULE_NOT_FOUND رخ میدهد. اگر پکیج دارای یک ماژول مهم Node.js مانند http یا fs باشد، ممکن است نیاز داشته باشید که مقدار "node" را به تنظیمات compilerOptions.types در فایل tsconfig.json اضافه کنید:
{
"compilerOptions": {
"types": [
"node"
]
},
اگر پکیج موردنظر یک ماژول third-party باشد، نصب type definitions آن از NPM میتواند مشکل را حل کند. به عنوان مثال:
npm i @types/express
5. اطمینان از وجود فایل اصلی در package.json
اگر فیلد main در فایل package.json وجود نداشته باشد؛ با خطای "Cannot find module" مواجه خواهید شد.
۶. استفاده از دستور npm link برای پکیجها
میتوانید از دستور npm link برای رفع خطای MODULE_NOT_FOUND استفاده کنید. برای مثال:
npm link create-react-app
npm link webpack
دستور npm link پکیج نصب شده بهصورت سراسری (globally) را با استفاده از یک لینک نمادین به پروژه محلی (local) متصل میکند. این قابلیت به شما اجازه میدهد روی یک پکیج بهصورت local کار کنید بدون اینکه نیازی به انتشار آن در رجیستری npm یا نصب دوباره آن پس از هر تغییر داشته باشید. اجرای دستور npm link در دایرکتوری پکیج، یک لینک نمادین در پوشهٔ global (سراسری) node_modules ایجاد میکند که به پکیج محلی اشاره خواهد کرد. سپس میتوانید از دستور <npm link <package-name در پروژه خود استفاده کنید تا پکیج globally را به پروژه local لینک نمایید.
۷. اطمینان از تنظیم صحیح NODE_PATH
در نسخههای قدیمیتر Node.js، ممکن است بتوانید با تنظیم متغیر محیطی NODE_PATH در مسیر صحیح نصب node_modules، خطای "Cannot find module" را برطرف کنید.
NODE_PATH یکرشته از مسیرها است که با علامت دونقطه (:) جدا شدهاند و Node.js از آن برای پیدا کردن ماژولها، زمانی که در مسیرهای معمول پیدا نمیشوند، استفاده میکند.