J'ai travaillé sur tutoriel Webpack . Dans l'une des sections, il donne l'exemple de code qui contient une ligne essentielle à cette question:
export default class Button { /* class code here */ }
Dans la section suivante dudit didacticiel, intitulée "Code splitting", la classe définie ci-dessus est chargée à la demande, comme ceci:
require.ensure([], () => {
const Button = require("./Components/Button");
const button = new Button("google.com");
// ...
});
Malheureusement, ce code lève une exception:
Uncaught TypeError: Button is not a function
Maintenant, je sais que la manière à droite d'inclure le module ES6 serait de simplement import Button from './Components/Button';
En haut du fichier, mais en utilisant une construction comme celle-ci n'importe où ailleurs dans le fichier, cela fait babel un panda triste:
SyntaxError: index.js: 'import' and 'export' may only appear at the top level
Après quelques manipulations avec l'exemple précédent (require.ensure()
) ci-dessus, je me suis rendu compte que la syntaxe ES6 export default
Exporte un objet qui a une propriété nommée default
, qui contient mon code (le Button
fonction).
J'ai corrigé l'exemple de code cassé en ajoutant .default
Après un appel requis, comme ceci:
const Button = require("./Components/Button").default;
... mais je pense que cela semble un peu maladroit et il est sujet aux erreurs (il faudrait que je sache quel module utilise la syntaxe ES6 et lequel utilise le bon vieux module.exports
).
Ce qui m'amène à ma question: quelle est la bonne façon d'importer du code ES6 à partir de code qui utilise la syntaxe CommonJS?
Pour utiliser export default
Avec Babel, vous pouvez effectuer 1 des opérations suivantes:
require("myStuff").default
npm install babel-plugin-add-module-exports --save-dev
Ou 3:
//myStuff.js
var thingToExport = {};
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = thingToExport;