Именованный экспорт и экспорт объекта

Почему это работает:

const str = 'stuff';
export {
  str
};

Но не это:

export default {
  str: 'stuff'
};

Я хотел бы импортировать его как следующее:

import { str } from 'myLib';

Я хотел бы присвоить значение непосредственно в экспорте и не требовать создания переменной перед началом работы.

Также, когда я пытаюсь:

export {
  str: 'stuff'
};

Я получаю сообщение об ошибке:

SyntaxError: /home/karlm/dev/project/ex.js: Unexpected token, expected , (41:5)
  39 | 
  40 | export {
> 41 |   str: 'stuff'
     |      ^
  42 | };
  43 | 

Ответ 1

В ES6 есть два стиля экспорта: "обычный" экспорт и экспорт по умолчанию. Обычный экспорт экспортируется с синтаксисом следующим образом:

export const str = 'stuff';
// or
const str = 'stuff';
export {str};

Экспорт по умолчанию выглядит следующим образом:

export default const str = 'stuff';
// or 
export default {
  str: 'stuff'
};

Разница возникает при импорте. В первую очередь вам нужно включить фигурные скобки:

import {str} from 'myModule'; // 'stuff', from the first example

Без фигурных скобок он импортирует экспорт по умолчанию:

import myModule from 'myModule'; //  {str: 'stuff'}, from the second example

Ответ 2

Основная причина инструкции экспорта используется для экспорта функций, объектов или примитивов из заданного файла (или модуля).

Но вам нужен идентификатор для экспорта (чтобы его можно было импортировать через import в другой script).

Вы можете просто сделать:

export const obj = {
  str: 'stuff'
};

Во время import вы сможете использовать одно и то же имя obj для ссылки на соответствующее значение.

И импортируйте его как:

import { obj } from 'myLib';