В чем принципиальная разница между bower
и npm
? Просто хочу что-то простое и понятное. Я видел, как некоторые из моих коллег использовали bower
и npm
взаимозаменяемо в своих проектах.
javascript
npm
bower
Игры Brainiac
источник
источник
Ответы:
У всех менеджеров пакетов есть много минусов. Вам просто нужно выбрать, с чем вы можете жить.
история
npm начал управлять модулями node.js (поэтому пакеты включаются
node_modules
по умолчанию), но он работает и для внешнего интерфейса в сочетании с Browserify или webpack .Bower создан исключительно для внешнего интерфейса и оптимизирован с учетом этого.
Размер репо
npm намного, намного больше, чем bower, включая JavaScript общего назначения (например,
country-data
для информации о стране илиsorts
для функций сортировки, которые можно использовать на переднем или заднем конце).Бауэр имеет гораздо меньшее количество пакетов.
Обработка стилей и т. Д.
Бауэр включает в себя стили и т. Д.
Npm ориентирован на JavaScript. Стили либо загружаются отдельно, либо требуются чем-то вроде
npm-sass
илиsass-npm
.Обработка зависимостей
Самым большим отличием является то, что npm выполняет вложенные зависимости (но является плоской по умолчанию), в то время как Bower требует плоского дерева зависимостей (накладывает бремя разрешения зависимостей на пользователя) .
Вложенное дерево зависимостей означает, что ваши зависимости могут иметь свои собственные зависимости, которые могут иметь свои собственные, и так далее. Это позволяет двум модулям требовать разные версии одной и той же зависимости и все еще работать. Обратите внимание, что начиная с npm v3, дерево зависимостей по умолчанию будет плоским (экономия места) и будет гнездиться только там, где это необходимо, например, если двум зависимостям требуется собственная версия Underscore.
В некоторых проектах используется то, что они используют Bower для интерфейсных пакетов и npm для инструментов разработчика, таких как Yeoman, Grunt, Gulp, JSHint, CoffeeScript и т. Д.
Ресурсы
источник
Этот ответ является дополнением к ответу Синдре Сорхуса. Основное различие между npm и Bower заключается в том, как они обрабатывают рекурсивные зависимости. Обратите внимание, что они могут быть использованы вместе в одном проекте.
Часто задаваемые вопросы о npm : (ссылка на archive.org от 6 сентября 2015 г.)
На домашней странице Bower :
Короче говоря, npm стремится к стабильности. Бауэр стремится к минимальной нагрузке на ресурсы. Если вы нарисуете структуру зависимостей, вы увидите это:
NPM:
Как вы видите, он устанавливает некоторые зависимости рекурсивно. Зависимость А имеет три установленных экземпляра!
Беседка:
Здесь вы видите, что все уникальные зависимости находятся на одном уровне.
Итак, зачем использовать npm?
Возможно, для зависимости B требуется другая версия зависимости A, чем для зависимости C. npm устанавливает обе версии этой зависимости, поэтому она все равно будет работать, но Bower создаст вам конфликт, потому что не любит дублирование (поскольку загрузка одного и того же ресурса на веб-странице очень неэффективно и дорого, а также может привести к серьезным ошибкам). Вам нужно будет вручную выбрать, какую версию вы хотите установить. Это может привести к тому, что одна из зависимостей будет нарушена, но это нужно исправить в любом случае.
Таким образом, обычно используется Bower для пакетов, которые вы хотите опубликовать на своих веб-страницах (например, во время выполнения , где вы избегаете дублирования), и использовать npm для других вещей, таких как тестирование, сборка, оптимизация, проверка и т. Д. (Например, время разработки где дублирование менее важно).
Обновление для npm 3:
Npm 3 по-прежнему работает по-другому по сравнению с Bower. Он установит зависимости глобально, но только для первой версии, с которой он столкнется. Другие версии устанавливаются в дереве (родительский модуль, затем node_modules).
Dep A v1.0(использует корневую версию)Для получения дополнительной информации, я предлагаю прочитать документы npm 3
источник
npm
или минимальную нагрузку ресурсов сbower
.TL; DR: самая большая разница в повседневном использовании - это не вложенные зависимости ... это разница между модулями и глобальными переменными.
Я думаю, что предыдущие плакаты хорошо освещали некоторые основные различия. (Использование npm вложенных зависимостей действительно очень полезно для управления большими и сложными приложениями, хотя я не думаю, что это самое важное различие.)
Я удивлен, однако, что никто явно не объяснил одно из самых фундаментальных различий между Bower и npm. Если вы прочитаете ответы выше, вы увидите слово «модули», часто используемое в контексте npm. Но это упоминается случайно, как будто это может быть просто разница в синтаксисе.
Но это различие между модулями и глобальными (или модулями и «скриптами»), возможно, является наиболее важным отличием между Bower и npm. Подход npm для помещения всего в модули требует, чтобы вы изменили способ написания Javascript для браузера, почти наверняка в лучшую сторону.
Бауэр подход: глобальные ресурсы, как
<script>
тегиВ корне Bower о загрузке простых старых файлов сценариев. Что бы ни содержали эти файлы скриптов, Бауэр загрузит их. Что в основном означает, что Bower - это то же самое, что включить все ваши скрипты в простой старый
<script>
в<head>
ваш HTML.Итак, тот же базовый подход, к которому вы привыкли, но вы получаете некоторые удобные возможности автоматизации:
bower install
и мгновенно получить то, что ему нужно, локально.bower.json
, они также будут загружены для вас.Но кроме этого, Бауэр не меняет то, как мы пишем JavaScript . Ничего из того, что происходит внутри файлов, загружаемых Bower, вообще не должно меняться. В частности, это означает, что ресурсы, предоставляемые в скриптах, загружаемых Bower, будут (обычно, но не всегда) по-прежнему определяться как глобальные переменные , доступные из любого места в контексте выполнения браузера.
Подход npm: общие JS-модули, явное внедрение зависимостей
Весь код в Node land (и, следовательно, весь код, загружаемый через npm) структурирован как модули (в частности, как реализация формата модуля CommonJS , или теперь как модуль ES6). Итак, если вы используете NPM для обработки зависимостей на стороне браузера (через Browserify или что-то еще, что делает ту же работу), вы будете структурировать свой код так же, как это делает Node.
Более умные люди, чем я, взялись за вопрос «Почему модули?», Но вот краткая сводка:
window.variable
. Единственная авария, которая все еще имеет тенденцию происходить, это присвоениеthis.variable
, а не осознание того, чтоthis
на самом деле находитсяwindow
в текущем контексте.)Для меня использование модулей для внешнего кода сводится к: работе в гораздо более узком контексте, который легче рассуждать и тестировать, и большей уверенности в происходящем.
Это займет всего около 30 секунд, чтобы научиться использовать синтаксис модуля CommonJS / Node. Внутри данного файла JS, который будет модулем, вы сначала объявляете любые внешние зависимости, которые хотите использовать, например так:
var React = require('react');
Внутри файла / модуля вы делаете все, что обычно делаете, и создаете какой-либо объект или функцию, которую вы хотите предоставить внешним пользователям, возможно, вызывая ее
myModule
.В конце файла вы экспортируете все, что хотите поделиться с миром, например так:
module.exports = myModule;
Затем, чтобы использовать основанный на CommonJS рабочий процесс в браузере, вы будете использовать такие инструменты, как Browserify, чтобы захватывать все эти отдельные файлы модулей, инкапсулировать их содержимое во время выполнения и вставлять их друг в друга по мере необходимости.
И, поскольку модули ES6 (которые вы, скорее всего, перенесете в ES5 с Babel или аналогичными), получают широкое признание и работают как в браузере, так и в Node 4.0, мы должны упомянуть и их хороший обзор .
Подробнее о шаблонах для работы с модулями в этой колоде .
РЕДАКТИРОВАТЬ (февраль 2017 г.): пряжа Facebook является очень важной потенциальной заменой / дополнением для npm в наши дни: быстрое, детерминистическое, автономное управление пакетами, основанное на том, что дает npm. Это стоит посмотреть на любой проект JS, особенно потому, что его так легко поменять местами.
РЕДАКТИРОВАТЬ (май 2019) "Бауэр, наконец, устарела . Конец истории". (h / t: @DanDascalescu, ниже, для краткого изложения.)
И, несмотря на то, что Yarn все еще активен , большая часть импульса вернулась к npm, как только он принял некоторые из ключевых функций Yarn.
источник
Обновление 2017-октябрь
Бауэр наконец-то устарела . Конец истории.
Старый ответ
От Маттиаса Петтера Йоханссона, разработчика JavaScript в Spotify :
(Обратите внимание, что Webpack и накопительный пакет, по общему мнению, лучше, чем Browserify по состоянию на август 2016 года.)
источник
Bower поддерживает единственную версию модулей, она только пытается помочь вам выбрать правильный / лучший для вас.
NPM лучше подходит для узловых модулей, потому что есть модульная система, и вы работаете локально. Bower хорош для браузера, потому что в настоящее время существует только глобальная область действия, и вы хотите быть очень избирательными в отношении версии, с которой вы работаете.
источник
Моя команда переехала из Бауэра и переехала в npm, потому что:
Для получения дополнительной информации см. «Почему моя команда использует npm вместо bower» .
источник
Нашел это полезное объяснение на http://ng-learn.org/2013/11/Bower-vs-npm/
источник
npm dedupe
, это немного устарело. Смотрите ответ Маттиаса .Для многих людей, работающих с node.js, основным преимуществом bower является управление зависимостями, которые вообще не являются javascript. Если они работают с языками, которые компилируются в javascript, npm может использоваться для управления некоторыми из их зависимостей. однако не все их зависимости будут модулями node.js. Некоторые из тех, которые компилируются в javascript, могут иметь странное искажение, специфичное для исходного языка, что делает передачу их скомпилированным в javascript неэлегичной опцией, когда пользователи ожидают исходный код.
Не все в пакете npm должно быть ориентированным на пользователя javascript, но для пакетов библиотеки npm, по крайней мере, некоторые из них должны быть.
источник