Nodo 13.2.0 e versioni successive
NodeJS 13.2.0 ora supporta i moduli ES senza un flag 🎉 Tuttavia, l'implementazione è ancora contrassegnata come sperimentale, quindi utilizzare in produzione con cautela.
Per abilitare il supporto ESM in 13.2.0, aggiungere quanto segue a package.json
:
{
"type": "module"
}
Tutti .js
, .mjs
(o file senza estensione) saranno trattati come ESM.
Esistono diverse opzioni diverse dall'intero package.json
opt-in, tutte dettagliate nella Documentazione per 13.2.0 .
Nodo 13.1.0 e precedenti
Coloro che utilizzano ancora versioni precedenti di Node potrebbero voler provare il caricatore del modulo esm , che è un'implementazione pronta per la produzione delle specifiche dei moduli ES per NodeJS:
node -r esm main.js
Aggiornamenti dettagliati ...
23 aprile 2019
Un PR è recentemente arrivato per cambiare il modo in cui i moduli ES vengono rilevati:
https://github.com/nodejs/node/pull/26745
È ancora dietro la --experimental-modules
bandiera, ma ci sono importanti cambiamenti nel modo in cui i moduli possono essere caricati:
package.type
che può essere module
ocommonjs
type: "commonjs"
:
.js
viene analizzato come commonjs
- l'impostazione predefinita per il punto di ingresso senza estensione è commonjs
type: "module"
:
.js
viene analizzato come esm
- non supporta il caricamento di JSON o Native Module per impostazione predefinita
- il valore predefinito per il punto di ingresso senza estensione è esm
--type=[mode]
per consentire di impostare il tipo sul punto di ingresso. Sostituirà il package.type
punto di ingresso.
- Una nuova estensione di file
.cjs
.
- questo è specificamente per supportare l'importazione di commonjs in
module
modalità.
- questo è solo nel caricatore esm, il caricatore commonjs rimane intatto, ma l'estensione funzionerà nel vecchio caricatore se si utilizza il percorso completo del file.
--es-module-specifier-resolution=[type]
- le opzioni sono
explicit
(impostazione predefinita) enode
- per impostazione predefinita il nostro caricatore non consentirà estensioni opzionali nell'importazione, il percorso per un modulo deve includere l'estensione se ce n'è una
- per impostazione predefinita, il nostro caricatore non consentirà l'importazione di directory con un file indice
- gli sviluppatori possono utilizzare
--es-module-specifier-resolution=node
per abilitare l'algoritmo di risoluzione dell'identificatore commonjs
- Questa non è una "caratteristica" ma piuttosto un'implementazione per la sperimentazione. Si prevede che cambi prima che il flag venga rimosso
--experimental-json-loader
- l'unico modo per importare json quando
"type": "module"
- quando abilita tutto
import 'thing.json'
passerà attraverso il caricatore sperimentale indipendentemente dalla modalità
- basato su whatwg / html # 4315
- È possibile utilizzare
package.main
per impostare un punto di ingresso per un modulo
- le estensioni dei file utilizzate in main verranno risolte in base al tipo di modulo
17 gennaio 2019
Il nodo 11.6.0 elenca ancora i moduli ES come sperimentali, dietro una bandiera.
13 settembre 2017
NodeJS 8.5.0 è stato rilasciato con il supporto per i file mjs dietro un flag:
node --experimental-modules index.mjs
Il piano per questo è rimuovere il flag per la versione LTS v10.0.
- Informazioni obsolete. Tenuto qui per scopi storici
8 settembre 2017
La diramazione principale di NodeJS è stata aggiornata con il supporto iniziale per i moduli ESM:
https://github.com/nodejs/node/commit/c8a389e19f172edbada83f59944cad7cc802d9d5
Questo dovrebbe essere disponibile nelle ultime ore notturne (può essere installato tramite nvm per essere eseguito insieme all'installazione esistente):
https://nodejs.org/download/nightly/
E abilitato dietro la --experimental-modules
bandiera:
package.json
{
"name": "testing-mjs",
"version": "1.0.0",
"description": "",
"main": "index.mjs" <-- Set this to be an mjs file
}
Quindi eseguire:
node --experimental-modules .
Febbraio 2017:
https://medium.com/@jasnell/an-update-on-es6-modules-in-node-js-42c958b890c#.6ye7mtn37
I ragazzi di NodeJS hanno deciso che la soluzione meno negativa è usare l' .mjs
estensione del file. L'asporto da questo è:
In altre parole, dati due file foo.js
e bar.mjs
, usando import *
from 'foo'
tratterà foo.js
come CommonJS mentre import * from 'bar'
tratteranno bar.mjs
come un modulo ES6
E per quanto riguarda le tempistiche ...
Al momento attuale, ci sono ancora una serie di problemi di specifica e implementazione che devono accadere sul lato ES6 e sul lato Virtual Machine prima che Node.js possa persino iniziare a elaborare un'implementazione sostenibile dei moduli ES6. I lavori sono in corso ma ci vorrà del tempo: al momento stiamo guardando almeno un anno .
Ottobre 2016:
Uno degli sviluppatori di Node.JS ha recentemente partecipato a una riunione del TC-39 e ha scritto un superbo articolo sui bloccanti per l'implementazione di Node.JS:
https://hackernoon.com/node-js-tc-39-and-modules-a1118aecf95e
Il take-away di base è:
- I moduli ES vengono analizzati staticamente, vengono valutati CommonJS
- I moduli CommonJS consentono esportazioni di patch per scimmie, mentre i moduli ES attualmente no
- È difficile rilevare cos'è un modulo ES e cos'è CommonJS senza una qualche forma di input dell'utente, ma ci stanno provando.
*.mjs
sembra la soluzione più probabile, a meno che non siano in grado di rilevare con precisione un modulo ES senza l'input dell'utente
- Risposta originale -
Questa è stata una patata bollente per un bel po 'di tempo. La linea di fondo è che sì, Node alla fine supporterà la sintassi ES2015 per l'importazione / esportazione di moduli - molto probabilmente quando le specifiche per il caricamento dei moduli saranno finalizzate e concordate.
Ecco una buona panoramica di ciò che regge NodeJS. In sostanza, devono assicurarsi che le nuove specifiche funzionino per Node, che è principalmente carico condizionale, sincrono e anche HTML che è principalmente asincrono.
Nessuno lo sa con certezza in questo momento, ma immagino che Node supporterà il import/export
caricamento statico, oltre al nuovo System.import
per il caricamento dinamico, mantenendo comunque il require
codice legacy.
Ecco alcune proposte su come Node potrebbe raggiungere questo obiettivo:
node es2015 modules
, mostra quanto segue come uno dei migliori risultati: github.com/nodejs/node/wiki/ES6-Module-Detection-in-Node .