Próbuję podsumować moją wiedzę na temat najpopularniejszych menedżerów pakietów JavaScript, programów pakujących i osób wykonujących zadania. Proszę popraw mnie jeżeli się mylę:
npm
ibower
są menedżerami pakietów. Po prostu pobierają zależności i nie wiedzą, jak samodzielnie budować projekty. Wiedzą, że mogą zadzwonićwebpack
/gulp
/grunt
po pobraniu wszystkich zależności.bower
jest podobnynpm
, ale buduje spłaszczone drzewa zależności (w przeciwieństwie donpm
tego, co rekurencyjnie). Znaczenienpm
pobiera zależności dla każdej zależności (może pobrać ją kilka razy), a jednocześniebower
oczekuje ręcznego uwzględnienia zależności zależnych. Czasamibower
inpm
są używane razem dla odpowiednio frontonu i back-endu (ponieważ każdy megabajt może mieć znaczenie w front-endie).grunt
igulp
wykonują zadania, aby zautomatyzować wszystko, co można zautomatyzować (tj. skompilować CSS / Sass, zoptymalizować obrazy, utworzyć pakiet oraz zminimalizować / przetransponować).grunt
vs.gulp
(jest jakmaven
vs.gradle
lub konfiguracja vs. kod). Grunt polega na konfigurowaniu osobnych niezależnych zadań, każde zadanie otwiera / obsługuje / zamyka plik. Gulp wymaga mniejszej ilości kodu i jest oparty na strumieniach węzłów, co pozwala mu budować łańcuchy potoków (bez ponownego otwierania tego samego pliku) i przyspiesza.webpack
(webpack-dev-server
) - dla mnie jest to runner z gorącym przeładowaniem zmian, który pozwala zapomnieć o wszystkich obserwatorach JS / CSS.npm
bower
Wtyczki / + mogą zastąpić moduły uruchamiające zadania. Ich umiejętności często się krzyżują, więc istnieją różne implikacje, jeśli potrzebujesz użyćgulp
/grunt
overnpm
+ pluginów. Ale programy uruchamiające zadania są zdecydowanie lepsze w przypadku złożonych zadań (np. „Na każdym kompilacji stwórz pakiet, transpiluj z ES6 do ES5, uruchom go we wszystkich emulatorach przeglądarek, twórz zrzuty ekranu i wdrażaj w Dropbox przez ftp”).browserify
umożliwia pakowanie modułów węzłów dla przeglądarek.browserify
vsnode
„srequire
jest rzeczywiście AMD vs CommonJS .
Pytania:
- Co to jest
webpack
&webpack-dev-server
? Oficjalna dokumentacja mówi, że jest to moduł do pakowania modułów, ale dla mnie to tylko program do wykonywania zadań. Co za różnica? - Gdzie byś użył
browserify
? Czy nie możemy zrobić tego samego z importem węzła / ES6? - Kiedy użyjesz wtyczek
gulp
/grunt
overnpm
+? - Podaj przykłady, gdy potrzebujesz użyć kombinacji
Odpowiedzi:
Webpack i Browserify
Webpack i Browserify wykonują prawie to samo zadanie, polegające na przetwarzaniu kodu w celu użycia go w środowisku docelowym (głównie w przeglądarce, chociaż można kierować reklamy do innych środowisk, takich jak Node). Wynikiem takiego przetwarzania jest jeden lub więcej pakietów - skompilowane skrypty odpowiednie dla docelowego środowiska.
Załóżmy na przykład, że napisałeś kod ES6 podzielony na moduły i chcesz móc go uruchomić w przeglądarce. Jeśli te moduły są modułami Node, przeglądarka ich nie zrozumie, ponieważ istnieją tylko w środowisku Node. Moduły ES6 również nie będą działać w starszych przeglądarkach, takich jak IE11. Co więcej, być może korzystałeś z eksperymentalnych funkcji języka (następne propozycje ES), których przeglądarki jeszcze nie implementują, więc uruchomienie takiego skryptu spowodowałoby tylko błędy. Narzędzia takie jak Webpack i Browserify rozwiązują te problemy, tłumacząc taki kod na formę, którą przeglądarka jest w stanie wykonać . Ponadto umożliwiają stosowanie wielu różnych optymalizacji w tych pakietach.
Jednak Webpack i Browserify różnią się na wiele sposobów, Webpack oferuje domyślnie wiele narzędzi (np. Dzielenie kodu), podczas gdy Browserify może to zrobić tylko po pobraniu wtyczek, ale użycie obu prowadzi do bardzo podobnych wyników . Wszystko sprowadza się do osobistych preferencji (Webpack jest bardziej modny). Btw, Webpack nie jest programem uruchamiającym zadania, jest jedynie procesorem plików (przetwarza je za pomocą tak zwanych programów ładujących i wtyczek) i może być uruchamiany (między innymi) przez program uruchamiający zadania.
Web Dev Dev Server
Webpack Dev Server zapewnia podobne rozwiązanie do Browsersync - serwera programistycznego, w którym można szybko wdrożyć aplikację podczas pracy nad nią i natychmiast sprawdzić jej postęp, a serwer programistów automatycznie odświeża przeglądarkę po zmianach kodu, a nawet propaguje zmieniony kod do przeglądarki bez ponownego ładowania z tzw. wymianą modułu na gorąco.
Biegacze zadań a skrypty NPM
Używałem Gulp ze względu na zwięzłość i łatwość pisania zadań, ale później odkryłem, że nie potrzebuję ani Gulpa, ani Grunta. Wszystko, czego kiedykolwiek potrzebowałem, można było zrobić za pomocą skryptów NPM do uruchamiania narzędzi innych firm za pośrednictwem ich interfejsu API. Wybór między skryptami Gulp, Grunt lub NPM zależy od gustu i doświadczenia twojego zespołu.
Podczas gdy zadania w Gulp lub Grunt są łatwe do odczytania, nawet dla osób niezbyt zaznajomionych z JS, jest to kolejne narzędzie do wymagania i nauki, a ja osobiście wolę zawęzić moje zależności i uprościć sprawy. Z drugiej strony zastąpienie tych zadań kombinacją skryptów NPM i (prawdopodobnie JS), które uruchamiają narzędzia innych firm (np. Konfigurowanie i uruchamianie rimrafa w celu czyszczenia), może być trudniejsze. Ale w większości przypadków te trzy są równe pod względem wyników.
Przykłady
Jeśli chodzi o przykłady, proponuję rzucić okiem na ten projekt startowy React , który pokazuje ładne połączenie skryptów NPM i JS obejmujących cały proces kompilacji i wdrażania. Możesz znaleźć te skrypty NPM w
package.json
folderze głównym we właściwości o nazwiescripts
. Tam najczęściej napotykasz polecenia takie jakbabel-node tools/run start
. Babel-node to narzędzie CLItools/run
(nieprzeznaczone do użytku produkcyjnego), które najpierw kompiluje plik ES6 (plik run.js znajdujący się w narzędziach ) - w zasadzie narzędzie uruchamiające . Ten moduł uruchamiający przyjmuje funkcję jako argument i wykonuje ją, co w tym przypadku jeststart
- innym narzędziem (start.js
) odpowiedzialna za łączenie plików źródłowych (zarówno klienta, jak i serwera) oraz uruchamianie serwera aplikacji i programowania (serwer deweloperów to prawdopodobnie albo Webpack Dev Server, albo Browsersync).Mówiąc dokładniej,
start.js
tworzy zarówno pakiety po stronie klienta, jak i serwera, uruchamia serwer ekspresowy i po udanym uruchomieniu inicjuje synchronizację przeglądarki, która w momencie pisania wyglądała tak (proszę odnieść się do projektu startera, aby uzyskać najnowszy kod).Ważną częścią jest to
proxy.target
, że gdy ustawiają adres serwera, który chcą proxy, może to być http: // localhost: 3000 , a Browsersync uruchamia serwer nasłuchując na http: // localhost: 3001 , gdzie wygenerowane zasoby są obsługiwane z automatyczną zmianą wykrywanie i wymiana modułu na gorąco. Jak widać, istnieje inna właściwość konfiguracyjnafiles
z indywidualnymi plikami lub wzorcami. Synchronizacja przeglądarki sprawdza zmiany i przeładowuje przeglądarkę, jeśli takie wystąpią, ale jak mówi komentarz, Webpack sam zajmuje się oglądaniem źródeł js z HMR, więc współpracują tam.Teraz nie mam równoważnego przykładu takiej konfiguracji Grunta lub Gulpa, ale z Gulpem (i nieco podobnym z Gruntem) pisałbyś pojedyncze zadania w gulpfile.js, takie jak
gdzie robilibyście w zasadzie te same rzeczy, co w zestawie startowym, tym razem z programem uruchamiającym zadania, który rozwiązuje dla was pewne problemy, ale przedstawia swoje własne problemy i pewne trudności w nauce użytkowania, i jak mówię, im więcej masz zależności, tym więcej może pójść nie tak. I dlatego lubię się pozbywać takich narzędzi.
źródło
Zaktualizuj październik 2018 r
Jeśli nadal nie masz pewności co do dewelopera Front-end, możesz szybko zapoznać się z doskonałym źródłem informacji tutaj.
https://github.com/kamranahmedse/developer-roadmap
Aktualizacja z czerwca 2018 r
Nauka nowoczesnego JavaScript jest trudna, jeśli nie byłeś tam od samego początku. Jeśli jesteś nowym przybyszem, pamiętaj, aby sprawdzić ten znakomity napisany, aby mieć lepszy przegląd.
https://medium.com/the-node-js-collection/modern-javascript-explained-for-dinosaurs-f695e9747b70
Zaktualizuj lipiec 2017 r
Niedawno znalazłem naprawdę obszerny przewodnik od zespołu Grab, w jaki sposób podejść do rozwoju frontonu w 2017 roku. Możesz to sprawdzić, jak poniżej.
https://github.com/grab/front-end-guide
Szukałem tego również od dłuższego czasu, ponieważ istnieje wiele narzędzi i każde z nich przynosi korzyści w innym aspekcie. Społeczność jest podzielona na narzędzia takie jak
Browserify, Webpack, jspm, Grunt and Gulp
. Możesz także usłyszeć oYeoman or Slush
. To naprawdę nie jest problem, jest po prostu mylące dla wszystkich, którzy próbują zrozumieć jasną ścieżkę naprzód.W każdym razie chciałbym coś wnieść.
1. Menedżer pakietów
Menedżerowie pakietów upraszczają instalowanie i aktualizowanie zależności projektu, które są bibliotekami takimi jak:
jQuery, Bootstrap
itp. - wszystko, co jest używane w Twojej witrynie i nie jest napisane przez Ciebie.Przeglądanie wszystkich stron bibliotek, pobieranie i rozpakowywanie archiwów, kopiowanie plików do projektów - wszystko to jest zastępowane kilkoma poleceniami w terminalu.
NPM
oznacza:Node JS package manager
pomaga zarządzać wszystkimi bibliotekami, na których opiera się twoje oprogramowanie. Zdefiniujesz swoje potrzeby w pliku o nazwiepackage.json
i uruchomisznpm install
w wierszu poleceń ... następnie BANG, twoje pakiety zostaną pobrane i gotowe do użycia. Może być używany zarówno dofront-end and back-end
bibliotek.Bower
: w przypadku zarządzania pakietami front-end koncepcja jest taka sama jak w przypadku NPM. Wszystkie twoje biblioteki są przechowywane w pliku o nazwie,bower.json
a następnie uruchamianebower install
w wierszu poleceń.NPM
Altana
Yarn
: Nowy menedżer pakietówJavaScript
opublikowany przezFacebook
ostatnio z kilkoma dodatkowymi zaletami w porównaniu doNPM
. A dzięki Yarn nadal możesz używać zarówno rejestru, jakNPM
iBower
rejestru, aby pobrać pakiet. Jeśli wcześniej zainstalowałeś pakiet,yarn
tworzy kopię w pamięci podręcznej, co ułatwiaoffline package installs
.jspm
: to menedżer pakietów dlaSystemJS
uniwersalnego modułu ładującego, zbudowany na bazieES6
modułu dynamicznego modułu ładującego. Nie jest to całkowicie nowy menedżer pakietów z własnym zestawem reguł, a raczej działa na istniejących źródłach pakietów. Po wyjęciu z pudełka działa zGitHub
inpm
. Ponieważ większośćBower
pakietów opartych jest na tychGitHub
, możemy je również zainstalowaćjspm
. Posiada rejestr, który zawiera listę najczęściej używanych pakietów frontonu dla łatwiejszej instalacji.2. Moduł ładujący / pakietowy
W większości projektów dowolnej skali kod będzie podzielony na kilka plików. Możesz po prostu dołączyć każdy plik z indywidualnym
<script>
znacznikiem, jednak<script>
ustanawia nowe połączenie HTTP, a dla małych plików - co jest celem modułowości - czas na ustanowienie połączenia może potrwać znacznie dłużej niż przesłanie danych. Podczas pobierania skryptów nie można zmieniać treści na stronie.Na przykład
Na przykład
Komputery mogą to zrobić lepiej niż Ty, dlatego powinieneś użyć narzędzia do automatycznego pakowania wszystkiego w jeden plik.
Potem usłyszeliśmy o
RequireJS
,Browserify
,Webpack
iSystemJS
RequireJS
: toJavaScript
moduł ładujący pliki i moduły. Jest zoptymalizowany do użytku w przeglądarce, ale może być używany w innych środowiskach JavaScript, takich jakNode
.Np .: myModule.js
W
main.js
możemy zaimportowaćmyModule.js
jako zależność i wykorzystać ją.A potem w naszym
HTML
możemy odwołać się do użycia zRequireJS
.Browserify
: określono, aby umożliwić korzystanie zeCommonJS
sformatowanych modułów w przeglądarce. W związku z tymBrowserify
nie jest tyle modułem ładującym moduły, co modułem pakującym:Browserify
jest całkowicie narzędziem do kompilacji, wytwarzającym pakiet kodu, który można następnie załadować po stronie klienta.Zacznij od kompilacji z zainstalowanym węzłem i npm, a otrzymasz pakiet:
Napisz swoje moduły w
CommonJS
formacieA gdy będzie szczęśliwy, wydaj polecenie, aby dołączyć:
Browserify rekurencyjnie znajduje wszystkie zależności punktu wejścia i łączy je w jeden plik:
Webpack
: Łączy wszystkie Twoje statyczne zasoby, w tymJavaScript
obrazy, CSS i więcej, w jednym pliku. Umożliwia także przetwarzanie plików przez różne typy programów ładujących. Możesz napisać swoją składnię zaJavaScript
pomocąCommonJS
lubAMD
modułów. Atakuje problem kompilacji w sposób zasadniczo bardziej zintegrowany i opiniotwórczy. WBrowserify
użyciuGulp/Grunt
i długa lista transformacji i wtyczek do wykonania zadania.Webpack
zapewnia wystarczającą moc po wyjęciu z pudełka, której zwykle nie potrzebujeszGrunt
lub wcale nie potrzebujeszGulp
.Podstawowe użycie nie jest proste. Zainstaluj Webpack jak Browserify:
I przekaż polecenie punkt wejścia i plik wyjściowy:
SystemJS
: to moduł ładujący, który może importować moduły w czasie wykonywania w dowolnym z popularnych obecnie używanych formatów (CommonJS, UMD, AMD, ES6
). Jest zbudowany na górnej częściES6
modułu wypełniającego moduł napełniania i jest wystarczająco inteligentny, aby wykryć używany format i odpowiednio go obsługiwać.SystemJS
może również przenosić kod ES6 (zBabel
lubTraceur
) lub innymi językami, takimi jakTypeScript
iCoffeeScript
przy użyciu wtyczek.3. Runner zadań
Programy uruchamiające zadania i narzędzia do budowania to przede wszystkim narzędzia wiersza polecenia. Dlaczego musimy ich używać: Jednym słowem: automatyzacja . Mniej pracy musisz wykonywać podczas powtarzających się zadań, takich jak minimalizacja, kompilacja, testowanie jednostkowe, szuflowanie, które wcześniej kosztowały nas wiele razy z wiersza poleceń lub nawet ręcznie.
Grunt
: Możesz stworzyć automatyzację dla swojego środowiska programistycznego, aby wstępnie przetwarzać kody lub tworzyć skrypty kompilacji z plikiem konfiguracyjnym, a wykonywanie skomplikowanego zadania wydaje się bardzo trudne. Popularne w ostatnich latach.Każde zadanie
Grunt
to szereg różnych konfiguracji wtyczek, które po prostu są wykonywane jeden po drugim, w ściśle niezależny i sekwencyjny sposób.Gulp
: Automatyzacja podobnie jak,Grunt
ale zamiast konfiguracji, możesz pisaćJavaScript
strumieniami, jak w przypadku aplikacji węzłowej. Wolę te dni.To jest
Gulp
przykładowa deklaracja zadania.4. Narzędzia do rusztowań
Slush and Yeoman
: Możesz z nimi tworzyć projekty początkowe. Na przykład planujesz zbudować prototyp z HTML i SCSS, a następnie zamiast ręcznie utworzyć folder, taki jak scss, css, img, czcionki. Możesz po prostu zainstalowaćyeoman
i uruchomić prosty skrypt. Więc wszystko tutaj dla ciebie.Znajdź więcej tutaj .
Moja odpowiedź nie jest tak naprawdę zgodna z treścią pytania, ale kiedy szukam tej wiedzy w Google, zawsze widzę pytanie na górze, więc postanowiłem odpowiedzieć na nie w skrócie. Mam nadzieję, że uznaliście to za pomocne.
źródło
OK, wszystkie mają pewne podobieństwa, robią to samo dla ciebie na różne i podobne sposoby, dzielę je na 3 główne grupy, jak poniżej:
1) Pakiety modułów
webpack i przeglądaj jako popularne, działają jak programy uruchamiające zadania, ale z większą elastycznością, a także połączy wszystko razem jako twoje ustawienie, dzięki czemu możesz wskazać wynik jako bundle.js na przykład w jednym pliku, w tym CSS i JavaScript, dla więcej szczegółów każdego z nich, spójrz na szczegóły poniżej:
paczka internetowa
więcej tutaj
przeglądaj
więcej tutaj
2) Biegacze zadań
gulp i chrząknięcie to osoby wykonujące zadania, w zasadzie to, co robią, tworzenie zadań i uruchamianie ich w dowolnym momencie, na przykład instalujesz wtyczkę w celu zminimalizowania CSS, a następnie uruchamiasz ją za każdym razem, aby wykonać minimalizację, więcej szczegółów na temat każdego z nich:
łyk
więcej tutaj
chrząknięcie
więcej tutaj
3) Menedżerowie pakietów
menedżerowie pakietów, zarządzają wtyczkami, których potrzebujesz w aplikacji i instalują je za pośrednictwem github itp. za pomocą package.json, bardzo przydatne do aktualizacji modułów, instalacji i udostępniania aplikacji, więcej szczegółów dla każdego z nich:
npm
więcej tutaj
altana
więcej tutaj
i najnowszego menedżera pakietów, którego nie należy przegapić, jest młody i szybki w prawdziwym środowisku pracy w porównaniu do npm, którego najczęściej używałem wcześniej, w celu ponownej instalacji modułów, sprawdza dwukrotnie folder node_modules, aby sprawdzić istnienie modułu, wydaje się również, że instalacja modułów zajmuje mniej czasu:
przędza
więcej tutaj
źródło
Możesz znaleźć techniczne porównanie na npmcompare
Porównując Browserify vs. chrząknięcie vs. gulp vs. webpack
Jak widać webpack jest bardzo dobrze utrzymany, a nowa wersja wychodzi średnio co 4 dni. Ale Gulp wydaje się mieć największą społeczność ze wszystkich (z ponad 20 tysiącami gwiazd na Githubie) Grunt wydaje się nieco zaniedbany (w porównaniu do innych)
Więc jeśli trzeba wybrać jedną z drugiej, wybrałbym Gulpa
źródło
Mała uwaga na temat npm: npm3 próbuje zainstalować zależności w płaski sposób
https://docs.npmjs.com/how-npm-works/npm3#npm-v3-dependency-resolution
źródło
dedupe
opcję zrobienia tego samegowebpack-dev-server to serwer przeładowujący na żywo, z którego korzystają programiści Webpack, aby uzyskać natychmiastową informację zwrotną o tym, co robią. Należy go używać tylko podczas programowania.
Ten projekt jest mocno zainspirowany narzędziem testowym jednostki nof5 .
Pakiet Web, jak sama nazwa wskazuje, utworzy POJEDYNCZY pakiet dla sieci . Pakiet zostanie zminimalizowany i połączony w jeden plik (wciąż żyjemy w wieku HTTP 1.1). WebPACK czyni magię łączenie zasobów (JavaScript, CSS, obrazy) i wstrzykując im tak:
<script src="assets/bundle.js"></script>
.Można go również nazwać programem pakującym moduły, ponieważ musi zrozumieć zależności między modułami, a także sposób chwytania zależności i łączenia ich w pakiety.
Możesz użyć Browserify do tych samych zadań, w których używałbyś pakietu Webpack . - Webpack jest jednak bardziej kompaktowy.
Zauważ, że funkcje modułu ładującego ES6 w Webpack2 używają System.import , który natywnie nie obsługuje żadnej przeglądarki.
Możesz zapomnieć o Gulp, Grunt, Brokoli, Brunch i Bower . Zamiast tego użyj bezpośrednio skryptów wiersza polecenia npm i możesz wyeliminować dodatkowe pakiety takie jak tutaj dla Gulp :
Prawdopodobnie możesz użyć generatorów plików konfiguracyjnych Gulp i Grunt podczas tworzenia plików konfiguracyjnych dla swojego projektu. W ten sposób nie musisz instalować Yeoman ani podobnych narzędzi.
źródło
Yarn to najnowszy menedżer pakietów, który prawdopodobnie zasługuje na wzmiankę.
Oto on: https://yarnpkg.com/
O ile mi wiadomo, może pobierać zarówno zależności npm, jak i altany i ma inne cenione funkcje.
źródło
Webpack
jest pakietem. JakBrowserfy
wygląda w bazie kodu dla żądań modułów (require
lubimport
) i rozwiązuje je rekurencyjnie. Co więcej, możesz skonfigurowaćWebpack
rozwiązanie nie tylko modułów podobnych do JavaScript, ale CSS, obrazów, HTML, dosłownie wszystkiego. Co mnie szczególnie ekscytujeWebpack
, możesz łączyć zarówno skompilowane, jak i dynamicznie ładowane moduły w tej samej aplikacji. W ten sposób uzyskuje się prawdziwy wzrost wydajności, szczególnie w przypadku HTTP / 1.x. Jak dokładnie to robisz, opisałem tutaj przykładami http://dsheiko.com/weblog/state-of-javascript-modules-2017/ Jako alternatywę dla bundlera można pomyślećRollup.js
( https://rollupjs.org/ ) , co optymalizuje kod podczas kompilacji, ale usuwa wszystkie nieużywane fragmenty.Bo
AMD
zamiastRequireJS
jednego można przejść z rodzimymES2016 module system
, ale załadowanymSystem.js
( https://github.com/systemjs/systemjs )Poza tym wskazałbym, że
npm
jest często używany jako narzędzie automatyzujące, takie jakgrunt
lubgulp
. Sprawdź https://docs.npmjs.com/misc/scripts . Teraz osobiście korzystam ze skryptów npm, unikając innych narzędzi automatyzacji, chociaż w przeszłości byłem bardzo zainteresowanygrunt
. Z innymi narzędziami musisz polegać na niezliczonych wtyczkach do pakietów, które często nie są dobrze napisane i nie są aktywnie utrzymywane.npm
zna jego pakiety, więc wywołujesz dowolne z lokalnie zainstalowanych pakietów według nazwy, np .:Właściwie to z reguły nie potrzebujesz żadnej wtyczki, jeśli pakiet obsługuje CLI.
źródło