Chociaż istnieją świetne rozwiązania do zarządzania zależnościami po stronie serwera, nie mogłem znaleźć żadnego, które spełniałoby wszystkie moje potrzeby, aby mieć spójny przepływ pracy zarządzania zależnościami JavaScript po stronie klienta. Chcę spełnić te 5 wymagań:
- Zarządzaj mój klient boczne zależności w formacie zbliżonym do KMP w package.json lub Bower „s
bower.json
- Powinien mieć elastyczność wskazania repozytorium git lub rzeczywistych plików js (w Internecie lub lokalnie) w moim
dependency.json
pliku dla mniej znanych bibliotek (npm pozwala wskazać repozytorium git) - Powinien zminimalizować i umieścić wszystkie biblioteki w jednym pliku, takim jak ender - to jedyny plik js, który musiałbym umieścić w swoim
<script>
tagu po stronie klienta - Powinien mieć gotowe wsparcie dla CoffeeScript, takiego jak BoxJS 4 (teraz nie działa )
W przeglądarce powinienem móc użyć dowolnego wymaganego stylu:
var $ = require('jquery'); var _ = require('underscore');
Albo jeszcze lepiej, zrób styl headjs :
head.js(['jquery', 'underscore', 'mylib'], function($, _, mylib) { // executed when all libraries are loaded });
Jeśli nie ma takiego pojedynczego narzędzia, jaka jest najlepsza kombinacja narzędzi, np. Łańcuch narzędzi, który mogę połączyć za pomocą czegoś takiego jak volo (lub grunt )?
Przeszukałem już wszystkie narzędzia, z którymi się tu łączyłem, i spełniają one w najlepszym przypadku maksymalnie 3 moje wymagania. Dlatego nie pisz więcej o tych narzędziach. Przyjąłbym tylko odpowiedź, która dostarcza jednego narzędzia, które spełnia wszystkie 5 moich wymagań lub jeśli ktoś opublikuje konkretny przepływ pracy / skrypt / działający przykład łańcucha narzędzi wielu takich narzędzi, który również spełnia wszystkie moje wymagania. Dziękuję Ci.
źródło
require
składnię węzła do przeglądarki, rozważ przeglądarkę browserifyOdpowiedzi:
require.js robi wszystko, czego potrzebujesz.
Moja odpowiedź na to pytanie może ci pomóc
Przykład:
Hierarchia projektu aplikacji klienckiej:
main.js to miejsce, w którym inicjujesz aplikację kliencką i konfigurujesz require.js:
Zależności będą używały wtyczki cs poprzedzonej znakiem „cs!”. Wtyczka cs kompiluje plik coffeescript.
Gdy idziesz w prod można wstępnie opracować cały projekt z r.js .
Oto twoje wymagania:
Zarządzaj zależnościami po stronie klienta w formacie podobnym do pakietu npm.json lub komponentu bower.json. Różne, ale TAKIE DOBRE!
Powinienem mieć elastyczność wskazania repozytorium git lub rzeczywistych plików js (w sieci lub lokalnie) w moim pliku dependency.json dla mniej znanych bibliotek (npm wskażmy na repozytoria git). TAK
Powinien zminimalizować i umieścić wszystkie biblioteki w jednym pliku, takim jak ender - to jedyny plik js, który musiałbym umieścić w tagu skryptu po stronie klienta. TAK z r.js.
Powinien mieć po wyjęciu z pudełka obsługę skryptów kawowych, takich jak Box. TAK
W przeglądarce mogę użyć zarówno require style, jak i headjs. TAK
źródło
r.js
, czy mogę po prostu pobrać niezminifikowane wersje wszystkich bibliotek lub jak mam wybrać między bibliotekami zminifikowanymi i niezminifikowanymi?http://requirejs.org/ jest tym, którego szukasz, jak sądzę
źródło
Jako @ Guillaume86 myślę, że hem przyniesie ci najbliżej miejsca, w którym chcesz być.
W hem zależnościami zarządza się za pomocą kombinacji npm i hem. Użyj npm, aby jawnie zainstalować wszystkie zależności zewnętrzne projektów. Użyj rąbka, aby określić, które zależności (zarówno zewnętrzne, jak i lokalne) powinny być zszywane razem dla operacji po stronie klienta.
Stworzyłem szkielet tego projektu, więc możesz zobaczyć, jak to zadziała - możesz to zobaczyć na https://github.com/dsummersl/clientsidehem
Dodawanie zależności
Użyj npm, aby wyszukać określoną zależność, a następnie zmodyfikuj plik package.json, aby zapewnić śledzenie zależności w przyszłości. Następnie określ zależność aplikacji w slug.json.
Na przykład załóżmy, że chcesz dodać zależność skryptu kawy. Po prostu użyj npm, aby zainstalować zależność i zapisz ją w pliku package.json:
Załóżmy, że chcesz dołączyć własny moduł „bloomfilters”, a nie ma go w rejestrze npm. Możesz dodać go do swojego projektu w następujący sposób:
Moduły lokalne
Jeśli chcesz dołączyć własną kawę lub JavaScript, możesz to zrobić, dodając te pliki do aplikacji / folderu. Zauważ, że aby udostępnić swój skrypt za pomocą metody „require”, musisz uczynić go modułem CommonJS. To bardzo proste - zobacz dokumentację hem .
Pliki lokalne
Jeśli chcesz dołączyć kod inny niż CommonJS non „require”, możesz go połączyć, odwołując się do niestandardowego javascript lub coffeescript za pośrednictwem listy „libs” w slug.json.
CSS
Obwódka zszyje również twój CSS, jeśli chcesz. Zobacz dokumentację hem .
Budynek
Gdy masz już listę zależności, możesz użyć rąbka, aby zszyć je wszystkie razem.
Uwagi
Hem był przeznaczony do projektu spinejs - ale nie musisz go do tego używać. Zignoruj wszystkie dokumenty wspominające o kręgosłupie, jak chcesz ...
źródło
Cóż, jestem zaskoczony, że nikt jeszcze nie wspomniał o Browserify .
źródło
napa
czy nie? npmjs.org/package/napaJestem prawie pewien, że Hem spełnia twoje wymagania (używam personalnego widelca z dodatkowymi kompilatorami - jade i rysikiem - łatwo go dostosować do twoich potrzeb). Używa npm do zarządzania zależnościami.
źródło
Możesz rzucić okiem na Yeoman , który wykorzystuje kilka technik, aby pomóc Ci spełnić Twoje wymagania.
Wbudowana obsługa CoffeeScript, Compass i nie tylko. Działa z r.js ( RequireJS ), unittesting itp.
Jeśli chodzi o twoje wymagania:
Wszystkie funkcje:
źródło
Bower może odpowiadać Twoim potrzebom (1) i (2), a pozostałe wymagania. Z pliku readme:
Aby zainstalować pakiet:
źródło
Spójrz na menedżera pakietów Jam . Poniżej znajduje się opis ze strony głównej
Wydaje się bardzo podobny do npm w sposobie działania.
Zainstaluj pakiet jak poniżej
aktualizowanie pakietów poprzez wykonanie
Zoptymalizuj opakowania do produkcji
Zależności Jam można dodać w
package.json
pliku.Pełną dokumentację można znaleźć w dokumentacji Jam
źródło
Właśnie trafiłem na inject.js
Niektóre funkcje ze strony projektu :
źródło
Jest kilka opcji:
Komponent może również być interesujący, nie zarządza zależnościami jako takimi, ale pozwala na użycie pociętych wersji dużych bibliotek.
źródło
Używam hem z npm i chciałem dodać kilka dodatkowych korzyści, o których myślę, że do tej pory nie zostały omówione.
hem build
chyba że publikuję aplikację.cake
powyższej metody, możesz po prostu połączyć się bezpośrednio ze skryptem coffeescript z zależnych projektów.eco
(wbudowany Coffeescript) dla widoków i Stylus dla CSS i kompiluje to wszystko, wraz z Twoim Coffeescript, w jeden plik JS i jeden CSS.Oto podstawowa lista konfiguracji z aplikacją Spine, hem, coffeescript. Możesz zignorować części kręgosłupa. W rzeczywistości czasami używam
spine app
do konfigurowania struktury katalogów dla aplikacji innej niż Spine, a następnie edytuję,slug.json
aby zmienić na inną strukturę kompilacji.curl http://npmjs.org/install.sh | sh
w systemie * nix. Zakładam, że jest dostępny z linii poleceń.npm install -g hem
). Rozwój rozwinął się ostatnio, więc możesz chcieć pobrać go prosto z github ( https://github.com/spine/hem ), wyewidencjonować gałąź iwnpm install -g .
tym folderze.npm install -g spine.app
udostępni kręgosłup jako polecenie globalnespine app folder
sprawi, że projekt o nazwie Spineapp
wfolder
generując odpowiednią strukturę katalogów i kilka plików szkielet zacząć.cd
do folderów i edycjidependencies.json
dla potrzebnych bibliotek. Dodaj je, abyslug.json
rąbek wiedział, gdzie je znaleźć.npm link
dowolny z twoich lokalnych pakietów w fazie rozwoju donode_modules
i możesz dodać je doslug.json
hem (alboindex.js
do dołączenia bezpośrednio, alboindex.coffee
jeśli chcesz, aby hem go skompilował).npm install .
aby pobrać wszystkie wprowadzone zależności.Jeśli spojrzysz na domyślną konfigurację kręgosłupa, znajdziesz
app/lib/setup.coffee
tamrequire
wszystkie biblioteki, których potrzebujesz ze swoich zależności. Przykłady:W programie
index.coffee
wystarczyrequire lib/setup
załadować główny kontroler aplikacji. Ponadto potrzebujeszrequire
innych klas w tych innych kontrolerach. Możesz użyćspine controller something
lubspine model something
do generowania szablonów dla kontrolerów i modeli. Typowy kontroler Spine wygląda następująco, używając węzłówrequire
:Wygenerowana wartość domyślna
index.html
zwykle wystarcza do załadowania aplikacji, ale w razie potrzeby zmodyfikuj ją. Zgodnie z Twoimi wymaganiami pobiera tylko jedenjs
i jedencss
plik, którego nigdy nie musisz modyfikować.css
folderze. Jest dużo bardziej elastyczny niż CSS :)folder
uruchomhem server
uruchomić serwer Hem, i przejdź dolocalhost:9294
, aby zobaczyć swoją aplikację. (Jeśli zainstalowałeś hem globalnie.) Ma kilka ukrytych argumentów, na przykład--host 0.0.0.0
nasłuchuje na wszystkich portach.Jeszcze jedno: normalnie
hem server
aktualizuje się automatycznie, gdy aktualizujesz kod i zapisujesz pliki, co sprawia, że debugowanie jest bardzo proste. Uruchomieniehem build
skompiluje twoją aplikację do dwóch plikówapplication.js
, które są zminimalizowane iapplication.css
. Jeśli uruchomiszhem server
to później, użyje tych plików i nie będzie już aktualizować się automatycznie. Więc nie rób tego,hem build
dopóki faktycznie nie będziesz potrzebować zminimalizowanej wersji aplikacji do wdrożenia.Dodatkowe odniesienia: Spine.js & hem - pierwsze kroki
źródło
Oto rozwiązanie, które ma zupełnie inne podejście: spakuj wszystkie moduły do obiektu JSON i wymagaj modułów, odczytując i wykonując zawartość pliku bez dodatkowych żądań.
Implementacja demo w czystej postaci: http://strd6.github.io/editor/
https://github.com/STRd6/require/blob/master/main.coffee.md
STRd6 / require zależy od posiadania pakietu JSON dostępnego w czasie wykonywania.
require
Funkcja jest generowany dla tego pakietu. Pakiet zawiera wszystkie pliki, których może wymagać Twoja aplikacja. Żadne dalsze żądania http nie są wysyłane, ponieważ pakiet zawiera wszystkie zależności. Jest to tak blisko, jak tylko można uzyskać od stylu Node.js wymaganego na kliencie.Struktura pakietu jest następująca:
W przeciwieństwie do Node pakiet nie zna swojej nazwy zewnętrznej. To zależy od pakietu, w tym zależności, aby go nazwać. Zapewnia to całkowitą hermetyzację.
Biorąc pod uwagę całą tę konfigurację, oto funkcja, która ładuje plik z pakietu:
Ten kontekst zewnętrzny zapewnia pewną zmienną, do której moduły mają dostęp.
require
Funkcja jest narażona na modułach więc mogą wymagać inne moduły.Dodatkowe właściwości, takie jak odwołanie do obiektu globalnego i niektóre metadane, są również ujawniane.
Na koniec wykonujemy program w ramach modułu i w danym kontekście.
Ta odpowiedź będzie najbardziej pomocna dla tych, którzy chcą mieć synchroniczny styl node.js, wymagają instrukcji w przeglądarce i nie są zainteresowani rozwiązaniami do zdalnego ładowania skryptów.
źródło
Sprawdź cartero, jeśli używasz node / express na zapleczu.
źródło
Proponuję sprawdzić zestaw narzędzi dojo, który wydaje się spełniać większość Twoich wymagań. Nie jestem pewien co do CoffeeScript.
dojo współpracuje z modułami napisanymi w formacie Asynchronous Module Definition (AMD). Ma system kompilacji z pakietami i można je agregować w jednym lub kilku plikach (nazywanych warstwami). Najwyraźniej akceptuje repozytoria typu git, więcej szczegółów na temat systemu kompilacji tutaj:
http://dojotoolkit.org/documentation/tutorials/1.8/build/
Dla przypomnienia, wersja 1.9 beta spodziewana jest w przyszłym miesiącu.
źródło
Kolejny framework, który spełnia wszystkie moje ostatnio wydane kryteria: http://duojs.org/ (a także obsługuje traktowanie innych zasobów, takich jak CSS, jako zależności).
źródło
iniekcja zależności z ładowaniem asynchronicznym + browserify będzie kolejnym dobrym wyborem, w porównaniu do requirejs
asynchroniczne-zarządzanie-zależnościami-frontend-bez-AMD
źródło