Jaka jest podstawowa różnica między bower
i npm
? Po prostu chcę coś prostego i prostego. Widziałem, jak niektórzy z moich kolegów używają bower
i npm
zamiennie w swoich projektach.
javascript
npm
bower
Games Brainiac
źródło
źródło
Odpowiedzi:
Wszyscy menedżerowie pakietów mają wiele wad. Musisz tylko wybrać, z kim możesz żyć.
Historia
npm rozpoczął zarządzanie modułów node.js (dlatego pakiety wchodzić
node_modules
domyślnie), ale działa na front-end też w połączeniu z Browserify lub WebPack .Bower został stworzony wyłącznie z myślą o interfejsie użytkownika i został zoptymalizowany pod tym kątem.
Rozmiar repo
npm jest znacznie, dużo większy niż altana, włączając w to JavaScript ogólnego przeznaczenia (np.
country-data
do informacji o kraju lubsorts
do funkcji sortowania, które można wykorzystać na interfejsie lub na zapleczu).Bower ma znacznie mniejszą liczbę paczek.
Obsługa stylów itp
Bower zawiera style itp.
npm koncentruje się na JavaScript. Style są pobierane osobno lub wymagane przez coś takiego jak
npm-sass
lubsass-npm
.Obsługa zależności
Największą różnicą jest to, że npm robi zagnieżdżone zależności (ale domyślnie jest płaska), podczas gdy Bower wymaga płaskiego drzewa zależności (nakłada na użytkownika ciężar rozwiązywania zależności) .
Zagnieżdżone drzewo zależności oznacza, że twoje zależności mogą mieć własne zależności, które mogą mieć swoje własne i tak dalej. Dzięki temu dwa moduły wymagają różnych wersji tej samej zależności i nadal działają. Zauważ, że od npm v3, drzewo zależności domyślnie będzie płaskie (oszczędność miejsca) i zagnieżdżone tylko tam, gdzie będzie to potrzebne, np. Jeśli dwie zależności potrzebują własnej wersji podkreślenia.
Niektóre projekty używają obu, ponieważ używają Bowera do pakietów frontonu i npm do narzędzi programistycznych takich jak Yeoman, Grunt, Gulp, JSHint, CoffeeScript itp.
Zasoby
źródło
Ta odpowiedź jest dodatkiem do odpowiedzi Sindre Sorhus. Główną różnicą między npm i Bower jest sposób, w jaki traktują zależności rekurencyjne. Pamiętaj, że można ich używać razem w jednym projekcie.
Na npm FAQ : (archive.org powiązanie z 6 wrz 2015)
Na stronie głównej Bower :
Krótko mówiąc, npm dąży do stabilności. Bower dąży do minimalnego obciążenia zasobów. Jeśli narysujesz strukturę zależności, zobaczysz to:
npm:
Jak widać instaluje rekurencyjnie niektóre zależności. Zależność A ma trzy zainstalowane instancje!
Altana:
Tutaj widzisz, że wszystkie unikalne zależności są na tym samym poziomie.
Po co więc męczyć się z użyciem npm?
Być może zależność B wymaga innej wersji zależności A niż zależność C. npm instaluje obie wersje tej zależności, więc i tak będzie działać, ale Bower da ci konflikt, ponieważ nie lubi duplikacji (ponieważ ładowanie tego samego zasobu na stronie jest bardzo nieefektywne i kosztowne, może również powodować poważne błędy). Będziesz musiał ręcznie wybrać wersję, którą chcesz zainstalować. Może to spowodować uszkodzenie jednej z zależności, ale i tak trzeba to naprawić.
Tak więc, powszechnym zastosowaniem jest Bower dla pakietów, które chcesz publikować na swoich stronach internetowych (np. Środowisko wykonawcze , w którym unikasz powielania) i używaj npm do innych rzeczy, takich jak testowanie, budowanie, optymalizacja, sprawdzanie itp. (Np. Czas programowania , gdzie powielanie jest mniej istotne).
Aktualizacja dla npm 3:
npm 3 nadal robi rzeczy inaczej niż Bower. Zainstaluje zależności globalnie, ale tylko dla pierwszej napotkanej wersji. Pozostałe wersje są zainstalowane w drzewie (moduł nadrzędny, a następnie moduły_węzła).
dep A v1.0(używa wersji root)Aby uzyskać więcej informacji, sugeruję przeczytanie dokumentacji npm 3
źródło
npm
albo minimalne obciążenie zasobówbower
.TL; DR: Największą różnicą w codziennym użytkowaniu nie są zależności zagnieżdżone ... to różnica między modułami a globałami.
Myślę, że poprzednie plakaty dobrze opisywały niektóre podstawowe wyróżnienia. (użycie zagnieżdżonych zależności przez npm jest naprawdę bardzo pomocne w zarządzaniu dużymi, złożonymi aplikacjami, choć nie sądzę, że jest to najważniejsze rozróżnienie).
Dziwi mnie jednak fakt, że nikt nie wyjaśnił jednoznacznie jednej z najbardziej podstawowych różnic między Bower a npm. Jeśli przeczytasz powyższe odpowiedzi, zobaczysz słowo „moduły” używane często w kontekście npm. Ale wspomina się o tym od niechcenia, jakby to była tylko różnica w składni.
Ale to rozróżnienie modułów na globale (lub modułów na „skrypty”) jest prawdopodobnie najważniejszą różnicą między Bower a npm. Podejście NPM polegające na umieszczaniu wszystkiego w modułach wymaga zmiany sposobu pisania Javascript dla przeglądarki, prawie na pewno na lepsze.
Podejście Bower: globalne zasoby, takie jak
<script>
tagiW katalogu głównym Bower polega na ładowaniu zwykłych plików skryptów. Cokolwiek zawierają te pliki skryptów, Bower je załaduje. Co w zasadzie oznacza, że Bower jest po prostu włączeniem wszystkich twoich skryptów do zwykłych starych
<script>
w<head>
twoim HTML.Więc to samo podstawowe podejście, do którego jesteś przyzwyczajony, ale masz kilka fajnych udogodnień automatyzacji:
bower install
i natychmiast mieć to, czego potrzebuje, lokalnie.bower.json
, zostaną one również pobrane dla Ciebie.Ale poza tym Bower nie zmienia sposobu, w jaki piszemy javascript . Nic, co znajduje się w plikach ładowanych przez Bowera, nie musi się w ogóle zmieniać. W szczególności oznacza to, że zasoby dostarczone w skryptach ładowanych przez Bowera (zwykle, ale nie zawsze) będą nadal definiowane jako zmienne globalne , dostępne z dowolnego miejsca w kontekście wykonywania przeglądarki.
Podejście npm: wspólne moduły JS, jawne wstrzykiwanie zależności
Cały kod w obszarze Node (a więc cały kod ładowany przez npm) ma strukturę modułów (w szczególności jako implementację formatu modułu CommonJS lub teraz jako moduł ES6). Tak więc, jeśli używasz NPM do obsługi zależności po stronie przeglądarki (poprzez Browserify lub coś innego, co wykonuje tę samą pracę), ustrukturyzujesz swój kod w ten sam sposób, co robi Node.
Ludzie mądrzejsi ode mnie poradzili sobie z pytaniem „Dlaczego moduły?”, Ale oto podsumowanie kapsułek:
window.variable
. Jedynym wypadkiem, który wciąż ma miejsce, jest przypisaniethis.variable
, nie zdając sobie sprawy, żethis
tak naprawdę jestwindow
w obecnym kontekście.)Dla mnie użycie modułów w kodzie front-end sprowadza się do: pracy w znacznie węższym kontekście, łatwiejszym do przemyślenia i przetestowania, oraz większej pewności co do tego, co się dzieje.
Nauka używania składni modułu CommonJS / Node zajmuje tylko około 30 sekund. Wewnątrz pliku JS, który będzie modułem, najpierw zadeklarujesz zależności zewnętrzne, których chcesz użyć, na przykład:
var React = require('react');
Wewnątrz pliku / modułu robisz wszystko, co zwykle, i tworzysz jakiś obiekt lub funkcję, którą chcesz udostępnić użytkownikom zewnętrznym, być może nazywając to
myModule
.Na końcu pliku eksportujesz wszystko, co chcesz udostępnić światu, w następujący sposób:
module.exports = myModule;
Następnie, aby użyć przepływu pracy opartego na CommonJS w przeglądarce, użyjesz narzędzi takich jak Browserify, aby pobrać wszystkie te pojedyncze pliki modułów, obudować ich zawartość w czasie wykonywania i wstrzyknąć je sobie w razie potrzeby.
ORAZ, ponieważ moduły ES6 (które najprawdopodobniej przeniesiesz do ES5 z Babel lub podobnym) zyskują szeroką akceptację i działają zarówno w przeglądarce, jak i w Node 4.0, powinniśmy również wspomnieć o ich dobrym przeglądzie .
Więcej informacji o wzorach do pracy z modułami w tym pokładzie .
EDYCJA (luty 2017): Przędza Facebooka jest obecnie bardzo ważnym potencjalnym zamiennikiem / suplementem dla npm: szybkie, deterministyczne, zarządzanie pakietami offline, które opiera się na tym, co daje ci npm. Warto poszukać każdego projektu JS, zwłaszcza, że tak łatwo jest go zamienić na.
EDYCJA (maj 2019) „Bower jest już przestarzały . Koniec historii”. (h / t: @DanDascalescu, poniżej, dla zwięzłego podsumowania.)
I podczas gdy Przędza jest nadal aktywna , znaczna rozpęd powróciła do npm, kiedy przyjęła niektóre kluczowe cechy Przędzy.
źródło
Aktualizacja 2017-paź
Bower został w końcu przestarzały . Koniec opowieści.
Starsza odpowiedź
Od Mattias Petter Johansson, programista JavaScript w Spotify :
(Uwaga: pakiet Webpack i pakiet zbiorczy są powszechnie uważane za lepsze niż Browserify od sierpnia 2016 r.)
źródło
Bower utrzymuje jedną wersję modułów, stara się jedynie pomóc wybrać odpowiedni / najlepszy dla Ciebie.
NPM jest lepszy dla modułów węzłów, ponieważ istnieje system modułów i pracujesz lokalnie. Bower jest dobry dla przeglądarki, ponieważ obecnie istnieje tylko zasięg globalny i chcesz być bardzo wybiórczy w kwestii wersji, z którą pracujesz.
źródło
Mój zespół odszedł od Bowera i przeprowadził się do npm, ponieważ:
Aby uzyskać więcej informacji, zobacz „Dlaczego mój zespół używa npm zamiast altany” .
źródło
Znalazłem to przydatne wyjaśnienie na stronie http://ng-learn.org/2013/11/Bower-vs-npm/
źródło
npm dedupe
jest to nieco przestarzałe. Zobacz odpowiedź Mattiasa .Dla wielu osób pracujących z node.js główną zaletą bower jest zarządzanie zależnościami, które wcale nie są javascript. Jeśli pracują z językami kompilującymi się w javascript, npm może być użyty do zarządzania niektórymi z ich zależności. jednak nie wszystkie ich zależności będą modułami node.js. Niektóre z tych, które kompilują się do javascript, mogą mieć dziwne zniekształcenie specyficzne dla języka źródłowego, co sprawia, że przekazywanie ich w kompilacji do javascript jest nieelegantną opcją, gdy użytkownicy oczekują kodu źródłowego.
Nie wszystko w pakiecie npm musi być skryptem JavaScript skierowanym do użytkownika, ale w przypadku pakietów biblioteki npm przynajmniej niektóre z nich powinny być.
źródło