2016-09-02 10 views
3

Я думаю, что я прошу, не возможно OOB, но я хочу подтвердить.Могу ли я экспортировать объект с помощью `export` как` `module.export`?

Мы находимся в процессе обновления до ES6 (используя Babel). Проект - это веб-сайт с использованием AMD (requirejs). Я хотел бы включить служебный модуль (foolib) в ES6, но потребляю его от либо ES6 (используя import), либо существующий модуль ES5/AMD.

// foolib.es6 
export { // as expected, this doesn't work 
    method1: function() { ... }, 
    value1: 123.456 
}; 

// consumer1.es6 
import foolib from "foolib"; 

// consumer2.js 
define(["foolib"], function (foolib) {}); 

Я понимаю, что решение изменить foolib.es6 следующим образом:

export function method1() { ... }; 
export let value1 = 123.456; 

Однако в действительности количество возвращаемых записей из foolib смешно. Поэтому я надеялся, что есть способ экспортировать существующий литерал объекта без перезаписи каждой строки.

Кроме того, я понимаю, что это, скорее всего, невозможно, из-за различия между импортом AMD (с использованием define) и import механизма (позже работает с exports объектом, который имеет значение висит от него, в том числе default стоимости, в то время как бывшие предпологает одно значение, которое нужно вернуть).

Одно из возможных решений, которые я думаю, мог бы работать, чтобы экспортировать свой объект как default из foolib.es6, а затем настроить requirejs загрузчик по умолчанию для проверки импортируемого значение для будучи esModule и вернуть значение по умолчанию: value && value.__esModule && value.default || value. Должно ли это работать? (Я все еще надеюсь, что есть более легкое решение).

+3

'export default {method1: function() {}, ...}' и ['babel-plugin-add-module-exports'] (https://www.npmjs.com/package/babel-plugin -add-module-exports) – sdgluck

+1

@sdgluck: да, это так. Работает с обоими потребителями. Сделайте ответ, пожалуйста. Пожалуйста, включите getcha, что этот плагин _must_ будет включен _before_ any -modules- плагин ('transform-es2015-modules-amd' в моем случае). –

ответ

4

Синтаксис, используемый для экспорта объекта, недействителен, потому что вы не даете объекту имя, поэтому он не может быть именованным экспортом, и вы не указываете, что это экспорт по умолчанию, поэтому он не может быть экспорт по умолчанию. Измените его, чтобы быть экспорт по умолчанию:

// foolib.es6 
export default { 
    method1: function() {}, 
    value1: 123.456 
} 
// consumer.es6 
import foolib from "foolib"; 

console.log(foolib.value) //=> 123.456 

Вы можете использовать babel-plugin-add-module-exports Babel плагин восстановить экспорт по умолчанию в качестве значения module.exports в узле земли.

И как вы обнаружили, убедитесь, что вы включили этот плагин перед любыми другими плагинами -modules-, например transform-es2015-modules-amd.

1

Возможно, это может быть поздно, но в качестве альтернативы вы также можете использовать named export, который немного отличается от подхода default, упомянутого в @sdgluck.

const method1 = function() {}; 
const value1 = 123.456; 

export { method1, value1 }; 

Мне нравится этот подход, потому что вы можете import их непосредственно как

import { method1, value1 } from 'foolib'; 

, не достигнув к переменной default.

 Смежные вопросы

  • Нет связанных вопросов^_^