FastComments.com Blog
Fri Jan 31 2025
...

FastComments TypeScript миграција завршена

! Овај чланак садржи технички жаргон

Шта је ново

У FastComments ценимо статички типизиране језике. Конкретније, волим приличне системе типова са брзим компајлерима. FastComments смо започели са последњим – или без компајлера. Иако смо у првој години имали две услуге написане у модерном Java, главна бекенд и фронтенд библиотеке биле су написане у CJS JS који ради на Node-у.

У припреми за следећу десетилетку развоја, мигрирали смо највеће FastComments компоненте у TypeScript.

Ово је укључивало миграцију преко 130 000 линија кода (100 000 од тих је бекенд) у 1441 датотеци, и исправку преко 8 000 грешака при компилацији.

woooooo
GitHub Screenshot

Ово је урађено током две недеље.

Замрзавање кода – Хвала

Желим да захвалим нашим корисницима што су толерисали могућа кашњења у исправкама багова или издању нових функција док смо имали двонедељно замрзавање кода да завршимо надоградњу. Хвала вам!

Поправљени багови

Како можете замислити, поправили смо неколико багова. Ови су углавном везани за детекцију спама и кеширање.

Критичне промене

  • Сви API крајњи тачке сада враћају статус: ‘failed’ уместо мешавине “failed” и “failure” као вредности статуса. “success” остаје непромењен.
  • Више нећемо подразумевано користити прву конфигурацију виџета ако нема подударања, већ ћемо вратити подразумевану системску конфигурацију.

Како је било?

Установили смо да, као и обично, многи алати у NPM екосистему који би помогли у овом задатку нису радили добро. Дакле, користили смо LLM-ове за генерисање скрипти које обављају велики део посла. На пример, интензивно смо користили JSDoc, тако да смо могли писати скрипте које узимају JSDoc и претварају их у TypeScript интерфејсе и тип дефиниције, и правилно анотирају аргументе функција и типове повратних вредности. Ове скрипте смо такође користили за миграцију са CJS на ESM, што је укључивало преписивање импорта, експорта и откривање уобичајених проблема у време извршавања као што је __dirname.

Да ли сам споменуо проблеме у време извршавања?

Како је TypeScript у 2025. години?

TypeScript је пријатан језик за писање пословне логике. Али, Java и даље има бољи DevEx. Ако Java, Go или Rust компајлирају, највероватније ће радити. Са TypeScript-ом, могу урадити нешто попут:

console.log(__dirname);

... и ово ће се компајлирати.

Али неће се извршити, са модерним ES модулима. Ваш IDE ће вам радосно чак аутокомплетирати __dirname, а затим ће се срушити у време извршавања. Осећа се као Spring DI, али још горе.

Можете такође урадити ствари попут:

context.someImportantMethodToCall;

Сада, ово је “изјава”. То је валидна “изјава”. На први поглед можете помислити да позивамо someImportantMethodToCall, али не! Мој IDE, барем, не упозорава на ово, нити компајлер. Код ће једноставно ништа не урадити (осим ако је someImportantMethodToCall геттер у класи, у ком случају се имплицитно позива...).

Поправка је:

context.someImportantMethodToCall();

Мислим да ово можете открити помоћу нечега попут eslint-а и правила “no side-effects”, али онда увлачите још један велики сет библиотека које треба одржавати, а онда eslint мора да парсира ваш цео код на свакој изградњи, алати су спори, и тако даље – без хвала. Утицај на продуктивност због спорих алата као што је eslint био је значајнији у мојој каријери у претходним пословима него продуктивност “појачања” које сам икада добио од малих ствари које eslint поправља/спречава са размаком итд. Постоје бржи алтернативи који се сада појављују, што је одлично.

TypeScript је заиста пријатан због језичких карактеристика попут Pick<User, 'username', 'email'>. Ово, у комбинацији са типским инференцијом, пружа начин да имате типово безбедне резултате упита из базе података за подскупове већих објеката без потребе да дефинишете класу за сваки облик. Pick је нешто што ме изненађује што Scala нема. Типски униони су такође врло корисни.

Инкрементални билдови такође раде прилично добро, повећали смо време изградње у CI-у за око 5‑10 секунди у просеку, за изградњу заједничке библиотеке, фронтенда и бекенда.

Временска линија развоја

За радознале, ево како је наш напредак изгледао:

  • Дан први: Нађено 5564 грешке у 362 датотеке.
  • Дан други: Нађено 4034 грешке у 239 датотеке.
  • Дан трећи: Нађено 3784 грешке у 191 датотеке.
  • Дан четврти: Нађено 2974 грешке у 169 датотеке.
  • Дан пети: Нађено 3000 грешака у 171 датотеке.
  • Дан шести: Нађено 2916 грешака у 165 датотеке.
  • Дан седми: Нађено 2618 грешака у 157 датотеке.
  • Дан осми: Нађено 2253 грешака у 109 датотеке.
  • Дан девети: Нађено 1605 грешака у 69 датотеке.
  • Дан десети: Нађено 686 грешака у 53 датотеке.
  • Дан 11: Тестови јединице бекенда пролазе.
  • Дан 12: Почетак миграције фронтенда, 3118 грешака.
  • Дан 13: Нађено 2172 грешке.
  • Дан 14: Нађено 1224 грешке.
  • Дан 15: Нађено 498 грешака.
  • Дан 16: Све грешке при компилацији су исправљене.
  • Дан 17: Објављено. E2E тестови пролазе. 30 минута недоступности због неочекиваних проблема у време извршавања. :)

Будућност

Урадили смо ово да подржимо развој за следећу десетилетку. Систем је сада довољно велики да је брже развијати са системом типова него без њега.

Такође можете очекивати да наша TypeScript библиотека на NPM-у унапредје, како је већ почела, пошто сада директно користимо ту библиотеку у нашем серверском и клијентском коду.

Ускоро ћемо такође објавити генерисане SDK-ове за клијенте директно из серверског кода, што је била примарна мотивација око овог напора.

У закључку

Као и свака велика издања, радује нас што смо успели да одвојимо време за оптимизацију, тестирање и правилно објављивање ових промена. Јавите нам испод ако откријете било какве проблеме.

Поздрав!