Що таке "експорт за замовчуванням" у JavaScript?


570

Файл: SafeString.js

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

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

export default SafeString;

Я ніколи export defaultраніше не бачив . Чи є якісь подібні речі для export defaultцього, що може бути простіше зрозуміти?


29
Це дуже чітке пояснення цього 24ways.org/2014/javascript-modules-the-es6-way
nish1013

2
exportдеталі ключових слів тут . Наразі його не підтримує жоден із веб-браузерів.
RBT

3
Зараз він підтримується у всіх браузерах, окрім IE.
Брайан Ді Пальма

1
Дуже гарна відповідь stackoverflow.com/a/36426988/5473170
Сурай Джайн

Ось, шукайте відповіді ^ вище; дивіться \ / нижче для плутанини. Я показав u da wai
Андрій

Відповіді:


456

Це частина модульної системи ES6, описана тут . У цій документації є корисний приклад:

Якщо модуль визначає експорт за замовчуванням:

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

то ви можете імпортувати цей експорт за замовчуванням, опустивши фігурні дужки:

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

Оновлення: Станом на червень 2015 року система модулів визначена у § 15.2, а exportсинтаксис, зокрема, визначений у § 15.2.3 специфікації ECMAScript 2015.


1
@GeenHenk Я вважаю, що цього можна очікувати, оскільки ES6 все ще є проектом. Я надав оновлене посилання та відмову від відповідальності.
pswg

7
Я не бачу, наскільки функція експорту за замовчуванням () {} відрізняється від експорту = функція () {} ....
Олександр Міллс

1
що стосується випадків, коли це схоже, export const Foo = () => {}і тоді в кінці файлу export default Fooя бачу це в купі прикладів реакції. Що з двома експортом?
FlavorScape

Було б непогано побачити приклад із експортом за замовчуванням та названим експортом. Іншими словами, такий експорт, який би задовольнивimport foo, { bar, baz } from './foo';
gumkins

1
Дякую за відповідь, але використання foo у другому прикладі є дещо неоднозначним; що таке foo і як ви назвали перший файл; як це можна зробити import foo from "foo"? Чи був об'єкт, який тримав foo, оскільки в першому прикладі експортовану функцію ви називаєте без назви. @pswg
nosahama

159

export default використовується для експорту одного класу, функції або примітиву з файлу сценарію.

Експорт також може бути записаний як

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

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

Це використовується для імпорту цієї функції в інший файл сценарію

Скажіть у app.js , ви можете

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

Трохи про експорт

Як випливає з назви, він використовується для експорту функцій, об'єктів, класів або виразів із файлів скриптів або модулів

Utiliites.js

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

Це можна імпортувати і використовувати як

App.js

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

Або

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

Коли використовується експорт за замовчуванням, це набагато простіше. Файли сценаріїв просто експортують одне. cube.js

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

і використовується як App.js

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

78

export default function(){}може використовуватися, коли функція не має імені. У файлі може бути лише один експорт за замовчуванням. Альтернативою є названий експорт.

На цій сторінці детально export defaultописані, а також інші подробиці про модулі, які мені здаються дуже корисними.


14
Якщо ви хочете, ви можете використовувати експорт за замовчуванням та ім'я разом.
Бергі

@Greg жуй сторінки застаріла. Він перенаправляє на exploringjs.com/es6/ch_modules.html
rajakvk

@rajakvk, правда, але в оригінальній сторінці є набагато більше довідкової інформації для тих, хто починає працювати.
Грег Гум

7
Ця відповідь краще, ніж прийнята, тому що вона пояснює, що defaultозначає, і для мене питання було про це слово.
Даріуш Сікорський

1
@DariuszSikorski прийнята відповідь пояснює, що defaultозначає, що експорт за замовчуванням можна імпортувати без використання дужок. Ця відповідь насправді досить неправильна, оскільки в ній ви можете використовувати лише defaultтоді, коли у файлі є лише один експорт, що зовсім не відповідає дійсності. Ви можете мати кілька експорту в одному файлі, але, звичайно, лише 1 з них можна встановити як defaultодин.
realUser404

40

Я пишу цей пост, тому що (я припускаю, що я втомився) я не зовсім зрозумів ані MDN, ані опис інших людей, а найкращий спосіб зрозуміти щось - навчити його іншим людям. Просто я не бачу простої відповіді на питання.

Що таке "експорт за замовчуванням" у JavaScript?

У експорті за замовчуванням назва імпорту абсолютно незалежна, і ми можемо використовувати будь-яке ім’я, яке нам подобається.

Проілюструю цей рядок простим прикладом.

Скажімо, у нас є 3 модулі та 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>

Вихід:

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!

Тож довше пояснення :

"експортувати за замовчуванням" використовується, якщо потрібно експортувати одну модуль для модуля.

Отже, що важливо - це "імпорт блабла з" ./modul3.js '"- ми могли б сказати замість цього:

"імпортувати pamelanderson з './modul3.js", а потім pamelanderson (); Це буде добре працювати, коли ми використовуємо "експортувати за замовчуванням", і в основному це все - це дозволяє нам називати це все, що нам подобається, коли це за замовчуванням .


Ps Якщо ви хочете перевірити приклад - спершу створіть файли, а потім увімкніть CORS у браузері -> якщо ви використовуєте тип firefox в URL-адресі браузера: about: config -> Пошук "privacy.file_unique_origin" -> змінити це "false" -> відкрити index.html -> натиснути F12, щоб відкрити консоль і побачити вихід -> Насолоджуйтесь і не забудьте повернути настройки заздалегідь за замовчуванням.

Ps2 Вибачте за нерозумні імена змінної

Більше інформації @ link2medium , link2mdn1 , link2mdn2


4
Це слід сприймати як найкращу відповідь, але я зробив все, що міг, використовуючи свою нагороду.
Jarmos

1
Дуже дякую!
Поєднайте

1
Це має бути прийнята відповідь піднятими руками
nosahama

16

Як пояснено на цій сторінці MDN

Є два різні типи експорту, іменовані та за замовчуванням. Ви можете мати кілька імпортованих експортів на модуль, але лише один експорт за замовчуванням [...] Іменований експорт корисний для експорту кількох значень. Під час імпорту обов'язково потрібно використовувати те саме ім'я відповідного об'єкта. Але експорт за замовчуванням можна імпортувати з будь-яким ім'ям

Наприклад:

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

На мою думку, важливим щодо експорту за замовчуванням є те, що його МОЖНО імпортувати з будь-яким ім'ям!

якщо є файл foo.js, який експортує за замовчуванням:

export default function foo(){}

його можна імпортувати в bar.js, використовуючи:

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


0

Є два різні типи експорту, іменовані та за замовчуванням . Ви можете мати кілька імпортованих експортів на модуль, але лише один експорт за замовчуванням. Кожному типу відповідає одне з перерахованих вище. Джерело: MDN

Названий експорт

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 default class DefaultExport1 { }

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

// ви можете використовувати інше ім'я для імпорту за замовчуванням

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

-3

експорт за замовчуванням використовується для експорту одного класу, функції або примітиву.

функція експорту за замовчуванням () {} може використовуватися, коли функція не має імені. У файлі може бути лише один експорт за замовчуванням.

читати більше

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.