Cet article présente principalement l'utilisation de la méthode d'analyse du module ES natif dans Node.js, ainsi que des liens vers certains contenus. Examinons-le ensemble. Les amis qui en ont besoin peuvent s'y référer.
À partir de la version 8.5.0, Node.js prend en charge les modules ES natifs, qui peuvent être activés via les options de ligne de commande. Les nouvelles fonctionnalités sont en grande partie dues à Bradley Farias.
1. Démonstration
La structure du répertoire de code de cet exemple est la suivante :
esm-demo/ lib.mjs main.mjs
lib.mjs :
export function add(x, y) { return x + y; }
main.mjs :
import {add} from './lib.mjs'; console.log('Result: '+add(2, 3));
Exécutez la démo :
$ node --experimental-modules main.mjs Result: 5
2. Liste de contrôle : Choses à noter
Module ES :
·Vous ne pouvez pas importer de modules dynamiquement. Cependant, les travaux sur Dynamic import() sont en cours et un support devrait être bientôt disponible.
·Il n'y a pas de méta-variables telles que __dirname et __filename. Cependant, il existe une proposition pour une fonction similaire : "import.meta". Cela pourrait ressembler à ceci :
console.log(import.meta.url);
·Maintenant, tous les identifiants de module sont des URL (cette partie est nouvelle dans Node.js) :
· fichier - chemin relatif avec extension de fichier : ../util/tools.mjs
·Bibliothèque - pas de fichier extension et pas de chemin lodash
·Il reste à voir comment mieux rendre les bibliothèques npm également disponibles dans les navigateurs (sans utiliser de bundler) . Une possibilité consiste à introduire des données de configuration de style RequireJS qui mappent les chemins aux chemins réels. Actuellement, il est illégal d'utiliser des identifiants de module à chemin nu dans les navigateurs.
Interopérabilité avec les modules CJS
Vous pouvez importer des modules CJS, mais ils n'ont toujours que l'exportation par défaut, c'est-à-dire la valeur module.exports. La prise en charge des modules CJS par les exportations nommées est déjà en cours, mais cela peut prendre un certain temps. Si vous pouvez aider, vous pouvez le faire.
import fs1 from 'fs'; console.log(Object.keys(fs1).length); // 86 import * as fs2 from 'fs'; console.log(Object.keys(fs2)); // ['default']
· Vous ne pouvez pas utiliser require() dans les modules ES. Les principales raisons sont :
· La résolution de chemin fonctionne légèrement différemment : ESM ne prend pas en charge NODE_PATH et require.extensions. De plus, le fait que son identifiant soit toujours une URL entraîne quelques légères différences.
· Les modules ES sont toujours chargés de manière asynchrone, ce qui garantit une compatibilité maximale avec le Web. Ce style de chargement ne peut pas être mélangé avec le chargement synchrone des modules CJS via require().
· La désactivation du chargement synchrone des modules préserverait également un chemin de secours pour les importations en attente de niveau supérieur des modules ES (une fonctionnalité actuellement à l'étude).
3. Modules ES sur les versions antérieures de Node.js
Si vous souhaitez l'utiliser sur les versions de Node.js antérieures à la 8.5.0 Modules ES, voir @std/esm de John-David Dalton.
Astuce : Si vous n'activez aucune fonctionnalité supplémentaire déverrouillable, vous resterez 100 % compatible avec les modules ES natifs dans Node.js.
FAQ
Quand puis-je utiliser les modules ES sans options de ligne de commande ?
Le plan actuel est de rendre les modules ES disponibles par défaut dans Node.js 10 LTS.
Lectures complémentaires
Pour plus d'informations sur les modules Node.js et ES dans le navigateur :
· "Rendre les modules ES transpilés plus conformes aux spécifications" [en utilisant les modules ES de manière native plutôt que de les transpiler via Babel]
· "Spécificateurs de modules : quoi de neuf avec les modules ES ?" [Pourquoi .mjs ? Comment les spécificateurs de module sont-ils résolus ? Etc.]
· « Modules » [chapitre approfondi sur les modules ES dans « Explorer ES6 »]
Prochaine proposition ECMAScript :
· Blog : « Proposition ES : import() – importation dynamique de modules ES »
· Proposition : « import.meta »
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!