TL; DR - No, fino a ~ ottobre 2019. Il team di moduli Node.js ha chiesto :
Non pubblicare pacchetti di moduli ES destinati all'uso da Node.js fino a [ottobre 2019]
Aggiornamento di maggio 2019
Dal 2015, quando è stata posta questa domanda, il supporto JavaScript per i moduli è maturato in modo significativo e si spera sarà ufficialmente stabile nell'ottobre 2019. Tutte le altre risposte sono ora obsolete o eccessivamente complicate. Ecco la situazione attuale e le migliori pratiche.
Supporto ES6
Il 99% di ES6 (aka 2015) è stato supportato da Node dalla versione 6 . La versione corrente di Node è 12. Tutti i browser sempreverdi supportano la stragrande maggioranza delle funzionalità ES6. ECMAScript è ora alla versione 2019 e lo schema di versioning ora favorisce l'utilizzo degli anni.
Moduli ES (noti anche come moduli ECMAScript) nei browser
Tutti i browser sempreverdi sono state sostenendo import
-Ing moduli ES6 dal 2017. importazioni dinamici sono supportati da Chrome (+ forchette come Opera e Samsung Internet) e Safari. Il supporto di Firefox è previsto per la prossima versione, 67.
Non è più necessario Webpack / rollup / Parcel ecc. Per caricare i moduli. Possono essere ancora utili per altri scopi, ma non sono tenuti a caricare il codice. È possibile importare direttamente gli URL che puntano al codice dei moduli ES.
Moduli ES nel nodo
I moduli ES ( .mjs
file con import
/ export
) sono supportati dal Nodo v8.5.0 chiamando node
con il --experimental-modules
flag. Il nodo v12, rilasciato nell'aprile 2019, ha riscritto il supporto dei moduli sperimentali. La modifica più visibile è che l'estensione del file deve essere specificata per impostazione predefinita durante l'importazione:
// lib.mjs
export const hello = 'Hello world!';
// index.mjs:
import { hello } from './lib.mjs';
console.log(hello);
Nota le .mjs
estensioni obbligatorie in tutto. Correre come:
node --experimental-modules index.mjs
La versione Nodo 12 è anche quando il team dei moduli ha chiesto agli sviluppatori di non pubblicare pacchetti di moduli ES destinati all'uso da Node.js fino a quando non viene trovata una soluzione per l'utilizzo dei pacchetti tramite entrambi require('pkg')
e import 'pkg'
. Puoi comunque pubblicare moduli ES nativi destinati ai browser.
Supporto ecosistemico di moduli ES nativi
A partire da maggio 2019, il supporto dell'ecosistema per i moduli ES è immaturo. Ad esempio, i framework di test come Jest e Ava non supportano --experimental-modules
. È necessario utilizzare un transpiler e quindi decidere se utilizzare la import { symbol }
sintassi denominata import ( ) (che non funzionerà ancora con la maggior parte dei pacchetti npm) e la sintassi di importazione predefinita ( import Package from 'package'
), che funziona, ma non quando Babel lo analizza per i pacchetti creati in TypeScript (graphql-tools, node-influx, faast ecc.) Esiste comunque una soluzione alternativa che funziona sia con --experimental-modules
che se Babel traspila il codice in modo da poterlo testare con Jest / Ava / Mocha ecc:
import * as ApolloServerM from 'apollo-server'; const ApolloServer = ApolloServerM.default || ApolloServerM;
Probabilmente brutto, ma in questo modo è possibile scrivere il proprio codice di moduli ES con import
/ export
ed eseguirlo con node --experimental-modules
, senza transpilers. Se hai dipendenze che non sono ancora pronte per ESM, importale come sopra e sarai in grado di utilizzare i framework di test e altri strumenti tramite Babel.
Risposta precedente alla domanda: ricorda, non farlo fino a quando Nodo non risolve il problema di richiesta / importazione, si spera intorno a ottobre 2019.
Pubblicazione di moduli ES6 su npm, con compatibilità con le versioni precedenti
Per pubblicare un modulo ES per npmjs.org in modo che possa essere importato direttamente, senza Babel o altro transpilers, è sufficiente puntare il main
campo nel package.json
al .mjs
file, ma omettere l'estensione:
{
"name": "mjs-example",
"main": "index"
}
Questo è l'unico cambiamento. Omettendo l'estensione, Node cercherà prima un file mjs se eseguito con --experimental-modules. Altrimenti tornerà al file .js, quindi il tuo processo di transpilation esistente per supportare le versioni precedenti di Node funzionerà come prima - assicurati di puntare Babel ai .mjs
file.
Ecco la fonte di un modulo ES nativo con retrocompatibilità per Nodo <8.5.0 che ho pubblicato su NPM. Puoi usarlo adesso, senza Babele o altro.
Installa il modulo:
npm install local-iso-dt
# or, yarn add local-iso-dt
Creare un file di test test.mjs :
import { localISOdt } from 'local-iso-dt/index.mjs';
console.log(localISOdt(), 'Starting job...');
Esegui nodo (v8.5.0 +) con il flag --experimental-modules:
node --experimental-modules test.mjs
Dattiloscritto
Se sviluppi in TypeScript, puoi generare il codice ES6 e utilizzare i moduli ES6:
tsc index.js --target es6 --modules es2015
Quindi, è necessario rinominare l' *.js
output in .mjs
, un problema noto che si spera venga risolto presto in modo da tsc
poter emettere .mjs
direttamente i file.