NodeJS prevede di supportare i moduli import / export es6 (es2015)

Ho cercato su Internet senza una risposta chiara per questo.

Attualmente NodeJS utilizza solo la syntax CommonJS per caricare i moduli e, se si desidera realmente utilizzare la syntax dei moduli ES2015 standard, è necessario prima eseguirne il transpile o utilizzare un caricatore di moduli esterno in fase di runtime.

Al momento non sono troppo ottimista per utilizzare uno di questi due metodi, i manutentori di NodeJS hanno addirittura intenzione di supportare i moduli ES2015 o no? Non ho trovato alcun suggerimento su questo.

Al momento NodeJS 6.x afferma di supportare il 96% delle funzionalità di ES2015, ma non vi è alcun riferimento ai moduli ( link di supporto NodeJS ES2105 ).

Sai se NodeJS supporterà questi moduli fuori dagli schemi, nel prossimo futuro?

Aggiornamento 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.

Aggiornamento 8 settembre 2017

Il ramo principale NodeJS è stato aggiornato con il supporto iniziale per i moduli ESM:
https://github.com/nodejs/node/commit/c8a389e19f172edbada83f59944cad7cc802d9d5

Questo dovrebbe essere disponibile nelle ultime ore notturne (questo può essere installato tramite nvm per essere eseguito insieme all’installazione esistente):
https://nodejs.org/download/nightly/

E abilitato dietro il --experimental-modules :

package.json

 { "name": "testing-mjs", "version": "1.0.0", "description": "", "main": "index.mjs" <-- Set this to be an mjs file } 

Quindi esegui:

 node --experimental-modules . 

- Informazioni obsolete. Tenuto qui per scopi storici--

Aggiornamento 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 ctriggers è usare l'estensione del file .mjs . Il takeaway da questo è:

In altre parole, dati due file foo.js e bar.mjs , usando import * from 'foo' considereremo foo.js come CommonJS mentre import * from 'bar' considererà bar.mjs come un modulo ES6

E per quanto riguarda le tempistiche ...

Al momento attuale, ci sono ancora un numero di specifiche e problemi di implementazione che devono accadere sul lato ES6 e sulla parte Virtual Machine prima che Node.js possa iniziare a elaborare un'implementazione supportata di moduli ES6. I lavori sono in corso ma ci vorrà del tempo - Al momento stiamo valutando circa un anno.

Aggiornamento ottobre 2016:

Uno degli sviluppatori di Node.JS ha recentemente partecipato a una riunione del TC-39 e ha scritto un superbo articolo sui blocchi da implementare per Node.JS:

https://hackernoon.com/node-js-tc-39-and-modules-a1118aecf95e

Il take-away di base è:

  • I moduli ES vengono analizzati staticamente, i CommonJS vengono valutati
  • I moduli CommonJS consentono esportazioni di patch-scimmia, i moduli ES attualmente non lo fanno
  • È difficile rilevare cosa sia un modulo ES e cosa sia CommonJS senza una qualche forma di input da parte dell'utente, ma ci stanno provando.
  • *.mjs sembra la soluzione più probabile, a meno che non possano rilevare con precisione un modulo ES senza input dell'utente

- Risposta originale -

Questa è stata una patata bollente per un bel po 'di tempo. La linea di fondo è che sì, il nodo alla fine supporterà la syntax ES2015 per l'importazione / esportazione di moduli - molto probabilmente quando le specifiche per il caricamento dei moduli sono finalizzate e concordate.

Ecco una buona panoramica di ciò che tiene in sospeso NodeJS. Essenzialmente, devono assicurarsi che le nuove specifiche funzionino per il nodo, che è principalmente il caricamento condizionale, sincrono e anche HTML, che è principalmente asincrono.

Nessuno lo sa per certo adesso, ma immagino che Node supporterà l' import/export per il caricamento statico, oltre al nuovo System.import per il caricamento dinamico, pur mantenendo il require per il codice legacy.

Ecco alcune proposte su come Node potrebbe ottenere questo:

  • In difesa di .js
  • Moduli .mjs