2012-09-02 37 views
74

To może być głupie pytanie dla internetowych gości. Ale jestem nieco zdezorientowany. Teraz mam aplikację, w której używam kilku plików JavaScript do wykonywania różnych zadań. Teraz używam Javascript bundler do łączenia i minimalizowania wszystkich plików. Tak więc w czasie wykonywania będzie tylko jeden plik app.min.js. Teraz, Requirejs służy do ładowania modułów lub plików w czasie wykonywania. Tak więc pytanie brzmi, czy mam już wszystkie rzeczy w jednym pliku, to czy potrzebuję requirejs? A może scenariusz użycia, w którym mogę używać requirejs i/lub bundler?Kiedy używać Requirejs i kiedy używać dołączonego javascript?

Proszę dać mi znać, jeśli potrzebujesz więcej informacji.

+1

Nie rozumiem, dlaczego potrzebujesz obu. Czy myślisz, że tak? – nnnnnn

+2

To jest błąd. Kiedy używać czego? Lub po prostu wybrać? – kunjee

Odpowiedz

27

Jest to gorący problem sporny wśród wielu sprawnych programistów javascript. Wiele innych języków ma fazę "kompilacji", w której cały program jest pakowany do wdrożenia (pliki JAR firmy JBoss przychodzą na myśl). Programiści pochodzący z bardziej tradycyjnych środowisk często faworyzują to podejście.

W ostatnich latach zaobserwowano taki wzrost w Javie, że trudno jest wyliczyć najlepsze praktyki, ale ci, którzy doceniają bardziej funkcjonalny charakter Javascriptu, często preferują podejście do ładowania modułów (takie jak require.js).

Napisałem Frame.js, który działa podobnie do require.js, więc moje nastawienie jest skierowane na podejście modułu ładującego moduły.

Aby odpowiedzieć bezpośrednio na pytanie, tak, to jedno lub drugie.

Większość osób, które opowiadają się za pakowaniem skryptów w jeden plik, sądzi, że umożliwia większą kompresję, a zatem jest bardziej wydajna. Wierzę, że zalety efektywności pakowania są w większości przypadków pomijalne, ponieważ: (1) czasy ładowania modułów są rozłożone na całą sesję, (2) poszczególne moduły mogą być skompresowane do prawie tego samego odsetka, (3) poszczególne moduły mogą być buforowane przez oddzielnie serwer i routery oraz (4) ładowanie skryptów tylko wtedy, gdy są potrzebne, pozwala ostatecznie załadować mniej kodu dla niektórych użytkowników i ogólnie więcej kodu.

W dłuższej perspektywie, jeśli widzisz przewagę w dynamicznym ładowaniu skryptów, użyj go. Jeśli nie, spakuj swoje skrypty do jednego pliku.

+5

Chociaż rozumiem korzyści płynące z przechowywania plików osobno, myślę, że sprzedaż pakietowa zmniejsza również liczbę wymaganych połączeń HTTP. Ponieważ potokowanie w przeglądarkach i serwerach staje się szerzej dostępne, może to mieć mniejsze znaczenie, ale obecnie jest to dość poważna sprawa. –

+4

Koszt połączenia HTTP można szybko zamontować, jeśli aplikacja jest duża. W przypadku naszej aplikacji, gdy uruchamiamy ją w trybie rozpakowania i ładujemy każdy plik JS pojedynczo, załadowanie strony zajmuje mniej więcej 15-30 sekund. W trybie upakowanym trwa około jednej sekundy. –

+0

pojedynczy spakowany plik z pamięci podręcznej jest oczywiście znacznie szybszy niż pobieranie dziesiątek lub setek plików, z których nigdy nie można być pewnym, że zostały załadowane lub jak długo trwa ich załadowanie. dlatego lepiej zrzucić wszystko na klienta. w większości przypadków ten pojedynczy plik i tak nie przejdzie rozmiaru 1mb, prawdopodobnie znacznie mniej po minifikacji i gzipowaniu. więc jednoplikowe FTW. – vsync

46

Zasadniczo używaj tylko RequireJS w formularzu ładowania podczas programowania. Po ukończeniu witryny i przygotowaniu do wdrożenia, zminimalizuj kod. Zaletą jest to, że RequireJS dokładnie wie, jakie są twoje zależności, i dzięki temu może łatwo zminimalizować kod we właściwej kolejności. Oto co mówi na RequireJS website:

Po zakończeniu robi rozwoju i chcą wdrożyć swój kod dla użytkowników końcowych, można użyć optymalizator do łączenia plików JavaScriptu razem i minify go. W powyższym przykładzie może połączyć main.js i helper/util.js w jeden plik i zminimalizować wynik.

+4

Wiem, że to stara nitka, ale natknąłem się, ponieważ miałem podobne wątpliwości. Tak więc, pytanie uzupełniające, jeśli nie masz nic przeciwko - jeśli w końcu pakujemy wszystko do jednego pliku do wdrożenia, cała moja aplikacja ładuje się w jednym ujęciu zamiast fragmentarycznie (na żądanie). Czy to nie jest sprzeczne z AMD? –

+5

tak, w pewnym sensie. Ale AMD jest bardziej teoretyczne, ponieważ requirejs zajmuje się również kwestiami wydajności w świecie rzeczywistym. Ładowanie każdego modułu indywidualnie jest zdecydowanie czystsze i czystsze, ale zajmie to zawsze :) –

+1

Też postawię to pytanie, aby zobaczyć http://stackoverflow.com/questions/20515679/requirejs-to-bundle-or-not-to- pakiet/20518314? noredirect = 1 # 20518314. Być może punkt środkowy między tymi dwoma podejściami? –

11

To zależy od aplikacji. Jeśli tworzysz aplikację po stronie serwera z tylko skromnym javascript (mniej niż 100kb minified), a następnie przejdź do całkowitego pakowania, prawdopodobnie wszystko będzie dobrze.

Ale jeśli tworzysz aplikację javascript i masz w niej tonę kodu, twoje potrzeby będą inne.

Na przykład w mojej aplikacji pakuję wszystkie podstawowe pliki. Jest jQuery, podkreślenie, szkielet, moje główne pliki aplikacji, mój system logowania użytkownika, mój układ układu, moje powiadomienia i system czatu, wszystkie są częścią mojego dużego początkowego pliku.

Ale mam także wiele innych modułów, które nie są częścią początkowego pakietu, który jest ładowany po nich.

Fora, wiki, wysiwyg, selektor kolorów, drag/drop, kalendarz i niektóre pliki animacji są częścią drugiej kategorii. Musisz podejmować uzasadnione decyzje dotyczące tego, co jest powszechnie używane i potrzebne od razu, a co może być opóźnione.

Jeśli wszystko umieściłem od razu, mogę uzyskać ponad megę javascriptu, co byłoby szalone i początkowo spowolniłoby rozruch.

Druga kategoria rozpoczyna pobieranie po initSuccess zdarzeń z początkowego pliku.

Ale druga kategoria jest bardziej inteligentna niż pierwsza, ponieważ ładuje to, co jest ważniejsze. Na przykład, jeśli patrzysz na wiki, to załaduje wiki zanim załaduje próbnik kolorów.

Powiązane problemy