Если нет, с одной стороны, я буду на борту писать все мои модули, например
import A from './a.js';
var B = function(){
//use A
};
export default B;
а затем используя компилятор для его создания в каком-либо браузере или в формате сервера.
Моя единственная проблема с вышеизложенным - это явная спецификация ./a.js
в import
.
Я понимаю, почему спецификация прошла этот путь 1 чтобы быть в состоянии статического анализа. Но есть две очень практические причины, по которым проблема с выпечкой как в модуле имя_файла, так и в его пути.
- Поскольку уже поднят здесь, при частом повторном использовании модулей из проекта в проект, скорее всего, вы не сможете поддерживать последовательный путь к этому ресурсу в дереве вашего проекта. Выпечка вызова импорта, такого как
import myModule from './../../vendor/lib/dist/mod.js'
, в код модуля, не совсем точно отражает будущее. -
Помимо самого пути, указание имя_файла также связывает вас. Что-то вроде этого кажется невинным:
import $ from 'vendor/jquery.js'
Но как насчет того дня, когда я хочу использовать Zepto вместо jQuery? Я нашел абстракцию, особенно вокруг библиотек поставщиков, очень полезную при работе с большими кодовыми базами, упрямыми разработчиками и постоянно меняющейся экосистемой JavaScript. Возможно, мне захочется импортировать React в качестве моей библиотеки компонентов сегодня, но как насчет завтра? Более того, что, если я собираюсь использовать тот же модуль как на клиенте, так и на сервере, но мне нужны разные версии зависимой библиотеки?
Я настаиваю на надежной (но четкой и последовательной) абстракции в моих командах. Часто время абстракция принимала форму своего рода пространств имен. Я немного фантазирую об этом:
//BAD: Bakes React into my component modules
import ComponentLib from './React.js';
//GOOD: Leaves me free to use any React-like library
import ComponentLib from 'vendor.lib.component';
Где vendor.lib.component
, по-подобному Java, ранее было зарегистрировано.
Обратите внимание, что в отличие от этого вопроса, моя цель - не иметь динамического контроля над моим импортом. Я не хочу гибкости во время выполнения, я бы хотел, чтобы гибкость во время сборки. Я должен уметь подчинять зависимую структуру для другой, или для макета, или для чего-то, что будет работать в конкретной среде, без необходимости беспокоиться о том, какие зависимости вызывают мои модули, или пытаться дублировать какой-то сумасшедший каталог дерево для каждого продукта сборки, за которым я работаю.
Подобные вопросы привели к предложению библиотеки, которая использует Системная спецификация, например SystemJS. Затем вы можете использовать что-то вроде jspm, чтобы ввести карту модулей для получения абстракции. Но в тот момент, когда я это делаю, я пишу все свои модули по-разному:
System.import('a', function(A){
//use 'A'
});
Это вдруг будущее? Если да, почему бы мне просто не использовать AMD? Зачем даже беспокоиться о модулях ES2015 и запусках transpilers, если я только вернусь к использованию асинхронного API-интерфейса загрузчика?
Больше просмотра роликов, я не вижу много упоминаний о применении стандарта API загрузчика модулей в спецификация ES2017.
(EDIT: вопрос пересмотрен для соответствия стандартам ответа, основанного на мнениях)
Учитывая все вышеизложенное, я спрашиваю сообщество - как написать модуль JavaScript, который (i) соблюдает стандарт ES2015, (ii) не ссылается на зависимый модуль по его имени файла или пути, и (iii) не полагается на обширные промежуточные инструменты/конфигурацию, которые сделают невозможным использование модуля с несколькими командами.
-
Примечание 1. Как отмечает @zeroflagL в комментариях, спецификация явно не указывает, что модуль должен быть указан как путь, просто строка (см. ModuleSpecifier - http://www.ecma-international.org/ecma-262/6.0/#table-41). Тем не менее, существует четкая инструкция для учета циклических ссылок, подразумевая какой-то статический анализ (http://www.ecma-international.org/ecma-262/6.0/#sec-imports), с файловыми путями, кажущимися являясь эталонным контекстом выбора к этому моменту. Поэтому мы не можем обвинять спецификацию в том, что она здесь жесткая, а наоборот. В то же время бремя может быть на всех остальных для разработки более надежных реализаций import
/ModuleSpecifier, которые приводят к вторичному стандарту.