Simpul 13.2.0 & Di Atas
NodeJS 13.2.0 sekarang mendukung Modul ES tanpa flag 🎉 Namun, implementasi masih ditandai sebagai eksperimental jadi gunakan dalam produksi dengan hati-hati.
Untuk mengaktifkan dukungan ESM di 13.2.0, tambahkan yang berikut ke Anda package.json
:
{
"type": "module"
}
Semua .js
, .mjs
(atau file tanpa ekstensi) akan diperlakukan sebagai ESM.
Ada sejumlah opsi berbeda selain seluruh package.json
keikutsertaan, yang semuanya dirinci dalam Dokumentasi untuk 13.2.0 .
Simpul 13.1.0 & Di Bawah
Mereka yang masih menggunakan versi Node yang lebih lama mungkin ingin mencoba esm module loader, yang merupakan implementasi siap dari Spesifikasi Modul ES untuk NodeJS:
node -r esm main.js
Pembaruan Lengkap ...
23 April 2019
Seorang PR baru-baru ini mendarat untuk mengubah cara Modul ES terdeteksi:
https://github.com/nodejs/node/pull/26745
Itu masih di belakang --experimental-modules
bendera, tetapi ada perubahan besar dalam cara modul dapat dimuat:
package.type
yang bisa berupa module
ataucommonjs
type: "commonjs"
:
.js
diurai sebagai commonjs
- default untuk titik masuk tanpa ekstensi adalah commonjs
type: "module"
:
.js
diuraikan sebagai esm
- tidak mendukung memuat JSON atau Modul Asli secara default
- default untuk titik masuk tanpa ekstensi adalah ESM
--type=[mode]
untuk membiarkan Anda mengatur jenisnya pada titik masuk. Akan mengganti package.type
untuk titik masuk.
- Ekstensi file baru
.cjs
.
- ini khusus untuk mendukung pengimporan commonjs dalam
module
mode.
- ini hanya di esm loader, loader commonjs tetap tidak tersentuh, tetapi ekstensi akan berfungsi di loader lama jika Anda menggunakan path file lengkap.
--es-module-specifier-resolution=[type]
- pilihannya adalah
explicit
(standar) dannode
- secara default loader kami tidak akan mengizinkan ekstensi opsional di impor, jalur untuk modul harus menyertakan ekstensi jika ada
- secara default loader kami tidak akan memungkinkan untuk mengimpor direktori yang memiliki file indeks
- pengembang dapat digunakan
--es-module-specifier-resolution=node
untuk mengaktifkan algoritma resolusi specifier commonjs
- Ini bukan "fitur" melainkan implementasi untuk eksperimen. Diharapkan untuk berubah sebelum bendera dihapus
--experimental-json-loader
- satu-satunya cara untuk mengimpor json ketika
"type": "module"
- ketika memungkinkan semua
import 'thing.json'
akan melalui loader eksperimental independen dari mode
- berdasarkan whatwg / html # 4315
- Anda dapat menggunakan
package.main
untuk mengatur titik masuk untuk modul
- ekstensi file yang digunakan di utama akan diselesaikan berdasarkan pada jenis modul
17 Januari 2019
Node 11.6.0 masih mencantumkan Modul ES sebagai percobaan, di belakang sebuah bendera.
13 September 2017
NodeJS 8.5.0 telah dirilis dengan dukungan untuk file mjs di belakang sebuah flag:
node --experimental-modules index.mjs
Rencana untuk ini adalah menghapus bendera untuk rilis LTS v10.0.
- Informasi yang Diperpanjang. Tetap di sini untuk keperluan sejarah -
8 September 2017
Cabang utama NodeJS telah diperbarui dengan dukungan awal untuk modul ESM:
https://github.com/nodejs/node/commit/c8a389e19f172edbada83f59944cad7cc802d9d5
Ini harus tersedia pada malam terakhir (ini dapat diinstal melalui nvm untuk berjalan di samping instalasi Anda yang ada):
https://nodejs.org/download/nightly/
Dan diaktifkan di belakang --experimental-modules
bendera:
package.json
{
"name": "testing-mjs",
"version": "1.0.0",
"description": "",
"main": "index.mjs" <-- Set this to be an mjs file
}
Lalu lari:
node --experimental-modules .
Februari 2017:
https://medium.com/@jasnell/an-update-on-es6-modules-in-node-js-42c958b890c#.6ye7mtn37
Orang-orang NodeJS telah memutuskan bahwa solusi yang paling buruk adalah dengan menggunakan .mjs
ekstensi file. Keuntungan dari ini adalah:
Dengan kata lain, diberikan dua file foo.js
dan bar.mjs
, menggunakan import *
from 'foo'
akan memperlakukan foo.js
sebagai CommonJS sementara import * from 'bar'
akan memperlakukan bar.mjs
sebagai Modul ES6
Dan untuk garis waktu ...
Pada titik saat ini, masih ada sejumlah spesifikasi dan masalah implementasi yang perlu terjadi pada sisi ES6 dan Mesin Virtual sebelum Node.js bahkan dapat mulai mengerjakan implementasi yang didukung dari modul ES6. Pekerjaan sedang berlangsung tetapi akan memakan waktu - Saat ini kami sedang mencari di sekitar setahun setidaknya .
Oktober 2016:
Salah satu pengembang di Node.JS baru-baru ini menghadiri pertemuan TC-39 dan menulis artikel hebat tentang blocker untuk diterapkan untuk Node.JS:
https://hackernoon.com/node-js-tc-39-and-modules-a1118aecf95e
Dasar pengambilan dari itu adalah:
- Modul ES dianalisis secara statis, CommonJS dievaluasi
- Modul CommonJS memungkinkan ekspor patch-monyet, Modul ES saat ini tidak
- Sulit untuk mendeteksi apa itu Modul ES dan apa yang CommonJS tanpa beberapa bentuk input pengguna, tetapi mereka berusaha.
*.mjs
tampaknya solusi yang paling mungkin, kecuali mereka dapat secara akurat mendeteksi Modul ES tanpa input pengguna
- Jawaban Asli -
Ini telah menjadi kentang panas selama beberapa waktu. Intinya adalah bahwa ya, Node pada akhirnya akan mendukung sintaks ES2015 untuk mengimpor / mengekspor modul - kemungkinan besar ketika spesifikasi untuk memuat modul diselesaikan dan disepakati.
Berikut ini adalah ikhtisar yang baik tentang apa yang menahan NodeJS. Pada dasarnya, mereka perlu memastikan bahwa spesifikasi baru berfungsi untuk Node yang terutama bersyarat, pemuatan sinkron dan juga HTML yang terutama tidak sinkron.
Tidak ada yang tahu pasti sekarang, tapi saya membayangkan Node akan mendukung import/export
untuk pembebanan statis, selain yang baru System.import
untuk pembebanan dinamis - sambil tetap menyimpan require
kode lawas.
Berikut adalah beberapa proposal tentang bagaimana Node dapat mencapai ini:
node es2015 modules
, perlihatkan berikut ini sebagai salah satu hasil teratas: github.com/nodejs/node/wiki/ES6-Module-Detection-in-Node .