1. RxJS 7.0 nareszcie opuszcza betę

RxJS 7.0 w wersji beta został opublikowany w kwietniu zeszłego roku. W tym tygodniu, po ponad 12 miesiącach oczekiwania, wreszcie doczekaliśmy się wydania stabilnej wersji. Jeśli macie wolne pół godziny, to zachęcam do oglądnięcia podlinkowanego poniżej przeglądu zmian od Bena Lesh (twórcy biblioteki). Materiał, co prawda krąży już w sieci prawie tak długo, jak sama wersja beta, ale nadal można uznać go za aktualny. Dla wszystkich zabieganych tradycyjnie przygotowaliśmy też telegraficzny skrót zmian.  

Zacznijmy od frazesu, który musi pojawić się przy okazji każdej większej biblioteki: wraz z nową wersją poprawiona została stabilność i inferowanie typów. Co ciekawe pojawiło się również kilka aliasów na istniejące funkcje, które mają lepiej opisywać ich działanie.

Oklepane formułki mamy za sobą, więc przejdźmy do konkretów. Chyba najciekawszą zmianą jest deprekacja metody .toPromise() i zastąpienie jej dwoma bardziej opisowymi metodami. Kto korzystając z toPromise() nigdy nie zapomniał, że strumień musi zostać zamknięty, niech pierwszy rzuci kamieniem (albo komentarzem na naszym Facebooku!). Nigdy więcej source$.pipe(take(1)).toPromise(). I jak tu się nie cieszyć?

const value_1 = await lastValueFrom(source$)
console.log(value_1);

const value_2 = await firstValueFrom(source$);
console.log(value_2);

Na tym rzecz jasna zmiany się nie kończą. Nowa wersja RxJS wspiera AsyncIterable we wszystkich miejscach, gdzie wspierany jest Promise i Observable.

async function* asyncTicker(message: string) {
	let n = 0;
	while(true) {
		await sleep(100);
		yield message + ‘ ‘ + n++;
	}
}

of('Async Iterables!')
	.pipe(concatMap(msg => asyncTicker(msg))
	.subscribe(it => console.log(it));

Oprócz tego dodana została funkcja animationFrames(), która w wygodny sposób pozwala zasubskrybować się na klatki animacji i zwraca czas, jaki upłynął od poprzedniej klatki. Są przypadki, kiedy pomoże to w wygodny sposób tworzyć animacje, ale naprawdę elegancki sposób to CSS animations i Web Animations API.

animationFrame()
    .subscribe(ellapsed => 
    	console.log(`Time since last frame: ${ellapsed}`)
    );

Jeśli chodzi o breaking changes to myślę, że warto wspomnieć tu o dwóch z nich. Pierwsza dotyczy metody toPromise(), która zwracać będzie od teraz T | undefined. Jest to zmiana tylko w typowaniu, bo funkcja ta chyba od zawsze zwracała undefined, jeśli strumień zakończył się bez wyemitowania wartości. Niemniej jednak naprawa błędów kompilacji może być deczko uciążliwa. Druga zmiana to usunięcie wsparcia dla subskrybcji z trzema funkcjami jako argumenty. Od teraz możliwe będzie albo podanie jednej funkcji albo obiektu, który zawierał będzie odpowiednio nazwane funkcje.

Źródła:

https://github.com/ReactiveX/rxjs/blob/master/CHANGELOG.md

2. Powstaje Rome Tools, Inc.

Powstanie Rome rok temu wzbudziło spore zainteresowanie, ale szczerze mówiąc od tego czasu niewiele o nim słyszałem. Jeśli ominęły Was zeszłoroczne newsy, to Rome jest narzędziem od twórcy Babela i Yarna, które obiecuje połączyć funkcjonalności wielu narzędzi przydatnych w pracy z JavaScript, HTML i CSS w jednym miejscu. Rome ma instalować dependencje, sprawdzać kod, uruchamiać testy i budować paczki z kodem, a wszystko to z poziomu jednego CLI. Jeśli jesteście zainteresowani zgłębianiem tematu, to został on dosyć dobrze opisany w poście ogłaszającym powstanie projektu, który znajdziecie tutaj. Dlaczego wracamy dziś do tego narzędzia? Twórcy Rome zebrali 4.5 miliona dolarów, otwierają własną firmę i obiecują zwiększyć liczbę osób zaangażowanych w projekt na pełny etat. Patrząc na to, że kilka tygodni temu informowaliśmy Was o powstaniu Deno Company, chyba możemy mówić tutaj o ciekawym trendzie wśród rozwiązań Open Sourcowych. Czas pokaże, czy takie podejście wyjdzie wszystkim na dobre, ale na razie trzymamy kciuki za obydwa projekty.

A co jeśli wszystkie drogi prowadzą do Rzymu i wszystkie inne narzędzia są z góry skazane na porażkę?

Źródła:

https://rome.tools/blog/announcing-rome-tools-inc/

3.V8 v9.1

W tym tygodniu dostaliśmy kolejną wersję V8, a wraz z nią jedną szczególnie przydatną funkcjonalność: top level async await. Czy tylko ja na nią czekałem?

// ---PREVIOUSLY---
await Promise.resolve(console.log('🎉'));
// → SyntaxError: await is only valid in async function
(async function() {
	await Promise.resolve(console.log('🎉'));
// → 🎉
}());

// ---NOW---
await Promise.resolve(console.log('🎉'));
// → 🎉

Rzecz jasna nie jedyna nowość, ale notatka od twórców V8 podlinkowana poniżej jest na tyle zwięzła, że chyba nie ma sensu próbować streszczać jej jeszcze bardziej.

Źródła:

https://v8.dev/blog/v8-release-91