Quand utiliser "import * as Foo" par rapport à "import Foo"?

Je convertis un projet BackboneJS (v1.2.2) vers ES6 avec BabelJS.

J'ai noté qu'il y a une différence entre:

import Backbone from 'backbone' 

et

 import * as Backbone from 'backbone' 

Après avoir lu ici, je comprends que le premier importe l'exportation par défaut de Backbone, car ce dernier me permet d'importer le module entier et de se référer à ses exportations nommées via la notation de propriété.

Je suis en difficulté pour comprendre la différence entre ceux-ci. Les objets sont retournés dans les deux cas, mais le premier semble être décoré avec des propriétés / méthodes supplémentaires. À tout le moins, je suppose que l'importation de «l'ensemble du module» aurait plus de propriétés / méthodes … mais je vois le contraire.

Un module peut exporter une seule "exportation par défaut" et / ou une ou plusieurs exportations nommées.

L'importation avec la première syntaxe dans votre question n'importait que l'exportation par défaut et définit un identifiant nommé (Backbone dans votre échantillon) vers cet objet.

La deuxième syntaxe est connue sous le nom d'importation d'espace de noms, et elle importe le module entier sous un seul objet "espace de noms".

Par exemple:

Export.js

 let b = {b: 2}; export default {a: 1}; // <- this is the ONLY default export export {b}; export let c = {c: 3}; 

Import.js

 import SomeName from 'export'; // 'SomeName' is now the {a: 1} instance. import {b} from 'export'; // 'b' is now the {b: 2} instance. import * as ns from 'export'; /* 'ns' now has properties 'default', 'b' & 'c', representing {a: 1}, {b: 2} & {c: 3} respectively */ 

Cela dépend de l'interface du module et de la façon dont vous souhaitez l'utiliser. Dans le cas du paquet npm de Backbone, il n'y a pas vraiment d'exportation par défaut, donc les deux versions devraient être approximativement équivalentes lorsqu'elles sont transfilées par Babel.

À tout le moins, je suppose que l'importation de «l'ensemble du module» aurait plus de propriétés / méthodes

Cela dépend de l'exportation par défaut et de ce que l'on appelle les exportations. Voici un exemple d'où ce ne serait pas le cas:

exporter.js

 export default { one: "One", two: "Two", three: "Three", }; export var a; 

importer.js

 // Has 3 props ['one', 'two', 'three'] import defaultExport from 'exporter'; // Has 2 props ['default', 'a']. import * as allExports from 'exporter';