از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
رفع “__dirname در محدوده ماژول ES تعریف نشده است” در جاوا اسکریپت/نود
سرفصلهای مطلب
هنگام تغییر از ماژول های CommonJS به ماژول های ES، چند تفاوت وجود دارد که متوجه خواهید شد. یکی از خطاهایی که احتمالاً با آن مواجه خواهید شد این است:خطای مرجع کشف نشده: __dirname در محدوده ماژول ES تعریف نشده است“. این خطا دقیقاً همان چیزی است که به نظر می رسد، جهانی __dirname
متغیر هنگام استفاده از ماژول های ES تعریف نشده است. این در مورد جهانی نیز صادق است __filename
متغیر.
برای رفع این مشکل، باید از راه حلی استفاده کنید که در زیر توضیح داده شده است.
راه حل
برای دریافت فهرست فایل فعلی، می خواهیم از ترکیبی از یک متغیر سراسری و چند روش داخلی استفاده کنیم:
import.meta.url
برای دریافت فایل فعلی به عنوان URLurl.fileURLToPath
برای تغییر URL به یک مسیرpath.dirname
برای دریافت نام دایرکتوری
با استفاده از این روش ها می توانیم جهانی را بازسازی کنیم __dirname
و __filename
متغیرهایی که برای استفاده در CommonJS در دسترس هستند:
import path from 'path';
import url from 'url';
const __filename = url.fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
console.log(__filename);
console.log(__dirname);
// Prints:
// /Users/scott/sandbox/javascript/index.mjs
// /Users/scott/sandbox/javascript
مسلماً مهمترین بخش در اینجا این است import.meta.url
متغیر جهانی، که به ما امکان می دهد URL فایل فعلی را دریافت کنیم، که سپس می تواند به یک مسیر تبدیل شود. این نزدیکترین معادل است __filename
که در ماژول های ES داریم.
گوچاس
یکی از مشکلات انجام این کار این است که ما نمی توانیم به سادگی آن را چند بار پر کنیم __dirname
و __filename
متغیرها در حوزه جهانی ما باید آنها را در محدوده ماژول ایجاد کنیم. این به این دلیل است که با تنظیم آنها به عنوان متغیرهای سراسری یا انتقال این متغیرها، آنها همچنان به فایل اصلی که در آن ایجاد شده اند اشاره می کنند.
خوب این به چه معنا است؟ ما نیاز داریم این متغیرها را در هر فایلی که در آن استفاده می شود ایجاد کنید. در حالی که آزاردهنده است، چیزی است که باید با آن کار کنیم. برای آسانتر کردن کارها، میتوانید یک روش کمکی برای کاهش آن به یک واحد ایجاد کنید import و فراخوانی تک تابع:
import path from 'path';
import url from 'url';
export function currDir(fileUrl) {
const __filename = url.fileURLToPath(fileUrl);
return path.dirname(__filename);
}
سپس می توانید به راحتی از این روش کمکی برای دریافت دایرکتوری فایل فعلی مانند زیر استفاده کنید:
import { currDir } from './lib';
const __dirname = currDir(import.meta.url);
console.log(__dirname);
// Prints: /Users/scott/sandbox/javascript
(برچسبها برای ترجمه)# جاوا اسکریپت
منتشر شده در 1403-01-06 22:45:05