Aktualnie rozpakowuję moją aplikację Angular 2 za pomocą pakietu WebPack. Ciągle kręci szybkich cykli, więc zamiast dodawać opóźnień do naszego procesu ładowania budować i aplikacji, chcemy obejmować rzadko zmieniających kątowa 2 UMD CDN przygotowane zestawy, np:Aplikacja Bundle Angular 2 przy użyciu pakietów UMD (nie buduje pakietu dostawców)
<script src="https://npmcdn.com/@angular/[email protected]/bundles/core.umd.min.js"></script>
<script src="https://npmcdn.com/@angular/[email protected]/bundles/common.umd.min.js"></script>
<script src="https://npmcdn.com/@angular/[email protected]/bundles/compiler.umd.min.js"></script>
- Kiedy tylko pozwolić WebPack robi to, pakiet działa dobrze, ale ma kilka MB, ponieważ nie wykorzystuje wstępnie przygotowanych pakietów ani nie rozdziela kodu Angular 2 "dostawcy".
- Kiedy używam Angular 2 WebPack Recommendations, np .:
plugins: [ new webpack.optimize.CommonsChunkPlugin("vendor", "vendor.bundle.js") ]
, mój pakiet aplikacji jest mały, ale ręcznie buduję osobny, unikalny pakiet 1MB zawierający większość struktury Angular 2 w każdej kompilacji. Ten plik zmienia nieznacznie każdą kompilację w zależności od mojej aplikacji i nie jest przenośny między wersjami moich aplikacji lub różnych aplikacji i nie ma zalet "CDN". Oczywiście muszę dołączyć ten plik do uruchomienia mojej aplikacji. - Gdy używam IgnorePlugin do filtrowania
@angular|rxjs
, np.plugins: [ new webpack.IgnorePlugin(/\@angular|rxjs/) ]
, wyklucza pliki dostawców, ale wstawia zakodowane na sztywno wyjątki/zgłasza błędy na górze mojego pakietu aplikacji. - Kiedy używam WebPack externals, np.
externals: ['@angular/core', ...
, Otrzymuję dane wyjściowefunction(module, exports) { module.exports = @angular/core; },
w pakiecie aplikacji, co oczywiście nie działa. Dokumentacja WebPack nie jest strasznie nieprzewidywalna, ale myślę, że być może będę w stanie podać albolibraryTarget
lub cytowaną funkcję rozstrzygania, która zaleciłaby WebPackowi kompilację podczas ładowania modułu. - Gdy całkowicie zrezygnuję z pakietu WebPack i używam pakowacza kompilatorów języka TypeScript (zgodnie z this guide, który używa pakietów UMD), otrzymuję wywołania
System.register()
odnoszące się do przestrzeni nazw NPM, których się spodziewałem, np.System.register("myapp/boot", ['@angular/core', ...
, ale nadal pracuję nad konfiguracją SystemJS, aby wywołać UMD. Na marginesie ten plik ma dodatkowe 25% rozmiaru w porównaniu do tego, co generuje WebPack. - Jeśli używam SystemJS jak w poprzednim elemencie, chcę, aby kompilacja ta występowała podczas kompilacji lub jako proces równoległy, a nie jako część składowania plików. Chyba SystemJS-Builder (zobacz powiązane pytania here i here) byłby sposób to zrobić? Być może spowoduje to również zmniejszenie rozmiarów plików zintegrowanych ze słowem kluczowym "bundler".
Jak mogę zbudować pakiet aplikacji, który nie jest zależny od unikalnie przepakowanego pakietu Angular 2?
Obecnie buduję na bazie RC3. Mój proces jest obecnie WebPack, jak wspomniano powyżej, ale chciałbym przejść do innego zestawu narzędzi, jeśli to ułatwia.
Przeprowadzając więcej badań, myślę, że wprowadził mnie w błąd termin "ładowarka" WebPack. Muszę użyć modułu ładującego i nie wygląda na to, że WebPack ma taki, który będzie na to pracował.
Aby przypisać przestrzenie nazw modułów pakunkowych UMD (i powiązać zależności), nie można ich załadować w znacznikach skryptu. Zamiast tego muszą one zostać poddane ewaluacji z danym kontekstem this
, aby działać jako odniesienie do modułu. Oznacza to, że nawet jeśli chcę, aby wszystkie były ładowane synchronicznie, nadal muszę skonfigurować coś innego, jak SystemJS, aby załadować je przez przewód, więc ich kontekst jest kontrolowany/pakowany.
Ten produkt jest w pobliżu tego, czego szukam. Korzysta z pakietów Angular 2 UMD, ale nie używa pakietu RxJs, chociaż wygląda na to, że łatwo go zmienić, jeśli chcę mieć całą bibliotekę RxJs.
Tak, mam to teraz działa z pakietami SystemJS, chociaż nadal używam 'router-przestarzałe', więc nie ma jeszcze komentarzy na ten temat, używając SystemJS-Builder. Czy tak to robisz? Wciąż jednak musisz zużywać pakiety UMD, kod SystemJS, który pokazałeś, tylko je konfiguruje. Możesz również zmapować je na globale i ręcznie odwzorować na globale w konfiguracji "Externals", która jest podobna do tej, którą aktualnie próbuję (używając require.js tylko dlatego, że jest mniejsza). – shannon
Chcesz porozmawiać na ten temat? – shannon
Pamiętaj, że regularnie aktualizuję moje odkrycia w powyższym pytaniu. Oczywiście udzielę odpowiedzi, jeśli znajdę odpowiednie rozwiązanie przed opublikowaniem. – shannon