Status dukungan saat ini untuk modul ECMAScript (ESM) di Node.js:
- Dukungan ESM eksperimental telah ditambahkan di Node.js 8.5.0 pada 12 September 2017.
- Setelah itu, Komite Pengarah Teknis Node.js membentuk tim yang bertanggung jawab atas Tim Modul untuk membantu merancang bagian yang hilang untuk rilis (non-eksperimental) yang akan datang. Tim ini terdiri dari orang-orang dari berbagai industri pengembangan web (frontend, backend, mesin JS, dll.).
Pada bulan Oktober, Tim Modul menerbitkan "Rencana Implementasi Modul Baru" . Posting ini menjelaskan apa yang dikandungnya.
Fase
Proses ini dibagi menjadi tiga fase:
- Fase 1: buat inti "minimum" - seperangkat aturan dan kemampuan dasar, seminimal dan setepat mungkin.
- Fase 2 dan seterusnya: membuat fungsionalitas yang lebih kompleks berdasarkan pada kernel.
Inti minimal akan menjadi dasar untuk pekerjaan di masa depan. Desain baru juga akan menggantikan implementasi eksperimental saat ini segera setelah memperoleh kemampuan yang sama.
Fase 1: dukungan ESM inti minimum di Node.js
Penyederhanaan pengidentifikasi modul
Salah satu tujuan Tim Modul adalah untuk mencapai "kesetaraan browser" : Node.js harus sedekat mungkin dengan browser. Kernel mencapai ini dengan menyederhanakan parsing pengidentifikasi modul (URL yang menunjuk ke modul):
- Setiap pengidentifikasi modul harus diakhiri dengan nama file dengan ekstensi. Yaitu
- Ekstensi tidak ditambahkan secara otomatis
- Mengimpor direktori tidak didukung (baik melalui pengalihan ke
dir/index.mjs
, atau membaca bidang main
di package.json
).
- Modul ES dapat mengimpor modul Node.js bawaan (
path
dan sejenisnya). Mereka adalah satu-satunya pengecualian pada aturan sebelumnya. - Secara default, hanya file dengan ekstensi
.mjs
yang .mjs
(lihat Fase 2 jika Anda tertarik dengan status ekstensi lainnya). Dengan demikian, jenis modul lainnya tidak dapat diimpor melalui import
: modul CommonJS, file JSON, modul asli.
Membawa Fitur-Fitur Esensial CommonJS ke Modul ES
- URL modul saat ini (mirip dengan
__filename
dari CommonJS): import.meta.url - Impor modul ES secara dinamis (tersedia melalui persyaratan
require()
di CommonJS): import()
Kompatibilitas
import {createRequireFromPath as createRequire} from 'module'; import {fileURLToPath as fromPath} from 'url'; const require = createRequire(fromPath(import.meta.url)); const cjsModule = require('./cjs-module.js');
- Modul CommonJS akan dapat memuat modul ES melalui
import()
.
Fase 2 dan Rencana Mendatang
- Pada fase kedua, kami menunggu:
- Dukungan untuk pengidentifikasi "telanjang" seperti
'lodash'
. Kemungkinan besar, ini akan mencakup beberapa cara memetakan pengidentifikasi ini ke jalur nyata. - Mendukung ekstensi file lain selain
.mjs
. Ini termasuk, antara lain, dukungan untuk modul ES dalam file .js
.
- Fase 3 kemungkinan besar akan fokus pada pemuat modul dengan titik ekstensi tempat pengguna dapat menyambungkan logikanya.
Kapan saya bisa menggunakan modul ES di Node.js?
- Di belakang bendera: tersedia sekarang
- Peringatan: perilaku belum cocok dengan yang dijelaskan di atas dalam fase 1 (pada Node.js 11.5.0)
- Tanpa bendera dan sesuai dengan fase 1: Tim Modul berusaha membuat ini sesegera mungkin. Kami berharap bahwa modul akan dirilis dari bawah bendera di Node.js 14 (April 2020) dan porting ke versi sebelumnya, jika memungkinkan.
Pertanyaan yang Sering Diajukan
- Mengapa saya perlu
.mjs
file .mjs
baru?
- Setiap keputusan untuk membedakan antara format ESM dan CommonJS memiliki kelebihan dan kekurangan. Menggunakan resolusi terpisah sepertinya merupakan opsi yang baik ( info lebih lanjut ).
- Mengapa Node.js berperilaku seperti browser?
- Karena itu memungkinkan penggunaan kembali kode. Misalnya, untuk membuat perpustakaan yang berfungsi di browser dan di Node.js
- Ini juga harus memfasilitasi perpindahan antara backend dan frontend selama pengkodean.
- Mengapa semua pembatasan ini untuk kompatibilitas?
- Ada perbedaan yang cukup kuat antara modul ES dan CommonJS dalam struktur (statis versus dinamis) dan cara memuat (asinkron versus sinkron). Kendala membantu menjaga hal-hal sederhana - mengingat bahwa dalam jangka panjang, sebagian besar akan menjadi modul ES.
- Mengapa itu semua bertahan begitu lama?
- Banyak pemangku kepentingan terlibat di sini dan banyak platform berbeda yang terlibat (Node.js, npm, browser, mesin JS, TypeScript, TC39, dan lainnya). Jika kita benar-benar mendapatkan ES-modul yang dapat bekerja di mana saja, mungkin layak untuk ditunggu, IMHO.
Terima kasih
Terima kasih kepada Miles Borins atas tanggapannya pada pos ini.
Sumber Tambahan untuk Bacaan Lebih Lanjut