วิธีการส่งออกวัตถุที่นำเข้าใน ES6


244

กรณีใช้งานง่าย: ฉันแค่ต้องการส่งออกวัตถุที่มีชื่อเหมือนที่นำเข้ามา

ตัวอย่างเช่น:

import React from 'react';
export React;

แต่มันไม่ทำงาน ฉันต้องเขียน:

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

แต่นี่มันแปลก วิธีที่ถูกต้องในการทำเช่นนี้คืออะไร?

อัปเดต :

ขอบคุณสำหรับความช่วยเหลือและการอ้างอิง ฉันได้แก้ปัญหาของฉันด้วยเบาะแสมากมาย ฉันต้องการแบ่งปันกรณีทั่วไปให้ฉันและวิธีแก้ปัญหา

การนำเข้าส่งออก

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

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

ส่งออกการนำเข้าที่มีชื่อทั้งหมดอีกครั้ง

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

ส่งออกการนำเข้าที่มีชื่อบางส่วนอีกครั้ง

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

ส่งออกการนำเข้าเริ่มต้นอีกครั้งเป็นการส่งออกเริ่มต้น

export {default} from '...';

ส่งออกการนำเข้าเริ่มต้นใหม่เป็นชื่อส่งออก

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

ทำไมคุณถึงส่งออกปฏิกิริยา
omarjmh

คุณสามารถทำได้export {React}อีกครั้งหากคุณต้องการทำปฏิกิริยาที่อื่นคุณควรนำเข้าที่นั่น
loganfsmyth

2
ปฏิกิริยาการส่งออกเป็นเพียงตัวอย่างในความเป็นจริงฉันต้องการจัดระเบียบบางโครงการเพื่อให้ผู้ใช้สามารถนำเข้าวัตถุบางอย่างในเส้นทางระดับสั้นและสูง
Yao Zhao

ขอบคุณมากสำหรับการอัพเดทครั้งนี้ มันแก้ไขปัญหาทุกอย่างที่ฉันมีกับ ES6 / 7 ฉันแนะนำให้คุณเพิ่มสิ่งนี้เป็นคำตอบและยอมรับมัน
Florian Wendelborn

12
export * as name1 from '...';สิ่งนี้ใช้ไม่ได้สำหรับฉัน (ใช้ webpack 2) ความคิดใด ๆ
Entity Black

คำตอบ:


131

ฉันมักจะทำต่อไปนี้ในไฟล์ index.js ที่ประกอบด้วยหลายไฟล์:

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

รายการบล็อกนี้มีตัวอย่างเพิ่มเติมที่ดี

โน๊ตสำคัญ

คุณควรทราบกฎ eslintนี้เมื่อเข้าถึงการนำเข้าที่ส่งออกเหล่านี้ โดยพื้นฐานแล้วในไฟล์อื่นคุณไม่ควร:

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

คุณควรทำสิ่งนี้:

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

36

คุณสามารถส่งออกไฟล์ที่นำเข้าด้วยโครงสร้างดังกล่าว

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

2

สำหรับกรณีการใช้งานของฉันฉันต้องมีคำสั่งนำเข้าอย่างชัดเจนเพื่อที่ Babel สามารถ transpile รหัส es7 ของฉันเป็น es5

ผลลัพธ์ต่อไปนี้มีข้อผิดพลาด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'

โซลูชันของฉันคือนำเข้าโมดูลอย่างชัดเจนโดยใช้require():

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

-1

ให้./foo.js:

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

export default Foo;

จากนั้นคุณควรจะสามารถทำสิ่งนี้:

import Foo from './foo';

let foo = new Foo();

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

ไวยากรณ์มากขึ้นหรือน้อยลงตามรูปแบบ commonjs module.exports ซึ่งคุณจะทำสิ่งนี้:

const Foo = class {

};

module.exports = Foo;

เพิ่มเติมที่นี่:

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


นั่นไม่ใช่คำถามที่เกี่ยวกับใช่ไหม
Dan Dascalescu

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.