Jak wyeksportować importowany obiekt w ES6?


244

Przypadek użycia jest prosty: chcę tylko wyeksportować obiekt o nazwie dokładnie tak, jak został zaimportowany.

na przykład:

import React from 'react';
export React;

ale to nie działa. Muszę pisać:

import React from 'react';
export const React = React;

Ale to dziwne. Jak to zrobić?

AKTUALIZACJA :

Dzięki za pomoc i referencje. Rozwiązałem swój problem wieloma wskazówkami. Chciałbym podzielić się kilkoma typowymi przypadkami dla mnie i rozwiązań.

import eksportowy

import d, {obj} from '...';

export {obj, d};
export {obj as name1, d as name2};

ponownie wyeksportuj wszystkie wymienione importy

export * from '...';
export * as name1 from '...';

ponownie wyeksportuj niektóre nazwane importy

export {a, b as name1} from '...';

ponownie eksportuj domyślny import jako domyślny eksport

export {default} from '...';

przywróć domyślny import jako eksport nazwany

export {default as name1} from '...';

dlaczego miałbyś eksportować?
omarjmh

możesz, export {React}ale znowu, jeśli potrzebujesz gdzieś React, powinieneś go tam zaimportować.
loganfsmyth

2
eksport reaguj to tylko przykład, w rzeczywistości chcę zorganizować jakiś projekt, aby użytkownik mógł zaimportować jakiś obiekt w ścieżce krótszej i wyższej.
Yao Zhao

Dziękuję bardzo za tę aktualizację. Rozwiązało to każdy problem, który miałem z ES6 / 7. Sugeruję, aby dodać to jako odpowiedź i zaakceptować.
Florian Wendelborn,

12
export * as name1 from '...';to nie działa dla mnie (przy użyciu webpack 2). Jakieś pomysły?
Entity Black

Odpowiedzi:


131

Często robię następujące rzeczy w plikach index.js, które składają się z kilku plików:

export {default as SomeClass} from './SomeClass';
export {someFunction} from './utils';
export {default as React} from 'react';

Ten wpis na blogu zawiera kilka fajnych dodatkowych przykładów.

Ważna uwaga

Należy mieć na uwadze tę zasadę eslint podczas uzyskiwania dostępu do tych eksportowanych importów. Zasadniczo w innym pliku nie powinieneś:

import SomeClassModule from 'SomeClass/index.js';
SomeClassModule.someFunction(); // Oops, error

Powinieneś to zrobić:

import SomeClassModule, {someFunction} from 'SomeClass/index.js';
someFunction(); // Ok

36

Możesz wyeksportować zaimportowany plik o takiej strukturze

import First from './First'
import Second from './Second'
/..../
export { First, Second }

2

W moim przypadku użycia wyraźnie potrzebuję jakiegoś jawnego polecenia importu, aby Babel mógł przetransportować mój kod es7 na es5.

Następujące wyniki powodują błąd You gave us a visitor for the node type "ForAwaitStatement" but it's not a valid type:

require( 'babel-core/register' ); //transpiles es7 to es5
export {default} from './module_name'

Moim rozwiązaniem było jawne zaimportowanie modułu za pomocą require():

require( 'babel-core/register' );
export default require( './module_name' ).default;

-1

Biorąc pod uwagę ./foo.js:

const Foo = class {
  talk() { return 'hello'; }
};

export default Foo;

Powinieneś być w stanie to zrobić:

import Foo from './foo';

let foo = new Foo();

foo.talk(); // => 'hello';

Składnia mniej więcej jest zgodna z wzorcem modułu module.exports, w którym można to zrobić:

const Foo = class {

};

module.exports = Foo;

Więcej tutaj:

http://exploringjs.com/es6/ch_modules.html


To nie do końca było pytanie?
Dan Dascalescu

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.