Bower init - разность между amd, es6, globals и node
Я создаю свой первый компонент Bower. После запуска bower init
script спрашивает меня: "Какие типы модулей выставляют этот пакет?" с этими параметрами:
В чем разница между этими параметрами?
Ответы
Ответ 1
Если вы не знаете, скорее всего, глобальный выбор - правильный ответ для вас.
В любом случае вам нужно понять:
[ОБНОВЛЕНИЕ]
Эта функция была введена совсем недавно в беседке и еще не задокументирована (AFAIK). Он по существу описывает moduleType
, в котором указывается, для какой модульной технологии предполагается, что пакет предназначен для потребления (см. Выше).
В настоящий момент это не имеет никакого эффекта, кроме установки свойства moduleType
в файле bower.json
пакета.
См. https://github.com/bower/bower/pull/934 для исходного запроса на pull.
[ОБНОВЛЕНИЕ # 2]
Несколько дополнительных вопросов, чтобы ответить на комментарии:
- сейчас AFAIK не проверяет свойство
moduleType
- это означает, что людям технически разрешено использовать любое значение, которое они хотят для него, включая angularjs
, если они склонны это делать
- комитет bower, похоже, не стремится к включению дополнительного
non-interoperable/proprietary moduleTypes
(think composer, angular и т.д.) - это легко понять, но опять же, ничто не мешает людям использовать значение moduleType
, которое они хотят.
- Исключением из предыдущего является (несколько) недавнее включение
yui moduleType
, поэтому есть "исключения", которые предполагается сделать, если они являются частью согласованного плана
Что бы я сделал, если бы я был автором пакета для не-указанного менеджера пакетов и опубликовал его на bower?
Я бы написал модуль es6 и использовал /patch es6-transpiler для вывода нужного формата пакета. Тогда я бы либо/и:
- попросите ребят-бавеев включить мою технологию упаковки в качестве выбора (основанный на том, что она поддерживается es6-транспилером в качестве цели).
- опубликуйте мой пакет, включающий в себя как версию модуля es6, так и переписанную версию XXX, и используйте
es6
как moduleType
Отказ от ответственности: у меня нет реального опыта разработки угловых модулей.
Ответ 2
Начальные
Я использую bower init
для первого раза.
Параметры должны ссылаться на различные способы модуляции кода JavaScript:
- amd: используя AMD
define
, например requirejs.
- node: используя Node.js
require
.
- globals: использование шаблона модуля JavaScript для отображения глобальной переменной (например, window.JQuery).
- es6: использование предстоящей функции модуля EcmaScript6.
В моем случае я написал модуль Node.js dflow, но я пользуюсь браузером для создания файла dist/dflow.js, который экспортирует глобальный dflow var: поэтому я выбрал globals.
Другие обновления
Команда, которую я использовал для браузера dflow, поскольку глобальный объект окна был
browserify -s dflow -e index.js -o dist/dflow.js
Я изменил его, потому что предпочитаю использовать require также внутри браузера, поэтому теперь я использую
browserify -r ./index.js:dflow -o dist/dflow.js
и поэтому я изменил значение bower.moduleType на node в файле bower.json.
Основная мотивация заключалась в том, что если мое имя модуля имеет тире, например, мой проект flow-view, Мне нужно преобразовать глобальное имя в flowView.
Этот новый подход имеет два других преимущества:
- Node и интерфейс браузера совпадают. Используя требование как на стороне клиента, так и на стороне сервера, позвольте мне написать только один раз примеры кода и легко использовать их в обоих контекстах.
- Я использую скрипты npm, поэтому я могу использовать переменную
${npm_package_name}
и писать после script, который я использую для прокрутки.
Это еще одна тема, но, действительно, стоит подумать о том, насколько полезно последнее преимущество: позвольте мне поделиться атрибутом npm.scripts.browserify
, который я использую в моем package.json
"browserify": "browserify -r ./index.js:${npm_package_name} -o dist/${npm_package_name}.js"
Ответ 3
Просто для справки, это именно то, что bower указывает на типы модулей:
Тип модуля, определенный в файле main
JavaScript. Может быть один или массив следующих строк:
-
globals
: модуль JavaScript, который добавляет к глобальному пространству имен, используя синтаксис window.namespace
или this.namespace
-
amd
: модуль JavaScript, совместимый с AMD, например RequireJS, используя синтаксис define()
-
node
: модуль JavaScript, совместимый с node и CommonJS с использованием синтаксиса module.exports
-
es6
: модуль JavaScript, совместимый с модулями ECMAScript 6, используя синтаксис export
и import
-
yui
: модуль JavaScript, совместимый с модулями YUI, используя синтаксис YUI.add()
Соответствующая ссылка: https://github.com/bower/spec/blob/master/json.md#moduletype