/ / Czy Scala.js kiedykolwiek wyprodukuje małe pakiety? - scala.js, scalajs-bundler

Czy Scala.js kiedykolwiek wyprodukuje małe pakiety? - scala.js, scalajs-bundler

Chociaż uwielbiam język Scala i projekt Scala.js, jestem trochę odrażający wielkością ostatecznego pakietu JS, nawet w trybie fullOptJS.

Moją pilną potrzebą jest stworzenie małej biblioteki do użytku w przeglądarce. > 150kb to duże pytanie, a prawdopodobnie porównywalne narzędzia, takie jak BuckleScript / ReasonML, obiecują szybkie wykonanie i małe pakiety.

Czy Scala.js zacznie produkować mniejsze pakiety w dającej się przewidzieć przyszłości?

Odpowiedzi:

7 dla odpowiedzi № 1

Krótka odpowiedź: mało prawdopodobne.

Podczas projektowania języka zawsze sąkompromisy do wykonania. W szczególności kompilacja krzyżowa języka w JavaScript i innym celu zwykle prowadzi do szeregu mniej lub bardziej sprzecznych celów. Na przykład tworzenie „idiomatycznego, czytelnego kodu JavaScript” często stoi w sprzeczności z tworzeniem „wysoce zoptymalizowanego kodu JavaScript”.

W tej przestrzeni głównymi celami projektowymi Scala.js są, według malejącej kolejności ważności:

  1. Interoperacyjność z JavaScript: możliwość wywoływania i bycia wywoływanym przez kod / biblioteki JavaScript.
  2. Zgodność ze Scala / JVM: chyba że używa się API specyficznych dla platformy (np. Wątków), ten sam kod Scala powinien się kompilować ze Scala / JVM i Scala.js i zachowywać się w ten sam sposób.
  3. Wydajność w czasie wykonywania: wynikowy kod powinien być tak szybki, jak to możliwe.
  4. Rozmiar kodu: wynikowy kod powinien być jak najmniejszy.

Chociaż rozmiar kodu jest zdecydowanie problemem, jak widać, jest dość nisko na liście głównych celów projektowych. Oznacza to, że problemy z rozmiarem kodu zwykle ustępują innym problemom na liście.

W szczególności często jest to sprzeczne z wymogiem kompatybilność ze Scala / JVM. Rzeczywiście, Scala ma dość dużą standardową bibliotekę, zwłaszcza zbiory, a wiele części tej biblioteki jest od siebie zależnych. Oznacza to, że jak tylko użyjesz, powiedzmy, Scali List, Twój kod potrzebuje znacznej części standardowej biblioteki kolekcji Scala. Ta część pakietu stdlib sprawia, że ​​większość nietrywialnych programów Scala.js waży ponad 150 KB.

Ponieważ powyższe warunki (cele projektu +zależności między bibliotekami kolekcji) raczej nie ulegną zmianie w dającej się przewidzieć przyszłości, równie mało prawdopodobne jest, aby Scala.js nagle wygenerował mniej kodu.

Mówiąc ściśle, jest możliwy napisać aplikację Scala.js produkującą tylko 10 KB lub nieco więcej. Ale aby to zrobić, musisz bardzo uważać, aby nigdy nie używać żadnych części biblioteki kolekcji. Powinieneś użyć js.Arrays, js.FunctionNs i js.Promises wszędzie zamiast Lists, => funkcje i Futurena przykład. W tym momencie Scala.js przestaje być Scala, dlatego lepiej byłoby użyć innego języka (np. BuckleScript).