TL; DR - Ne le faites pas, jusqu'au ~ octobre 2019. L' équipe des modules Node.js a demandé :
Veuillez ne publier aucun package de module ES destiné à être utilisé par Node.js avant [octobre 2019]
Mise à jour de mai 2019
Depuis 2015, date à laquelle cette question a été posée, la prise en charge de JavaScript pour les modules a considérablement mûri et, espérons-le, sera officiellement stable en octobre 2019. Toutes les autres réponses sont désormais obsolètes ou trop compliquées. Voici la situation actuelle et les meilleures pratiques.
Prise en charge ES6
99% de ES6 (aka 2015) est pris en charge par Node depuis la version 6 . La version actuelle de Node est 12. Tous les navigateurs Evergreen prennent en charge la grande majorité des fonctionnalités ES6. ECMAScript est maintenant à la version 2019 , et le schéma de gestion des versions favorise désormais l'utilisation des années.
Modules ES (également appelés modules ECMAScript) dans les navigateurs
Tous les navigateurs Evergreen prennent en charge les import
modules ES6 depuis 2017. Les importations dynamiques sont prises en charge par Chrome (+ forks comme Opera et Samsung Internet) et Safari. La prise en charge de Firefox est prévue pour la prochaine version, 67.
Vous n'avez plus besoin de Webpack / rollup / Parcel etc. pour charger des modules. Ils peuvent être encore utiles à d'autres fins, mais ne sont pas nécessaires pour charger votre code. Vous pouvez importer directement des URL pointant vers le code des modules ES.
Modules ES dans Node
Les modules ES ( .mjs
fichiers avec import
/ export
) sont pris en charge depuis Node v8.5.0 en appelant node
avec l' --experimental-modules
indicateur. Node v12, sorti en avril 2019, a réécrit le support des modules expérimentaux. Le changement le plus visible est que l'extension de fichier doit être spécifiée par défaut lors de l'importation:
// lib.mjs
export const hello = 'Hello world!';
// index.mjs:
import { hello } from './lib.mjs';
console.log(hello);
Notez les .mjs
extensions obligatoires partout. Courir comme:
node --experimental-modules index.mjs
La version Node 12 correspond également au moment où l'équipe des modules a demandé aux développeurs de ne pas publier de packages de modules ES destinés à être utilisés par Node.js jusqu'à ce qu'une solution soit trouvée pour utiliser les packages via require('pkg')
et import 'pkg'
. Vous pouvez toujours publier des modules ES natifs destinés aux navigateurs.
Prise en charge de l'écosystème des modules ES natifs
En mai 2019, le support de l'écosystème pour les modules ES est immature. Par exemple, les frameworks de test comme Jest et Ava ne prennent pas en charge --experimental-modules
. Vous devez utiliser un transpilateur, et devez ensuite décider entre utiliser la import { symbol }
syntaxe nommée import ( ) (qui ne fonctionnera pas encore avec la plupart des packages npm) et la syntaxe d'importation par défaut ( import Package from 'package'
), qui fonctionne, mais pas lorsque Babel l'analyse pour les paquets créés en TypeScript (graphql-tools, node-influx, faast etc.) Il existe cependant une solution de contournement qui fonctionne à la fois avec --experimental-modules
et si Babel transpile votre code afin que vous puissiez le tester avec Jest / Ava / Mocha etc:
import * as ApolloServerM from 'apollo-server'; const ApolloServer = ApolloServerM.default || ApolloServerM;
Sans doute moche, mais de cette façon, vous pouvez écrire votre propre code de modules ES avec import
/ export
et l'exécuter avec node --experimental-modules
, sans transpilers. Si vous avez des dépendances qui ne sont pas encore prêtes pour ESM, importez-les comme ci-dessus, et vous pourrez utiliser des frameworks de test et d'autres outils via Babel.
Réponse précédente à la question - rappelez-vous, ne le faites pas tant que Node n'a pas résolu le problème de demande / importation, espérons-le vers octobre 2019.
Publication de modules ES6 sur npm, avec compatibilité descendante
Pour publier un module ES sur npmjs.org afin qu'il puisse être importé directement, sans Babel ou d'autres transpileurs, pointez simplement le main
champ de votre package.json
vers le .mjs
fichier, mais omettez l'extension:
{
"name": "mjs-example",
"main": "index"
}
C'est le seul changement. En omettant l'extension, Node recherchera d'abord un fichier mjs s'il est exécuté avec --experimental-modules. Sinon, il reviendra au fichier .js, donc votre processus de transpilation existant pour prendre en charge les anciennes versions de Node fonctionnera comme avant - assurez-vous simplement de pointer Babel vers le ou les .mjs
fichiers.
Voici la source d'un module ES natif avec rétrocompatibilité pour Node <8.5.0 que j'ai publié sur NPM. Vous pouvez l'utiliser dès maintenant, sans Babel ou autre chose.
Installez le module:
npm install local-iso-dt
# or, yarn add local-iso-dt
Créez un fichier test test.mjs :
import { localISOdt } from 'local-iso-dt/index.mjs';
console.log(localISOdt(), 'Starting job...');
Exécutez le nœud (v8.5.0 +) avec l'indicateur --experimental-modules:
node --experimental-modules test.mjs
Manuscrit
Si vous développez en TypeScript, vous pouvez générer du code ES6 et utiliser des modules ES6:
tsc index.js --target es6 --modules es2015
Ensuite, vous devez renommer la *.js
sortie en .mjs
, un problème connu qui, espérons-le, sera bientôt résolu afin de tsc
pouvoir générer .mjs
directement les fichiers.