Qu'est-ce que «exporter par défaut» en javascript?


570

Fichier: SafeString.js

// Build out our basic SafeString type
function SafeString(string) {
  this.string = string;
}

SafeString.prototype.toString = function() {
  return "" + this.string;
};

export default SafeString;

Je n'en ai jamais vu export defaultauparavant. Existe-t-il des éléments équivalents export defaultqui peuvent être plus faciles à comprendre?


29
Ceci est une explication très claire sur ce 24ways.org/2014/javascript-modules-the-es6-way
nish1013

2
exportdétails des mots clés ici . À l' heure actuelle , il est pas supporté nativement par l' un des navigateurs web.
RBT

3
Il est désormais pris en charge dans tous les navigateurs, sauf IE.
Brian Di Palma


Voici, regardez ^ ci-dessus pour les réponses; regardez \ / ci-dessous pour la confusion. J'ai montré u da wai
Andrew

Réponses:


456

Il fait partie du système de modules ES6, décrit ici . Il existe un exemple utile dans cette documentation, également:

Si un module définit une exportation par défaut:

export default function() { console.log("hello!") }

alors vous pouvez importer cette exportation par défaut en omettant les accolades:

import foo from "foo";
foo(); // hello!

Mise à jour: Depuis juin 2015, le système de modules est défini au §15.2 et la exportsyntaxe en particulier est définie au §15.2.3 de la spécification ECMAScript 2015.


1
@GeenHenk Je suppose que c'est normal car ES6 est encore un brouillon. J'ai fourni un lien mis à jour et un avertissement.
pswg

7
Je ne vois pas en quoi la fonction par défaut d'exportation () {} est différente de la fonction d' exportation = fonction () {} ....
Alexander Mills

1
Qu'en est-il des cas où c'est comme export const Foo = () => {}, puis à la fin du fichier, export default Fooje vois cela dans un tas d'exemples de réaction. Quels sont les deux exportations?
FlavorScape

Ce serait bien de voir un exemple avec des exportations par défaut et nommées. En d'autres termes, une telle exportation qui satisferaitimport foo, { bar, baz } from './foo';
gumkins

1
Merci d'avoir répondu, mais l'utilisation de foo dans le deuxième exemple est un peu ambiguë; qu'est-ce que foo et comment avez-vous nommé le premier fichier; comment pouvez-vous faire import foo from "foo"? Y avait-il un objet qui contenait foo, puisque dans le premier exemple votre fonction exportée est sans nom. @pswg
nosahama

159

export default est utilisé pour exporter une seule classe, fonction ou primitive à partir d'un fichier de script.

L'export peut également s'écrire

export default function SafeString(string) {
  this.string = string;
}

SafeString.prototype.toString = function() {
  return "" + this.string;
};

Ceci est utilisé pour importer cette fonction dans un autre fichier de script

Dites dans app.js , vous pouvez

import SafeString from './handlebars/safe-string';

Un peu d'exportation

Comme son nom l'indique, il est utilisé pour exporter des fonctions, des objets, des classes ou des expressions à partir de fichiers ou de modules de script

Utiliites.js

export function cube(x) {
  return x * x * x;
}
export const foo = Math.PI + Math.SQRT2;

Cela peut être importé et utilisé comme

App.js

import { cube, foo } from 'Utilities';
console.log(cube(3)); // 27
console.log(foo);    // 4.555806215962888

Ou

import * as utilities from 'Utilities';
console.log(utilities.cube(3)); // 27
console.log(utilities.foo);    // 4.555806215962888

Lorsque l'exportation par défaut est utilisée, c'est beaucoup plus simple. Les fichiers de script exportent juste une chose. cube.js

export default function cube(x) {
  return x * x * x;
};

et utilisé comme App.js

import Cube from 'cube';
console.log(Cube(3)); // 27

78

export default function(){}peut être utilisé lorsque la fonction n'a pas de nom. Il ne peut y avoir qu'une seule exportation par défaut dans un fichier. L'alternative est une exportation nommée.

Cette page décrit export defaulten détail ainsi que d'autres détails sur les modules que j'ai trouvés très utiles.


14
Vous pouvez utiliser les exportations par défaut et nommées ensemble si vous le souhaitez.
Bergi

@Greg gum la page est obsolète. Il réoriente à exploringjs.com/es6/ch_modules.html
rajakvk

@rajakvk, c'est vrai, mais la page d'origine contient beaucoup plus d'informations de base pour ceux qui commencent.
Greg Gum

7
Cette réponse est meilleure que celle acceptée car elle explique ce que defaultsignifie et pour moi la question portait sur ce mot.
Dariusz Sikorski

1
@DariuszSikorski, la réponse acceptée explique ce que cela defaultsignifie, étant que l'exportation par défaut peut être importée sans utiliser d'accolades. Cette réponse est en fait assez fausse car elle dit que vous ne pouvez utiliser que defaultlorsqu'il n'y a qu'une seule exportation dans un fichier, ce qui n'est pas vrai du tout. Vous pouvez avoir plusieurs exportations dans le même fichier, mais bien sûr, une seule d'entre elles peut être définie comme celle- defaultlà.
realUser404

