Bower init - разность между amd, es6, globals и node

Я создаю свой первый компонент Bower. После запуска bower init script спрашивает меня: "Какие типы модулей выставляют этот пакет?" с этими параметрами:

  • amd
  • es6
  • globals
  • node

В чем разница между этими параметрами?

Ответ 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