С ES6 я могу импортировать несколько экспортов из файла, подобного этому:
import {ThingA, ThingB, ThingC} from 'lib/things';
Тем не менее, мне нравится организация одного модуля на файл. Я получаю импорт, как это:
import ThingA from 'lib/things/ThingA';
import ThingB from 'lib/things/ThingB';
import ThingC from 'lib/things/ThingC';
Я хотел бы быть в состоянии сделать это:
import {ThingA, ThingB, ThingC} from 'lib/things/*';
или что-то подобное, с понятным соглашением, что каждый файл содержит один экспорт по умолчанию, и каждый модуль называется так же, как его файл.
Это возможно?
javascript
ecmascript-6
es6-modules
Frambot
источник
источник
lib/math
это файл, содержащий несколько экспортов. В моем вопросеlib/math/
это каталог, содержащий несколько файлов, каждый из которых содержит один экспорт.Ответы:
Я не думаю, что это возможно, но на самом деле разрешение имен модулей зависит от загрузчиков модулей, так что может быть реализация загрузчика, которая поддерживает это.
До тех пор вы можете использовать промежуточный «файл модуля»,
lib/things/index.js
который просто содержити это позволит вам сделать
источник
index.js
похожим:import ThingA from 'things/ThingA'; export {ThingA as ThingA}; import ThingB from 'things/ThingB'; export {ThingB as ThingB};
. Другие заклинанияindex.js
не сдвинулись с места.export * from
должно работать. Вы пробовали…from './ThingA'
илиexport ThingA from …
? Какой модуль загрузчик вы используете?Просто вариация на тему уже указана в ответе, но как на счет этого:
В
Thing
,В
things/index.js
,Затем потреблять все вещи в другом месте,
Или потреблять только некоторые вещи,
источник
index.js
для меня. Я использую SystemJs + Babelexport ThingA from './ThingA'
вместоexport {default as ThingA} from './ThingA'
Текущие ответы предлагают обходной путь, но меня беспокоит, почему этого не существует, поэтому я создал
babel
плагин, который делает это.Установите его, используя:
затем добавьте его к себе
.babelrc
с помощью:см. репо для подробной информации об установке
Это позволяет вам сделать это:
Опять же, репозиторий содержит дополнительную информацию о том, что именно он делает, но, делая это таким образом, избегает создания
index.js
файлов, а также происходит во время компиляции, чтобы избежатьreaddir
s во время выполнения.Также с более новой версией вы можете сделать так же, как ваш пример:
работает так же, как и выше.
источник
./lib/things;
а он не был выбран. Проблемы, которые это вызывает, смешны. Я только что был свидетелем ситуации, когда изменение файла с помощьюimport *
babel заставляет забрать добавленный файл, но изменение его обратно возвращает проблему, как если бы она повторно использовала кэш до изменения. Используйте с осторожностью.~/.babel.json
который вызывает такое странное поведение. Кроме того, если вы используете как наблюдатель или горячий перегрузчик, вы должны сохранить новый файл, чтобы он был перекомпилирован с новым списком каталоговbpwc clear-cache
потому что webpack и другие процессы сборки будут все еще молча кэшироватьсяВеликие гугли магглы! Это было сложнее, чем нужно было.
Экспортировать одну квартиру по умолчанию
Это отличная возможность использовать распространение (
...
в{ ...Matters, ...Contacts }
ниже:Затем, чтобы запустить скомпилированный код babel из командной строки (из проекта root /):
Экспорт одного древовидного по умолчанию
Если вы не хотите перезаписывать свойства, измените:
И вывод будет:
Экспорт нескольких именованных экспортов без по умолчанию
Если вы посвящены DRY , синтаксис в импорте также меняется:
Это создает 2 именованных экспорта без экспорта по умолчанию. Затем измените:
И вывод:
Импортировать все именованные экспорты
Обратите внимание на разрушение
import { Matters, Contacts } from './collections';
в предыдущем примере.На практике
Учитывая эти исходные файлы:
Создание
/myLib/index.js
для объединения всех файлов побеждает цель импорта / экспорта. Во-первых, было бы проще сделать все глобальным, чем сделать все глобальным с помощью импорта / экспорта через index.js «файлы-оболочки».Если вы хотите определенный файл,
import thingA from './myLib/thingA';
в ваших собственных проектах.Создание «файла-обертки» с экспортом для модуля имеет смысл только в том случае, если вы собираете пакет для npm или для многолетнего многопользовательского проекта.
Сделал это так далеко? Смотрите документы для более подробной информации.
Кроме того, yay для Stackoverflow, наконец, поддерживает три в качестве разметки кода.
источник
Вы можете использовать асинхронный импорт ():
а потом:
источник
Аналогичен принятому вопросу, но позволяет масштабировать без необходимости добавления нового модуля в индексный файл каждый раз, когда вы его создаете:
./modules/moduleA.js
./modules/index.js
./example.js
источник
./example.js
Я использовал их несколько раз (в частности, для создания массивных объектов, разделяющих данные по многим файлам (например, узлы AST)), чтобы создать их, я создал крошечный скрипт (который я только что добавил в npm, чтобы все остальные можете использовать это).
Использование (в настоящее время вам нужно использовать babel для использования файла экспорта):
Создает файл, содержащий:
Тогда вы можете просто использовать файл:
источник
\` instead of
/) also as an improvment you may want to allow two options like
--filename` &&,--dest
чтобы разрешить настройку, где должен быть сохранен созданный файл и под каким именем. Также не работает с именами файлов, содержащими.
(какuser.model.js
)Просто другой подход к ответу @ Берги
Пользы
источник
export '...' was not found in '....
.Вы также можете использовать require:
Затем используйте свой moduleHolder с динамически загружаемыми контроллерами:
источник
Это не совсем то, что вы просили, но с помощью этого метода я могу выполнять итерации
componentsList
в других моих файлах и использовать такие функции,componentsList.map(...)
которые я считаю довольно полезными!источник
Если вы используете веб-пакет. Это импортирует файлы автоматически и экспортирует как API пространство имен .
Так что не нужно обновляться при каждом добавлении файла.
Для пользователей Typescript;
источник
Я смог взять у пользователя подход atilkan и немного его изменить:
Для пользователей Typescript;
источник
если вы не экспортируете значения по умолчанию в A, B, C, а просто экспортируете {}, то это можно сделать
источник
./thing
), и даже если бы он был, он не работал бы. (Я попробовал это, и это не сработало.)