43

J'écris ce post parce que (je suppose que je suis fatigué) je n'ai pas tout à fait compris ni le MDN, ni la description d'autres personnes et la meilleure façon de comprendre quelque chose est de l'enseigner à d'autres personnes. C'est juste que je ne vois pas de réponse simple à la question.

Qu'est-ce que «exporter par défaut» en javascript?

Dans l'exportation par défaut, le nom de l'importation est complètement indépendant et nous pouvons utiliser n'importe quel nom que nous aimons.

Je vais illustrer cette ligne avec un exemple simple.

Disons que nous avons 3 modules et un index.html:

  • modul.js
  • modul2.js
  • modul3.js
  • index.html

modul.js

export function hello() {
    console.log("Modul: Saying hello!");
}

export let variable = 123;

modul2.js

export function hello2() {
    console.log("Module2: Saying hello for the second time!");
}

export let variable2 = 456;

modul3.js

export default function hello3() {
    console.log("Module3: Saying hello for the third time!");
}

index.html

<script type="module">
import * as mod from './modul.js';
import {hello2, variable2} from './modul2.js';
import blabla from './modul3.js'; //! Here is the important stuff - we name the variable for the module as we like

mod.hello();
console.log("Module: " + mod.variable);

hello2();
console.log("Module2: " + variable2);

blabla();
</script>

La sortie est:

modul.js:2:10   -> Modul: Saying hello! 
index.html:7:9  -> Module: 123 
modul2.js:2:10  -> Module2: Saying hello for the second time! 
index.html:10:9 -> Module2: 456 
modul3.js:2:10  -> Module3: Saying hello for the third time!

Donc l'explication la plus longue est :

'export default' est utilisé si vous souhaitez exporter une seule chose pour un module.

Donc, ce qui est important, c'est "importer du blabla depuis './modul3.js'" - on pourrait dire à la place:

"importer pamelanderson depuis './modul3.js" puis pamelanderson (); Cela fonctionnera très bien lorsque nous utiliserons «export par défaut» et, en gros, c'est tout - cela nous permet de le nommer comme nous le souhaitons lorsqu'il est par défaut .


Ps Si vous voulez tester l'exemple - créez d'abord les fichiers, puis autorisez CORS dans le navigateur -> si vous utilisez le type firefox dans l'url du navigateur: about: config -> Recherchez "privacy.file_unique_origin" -> changez à "faux" -> ouvrez index.html -> appuyez sur F12 pour ouvrir la console et voir la sortie -> Profitez et n'oubliez pas de rétablir les paramètres cors par défaut.

Ps2 Désolé pour le nom idiot des variables

Plus d'infos @ link2medium , link2mdn1 , link2mdn2


4
Cela devrait être accepté comme la meilleure réponse, mais j'ai fait ce que j'ai pu en utilisant mon vote positif.
Jarmos

1
Merci beaucoup!
Combinez

1
Cela devrait être la réponse acceptée mains
levées

16

Comme expliqué sur cette page MDN

Il existe deux types d'exportation différents, nommés et par défaut. Vous pouvez avoir plusieurs exportations nommées par module, mais une seule exportation par défaut [...] Les exportations nommées sont utiles pour exporter plusieurs valeurs. Pendant l'importation, il est obligatoire d'utiliser le même nom de l'objet correspondant, mais une exportation par défaut peut être importée avec n'importe quel nom

Par exemple:

let myVar; export default myVar = 123; // in file my-module.js

import myExportedVar from './my-module' //  we have the freedom to use 'import myExportedVar' instead of 'import myVar' because myVar was defined as default export

console.log(myExportedVar);        // will log 123

6

À mon avis, l' important à propos de l'exportation par défaut est qu'elle peut être importée avec n'importe quel nom!

s'il existe un fichier foo.js qui exporte par défaut:

export default function foo(){}

il peut être importé dans bar.js en utilisant:

import bar from 'foo'
import Bar from 'foo' //or ANY other name you wish to assign to this import


1

Il existe deux types d'exportation différents, nommés et par défaut . Vous pouvez avoir plusieurs exportations nommées par module, mais une seule exportation par défaut. Chaque type correspond à l'un des précédents. Source: MDN

Exportation nommée

export class NamedExport1 { }

export class NamedExport2 { }

// import class
import { NamedExport1 } from 'path-to-file'
import { NamedExport2 } from 'path-to-file'

// OR you can import all at once
import * as namedExports from 'path-to-file'

Export par défaut

export default class DefaultExport1 { }

// import class
import DefaultExport1 from 'path-to-file' // no curly braces {}

// vous pouvez utiliser un nom différent pour l'importation par défaut

import Foo from 'path-to-file' // this will assign any default export to Foo.

-3

export default est utilisé pour exporter une seule classe, fonction ou primitive.

La fonction d' exportation par défaut () {} peut être utilisée lorsque la fonction n'a pas de nom. Il ne peut y avoir qu'une seule exportation par défaut dans un fichier.

Lire la suite

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.