Как импортировать все экспортированные из файла с помощью синтаксиса ES2015? Есть ли подстановочный знак?

С синтаксисом ES2015 у нас есть новый синтаксис импорта, и я пытался выяснить, как импортировать все, экспортированные из одного файла в другой, без его обертывания в объект, т.е. доступны, как если бы они были определены в одном файле.

Итак, по существу, это:

// constants.js

const MYAPP_BAR = 'bar'
const MYAPP_FOO = 'foo'
// reducers.js

import * from './constants'

console.log(MYAPP_FOO)

Это не работает, по крайней мере, согласно моей настройке Babel/Webpack, этот синтаксис недействителен.

Альтернативы

Это работает (но долго и раздражает, если вам нужно больше, чем несколько импортированных вещей):

// reducers.js

import { MYAPP_BAR, MYAPP_FOO } from './constants'

console.log(MYAPP_FOO)

Как и это (но он обертывает consts в объекте):

// reducers.js

import * as consts from './constants'

console.log(consts.MYAPP_FOO)

Есть ли синтаксис для первого варианта, или вам нужно либо импортировать каждую вещь по имени, либо использовать объект-оболочку?

Ответ 1

Есть ли синтаксис для первого варианта,

Нет.

или вам нужно либо импортировать каждую вещь по имени, либо использовать объект-оболочку?

Да.

Ответ 2

Вы не можете импортировать все переменные с помощью подстановочного знака для первого варианта, потому что он вызывает конфликтующие переменные, если у вас есть одно имя в разных файлах.

//a.js
export const MY_VAR = 1;

//b.js
export const MY_VAR = 2;


//index.js
import * from './a.js';
import * from './b.js';

console.log(MY_VAR); // which value should be there?

Поскольку здесь мы не можем разрешить фактическое значение MY_VAR, такой вид импорта невозможен.

В вашем случае, если у вас есть много значений для импорта, лучше экспортировать их как объект:

// reducers.js

import * as constants from './constants'

console.log(constants.MYAPP_FOO)

Ответ 3

ну, вы можете импортировать объект, перебрать его свойства, а затем вручную сгенерировать константы с eval, как это

import constants from './constants.js'

for (const c in constants) {
  eval('const ${c} = ${constants[c]}')
}

к сожалению, это решение не работает с intellisense в моей IDE, поскольку константы генерируются динамически во время выполнения. Но это должно работать в целом.

Ответ 4

Конечно, есть.

Просто используйте codegen.macro

codegen
      'const { ' + Object.keys(require('./path/to/file')).join(',') + '} = require("./path/to/file");

Но кажется, что вы не можете импортировать переменную, сгенерированную codegen. https://github.com/kentcdodds/babel-plugin-codegen/issues/10