TL; DR - Nicht bis ~ Oktober 2019. Das Node.js Modules Team hat gefragt :
Bitte veröffentlichen Sie keine ES-Modulpakete, die von Node.js verwendet werden sollen, bis [Oktober 2019]
2019 Mai Update
Seit 2015, als diese Frage gestellt wurde, ist die JavaScript-Unterstützung für Module erheblich ausgereift und wird hoffentlich im Oktober 2019 offiziell stabil sein. Alle anderen Antworten sind jetzt veraltet oder übermäßig kompliziert. Hier ist die aktuelle Situation und Best Practice.
ES6-Unterstützung
99% von ES6 (auch bekannt als 2015) wird seit Version 6 von Node unterstützt . Die aktuelle Version von Node ist 12. Alle immergrünen Browser unterstützen die überwiegende Mehrheit der ES6-Funktionen. ECMAScript ist jetzt in der Version 2019 und das Versionsschema bevorzugt jetzt die Verwendung von Jahren.
ES-Module (auch bekannt als ECMAScript-Module) in Browsern
Alle immergrün Browser wurden unterstützt import
-ing ES6 Module seit 2017. Dynamische Importe werden unterstützt von Chrome (+ Gabeln wie Opera und Samsung Internet) und Safari. Die Firefox-Unterstützung ist für die nächste Version 67 vorgesehen.
Sie benötigen kein Webpack / Rollup / Paket usw. mehr, um Module zu laden. Sie können für andere Zwecke noch nützlich sein, müssen jedoch nicht Ihren Code laden. Sie können URLs direkt importieren, die auf den Code des ES-Moduls verweisen.
ES-Module im Knoten
ES-Module ( .mjs
Dateien mit import
/ export
) werden seit Node v8.5.0 durch Aufrufen node
mit dem --experimental-modules
Flag unterstützt. Node v12, veröffentlicht im April 2019, hat die Unterstützung für experimentelle Module neu geschrieben. Die sichtbarste Änderung ist, dass die Dateierweiterung beim Import standardmäßig angegeben werden muss:
// lib.mjs
export const hello = 'Hello world!';
// index.mjs:
import { hello } from './lib.mjs';
console.log(hello);
Beachten Sie die obligatorischen .mjs
Erweiterungen. Rennen wie:
node --experimental-modules index.mjs
Die Node 12-Version wurde auch veröffentlicht, als das Modules-Team die Entwickler aufforderte , keine ES-Modulpakete zu veröffentlichen, die für die Verwendung durch Node.js vorgesehen sind, bis eine Lösung für die Verwendung von Paketen über require('pkg')
und gefunden wurde import 'pkg'
. Sie können weiterhin native ES-Module veröffentlichen, die für Browser bestimmt sind.
Ökosystemunterstützung nativer ES-Module
Ab Mai 2019 ist die Ökosystemunterstützung für ES-Module noch nicht ausgereift. Beispielsweise werden Test-Frameworks wie Jest und Ava nicht unterstützt --experimental-modules
. Sie müssen einen Transpiler verwenden und sich dann zwischen der benannten import ( import { symbol }
) -Syntax (die mit den meisten npm-Paketen noch nicht funktioniert) und der Standardimportsyntax ( import Package from 'package'
) entscheiden, die funktioniert, aber nicht, wenn Babel sie analysiert Für in TypeScript erstellte Pakete (Graphql-Tools, Node-Influx, Faast usw.) gibt es jedoch eine Problemumgehung, die sowohl mit --experimental-modules
als auch mit Babel funktioniert, wenn Babel Ihren Code transpiliert, sodass Sie ihn mit Jest / Ava / Mocha usw. testen können:
import * as ApolloServerM from 'apollo-server'; const ApolloServer = ApolloServerM.default || ApolloServerM;
Wohl hässlich, aber auf diese Weise können Sie Ihren eigenen ES-Modulcode mit import
/ schreiben export
und ihn node --experimental-modules
ohne Transpiler ausführen . Wenn Sie Abhängigkeiten haben, die noch nicht ESM-fähig sind, importieren Sie sie wie oben beschrieben, und Sie können Testframeworks und andere Tools über Babel verwenden.
Vorherige Antwort auf die Frage - denken Sie daran, tun Sie dies erst, wenn Node das Erfordernis / Import-Problem gelöst hat, hoffentlich um Oktober 2019.
Veröffentlichen von ES6-Modulen in npm mit Abwärtskompatibilität
Um ein ES-Modul auf npmjs.org zu veröffentlichen, damit es ohne Babel oder andere Transpiler direkt importiert werden kann, zeigen Sie einfach das main
Feld in Ihrem package.json
auf die .mjs
Datei, lassen Sie jedoch die Erweiterung weg :
{
"name": "mjs-example",
"main": "index"
}
Das ist die einzige Änderung. Wenn Sie die Erweiterung weglassen, sucht Node zuerst nach einer mjs-Datei, wenn sie mit --experimental-modules ausgeführt wird. Andernfalls wird auf die .js-Datei zurückgegriffen, sodass Ihr vorhandener Transpilationsprozess zur Unterstützung älterer Node-Versionen wie zuvor funktioniert. Stellen Sie einfach sicher, dass Babel auf die .mjs
Datei (en) verweist .
Hier ist die Quelle für ein natives ES-Modul mit Abwärtskompatibilität für Knoten <8.5.0 , das ich in NPM veröffentlicht habe. Sie können es jetzt verwenden, ohne Babel oder irgendetwas anderes.
Installieren Sie das Modul:
npm install local-iso-dt
# or, yarn add local-iso-dt
Erstellen Sie eine Testdatei test.mjs :
import { localISOdt } from 'local-iso-dt/index.mjs';
console.log(localISOdt(), 'Starting job...');
Führen Sie den Knoten (v8.5.0 +) mit dem Flag --experimental-modules aus:
node --experimental-modules test.mjs
Typoskript
Wenn Sie in TypeScript entwickeln, können Sie ES6-Code generieren und ES6-Module verwenden:
tsc index.js --target es6 --modules es2015
Dann müssen Sie die *.js
Ausgabe in umbenennen .mjs
, ein bekanntes Problem , das hoffentlich bald behoben wird, damit Dateien direkt tsc
ausgegeben .mjs
werden können.