Pesan kesalahan “__dirname is not defined in ES module scope” biasanya muncul ketika menggunakan ES modul di Node.js. Tidak seperti modul CommonJS, modul ES tidak memiliki variabel __dirname yang secara default tersedia.

Mengatasi “__dirname is not defined in ES module scope”

Ada beberapa alternatif untuk mendapatkan string yang sama dengan yang dimiliki oleh __dirname yang kompatibel dengan modul ES:

  1. Menggunakan import.meta.url dan path.dirname:
import path from 'path';
import { fileURLToPath } from 'url';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
  1. Menggunakan Konstruktor URL:
import { URL } from 'url';

const __filename = new URL('', import.meta.url).pathname;
const __dirname = new URL('.', import.meta.url).pathname;

import.meta

import.meta adalah properti meta yang mengekspos metadata khusus konteks ke modul ES, tidak dapat digunakan di luar modul, dibuat oleh host environment, dan mungkin memiliki properti yang berbeda tergantung pada lingkungannya. Beberapa properti yang umum adalah:

  • import.meta.url: URL lengkap ke modul, termasuk parameter kueri dan/atau hash.
  • import.meta.resolve: Fungsi yang mengubah penentu modul menjadi URL dengan menggunakan URL modul saat ini sebagai acuan.

import.meta dapat berguna untuk mengoper parameter kueri ke modul, mendapatkan path file modul saat ini, atau mengakses algoritme resolusi penentu modul.

Perbedaan antara modul ES dan CommonJS

Jika sudah mengaktifkan modul ES di Node.js (melalui “type”: “module” di package.json) atau menggunakan modul ES melalui bundler modul seperti Webpack, maka kita tidak lagi memiliki akses ke variabel-variabel berikut ini jika dibanding dengan CommonJS:

  • __dirname: Jalur absolut direktori yang berisi berkas modul saat ini.
  • __filename: Nama berkas dari modul saat ini, termasuk path absolutnya.
  • require: Fungsi untuk mengimpor modul di CommonJS. Dalam modul ES, Anda dapat menggunakan import sebagai gantinya. Jika diperlukan, fungsi require dapat dibuat di dalam modul ES menggunakan module.createRequire().
  • module: Objek yang merepresentasikan modul saat ini dan memiliki properti seperti module.exports dan module.id. Sebagai gantinya, gunakan import.meta.
  • exports: Objek yang diekspor oleh modul saat ini, bisa menggunakan export.
  • require.resolve: Resolusi relatif dapat ditangani melalui URL baru(‘./local', import.meta.url). Untuk penggantian require.resolve yang lengkap, ada API import.meta.resolve eksperimental yang ditandai. Sebagai alternatif, module.createRequire() dapat digunakan.
  • NODE_PATH: Bukan bagian dari penentu impor yang diselesaikan, gunakan symlink jika perilaku ini diinginkan.
  • require.extensions: Tidak digunakan oleh impor. Harapannya adalah hook pemuat dapat menyediakan alur kerja ini di masa depan.
  • require.cache: Tidak digunakan oleh impor karena pemuat modul ES memiliki cache tersendiri.

Perlu diingat bahwa __dirname dan __filename bukanlah variabel global di Node.js, melainkan variabel tersebut dicakup oleh modul saat ini. Ini berarti nilainya akan berbeda di modul yang berbeda, tergantung pada lokasi modul dalam sistem berkas.

About the Author

Dzul Qurnain

Suka nonton Anime, ngoding dan bagi-bagi tips kalau tahu.. Oh iya, suka baca ( tapi yang menarik menurutku aja)...

View All Articles