Le problème est avec
- comment les modules ES6 sont émulés dans CommonJS
- comment importer le module
ES6 à CommonJS
Au moment d'écrire ces lignes, aucun environnement ne prend en charge les modules ES6 de manière native. Lorsque vous les utilisez dans Node.js, vous devez utiliser quelque chose comme Babel pour convertir les modules en CommonJS. Mais comment cela se produit-il exactement?
Beaucoup de gens considèrent module.exports = ...
comme équivalents export default ...
et exports.foo ...
équivalents à export const foo = ...
. Ce n'est pas tout à fait vrai cependant, ou du moins pas comment Babel le fait.
Les default
exportations ES6 sont en fait également nommées exportations, sauf qu'il default
s'agit d'un nom "réservé" et qu'il est pris en charge par une syntaxe spéciale. Voyons comment Babel compile les exportations nommées et par défaut:
// input
export const foo = 42;
export default 21;
// output
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var foo = exports.foo = 42;
exports.default = 21;
Ici, nous pouvons voir que l'exportation par défaut devient une propriété sur l' exports
objet, tout comme foo
.
Importez le module
Nous pouvons importer le module de deux manières: soit en utilisant CommonJS, soit en utilisant la import
syntaxe ES6 .
Votre problème: je crois que vous faites quelque chose comme:
var bar = require('./input');
new bar();
en attendant qu'on bar
lui attribue la valeur de l'exportation par défaut. Mais comme nous pouvons le voir dans l'exemple ci-dessus, l'exportation par défaut est affectée à la default
propriété!
Donc, pour accéder à l'exportation par défaut, nous devons réellement faire
var bar = require('./input').default;
Si nous utilisons la syntaxe du module ES6, à savoir
import bar from './input';
console.log(bar);
Babel le transformera en
'use strict';
var _input = require('./input');
var _input2 = _interopRequireDefault(_input);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
console.log(_input2.default);
Vous pouvez voir que chaque accès à bar
est converti en accès .default
.
module.exports
,exports
etmodule.exports
avoir des valeurs différentes, l'affectation àexports.defaults
n'a donc aucun effet (carmodule.exports
c'est ce qui est exporté). En d'autres termes, c'est exactement la même chose que si vous l'aviez faitmodule.exports = { ... }
.Vous devez configurer correctement babel dans votre projet pour utiliser l'exportation par défaut et l'exportation const foo
puis ajoutez ci-dessous la configration dans .babelrc
la source
Felix Kling a fait une grande comparaison sur ces deux, pour tous ceux qui se demandent comment faire une exportation par défaut aux côtés des exportations nommées avec module.exports dans nodejs
la source
tl; dr en ce moment pour que cela fonctionne, le fichier requis ou importé
SlimShady
doit être compilé avec Babel avec'use strict'
.J'utilise
babel-cli
6.18.0 dans le projet où j'ai rencontré initialement cette erreur.Sans les
'use strict'
mauvaises nouvelles«utiliser strictement», s'il vous plaît
la source
import
déclarations est un module, et celles-ci sont déjà strictes. La différence réelle concerne l'exigence par rapport à l'importation.import
place derequire
etexport default
au lieu deexports.default
.