TypeScript 7 і порт на Go: хутчэйшая зборка, менш памяці і хуткі водгук у рэдактары
TypeScript 7 замяняе кампілятар на натыўны рухавік на Go: паралельная зборка, меншы расход памяці, новы моўны сервер і нюансы міграцыі, якія варта праверыць загадзя.
Крыніцы: TypeScript 7 Is Here — And It Changes Much More Than the Compiler
Кожны, хто вжо калькі гадзіны вікорыстоўвае TypeScript, знае гэты рытм. Напісаны код, рэдагарытар яго аналізуе якое-ткі час, TypeScript обрабоцвае праект, пасля запускаецца tsc, і зноў трэба чакаць. У вялікам монорэпазе гэта чаканне такое дзьвялготнае, што хватыць часу на тое, каб прынесці каву. Усё гэта не значыць, што інструмент паказвае слабыя якосты дызайну. Яго сістэма тыпаў і інструменты для працы з мовай сталі настолькі моцнымі, што можу распазнаваць вельмі вялікія кодавыя базы, і самэ гэта стало прычыной таго, што ён стаў такім цэнтральным у свеце JavaScript. Але гэтая моц была супакоўана платай: калі праекты расшыраліся, кампайлер і сервер мовы ставалі прычыной проблем з працэздатнасцю.
TypeScript 7.0 — гэта адаптаванне ад Microsoft, і галоўная особлівасць гэтага выдання заключаецца ў тым, што главныя змяны — не новыя аператары, ключавыя словы чы сінтаксічныя трыкі. Галоўная змяна — у самым двыжку. Кампайлер TypeScript раней быў напісан на самым TypeScript, што было прыемным рэкуррэнтным рашэннем, якое добра працавала, але гэта значыла, што кампайлер павінен быў функцыонаваць у модэлі рантайму JavaScript. У версіі 7 Microsoft перэнес кампайлер на мову Go, стварыўшы натыўную рэалізацыю, якая адпрацоўвае сучасную апаратуру і можлівасці паралелізма.
Гэтае трэба зрозумець, калі розглядаеце гэтае выдання. TypeScript 7 — гэта не столькі новая мова, сколькі новы двыжок для мовы, якую люды ужо вікорыстоўваюць, і гэтае параджэнне пояснюе практычна все іншае ў яго адносе.
Ціфры пра швальнасць
Абсалютныя показнікі ўскорэння станавяць дзесяць разоў. Тэсты Microsoft паказваюць, што цэлыя праекты зазвычай запускаюцца на 8–12 разоў быстрэй, залежна ад праекту, пры чым гэтыя тэсты адбываюцца на вялікіх рэальных кодавых базах, а не на сінтэтычных мікротэстах.
Час складання праекта нават не ўсё сама яскравая рэзультатка, адколі таксама прышвартовуецца і сервер мовы. У прыкладзе Microsoft, які выкарыстоўвае кодавую базу VS Code, час ачынення файла, які мітыў канфлікт, зменіўся з прыблізна 17,5 секунды да моменту паўтарэння канфлікту на менш чым 1,3 секунды. Гэта змінюе ўсё апыт работы, і у вялікіх рэпазітарыях гэта мае большое значэнне, чым скорыяе на калякія соткі мілісекунд складання праекта для практычнага выкарыстоўвання.
Выкарыстоўванне кожнага ядра
Сучасныя апараты маюць многа ядра, тады як tsc з історычных падзеў працаваў на аднам. TypeScript 7 значна лепшая ўсвойвае іх: парсаванне, перакананне на тыпы і генераванне коду можа вестыся паралельна, калі гэта можліва. Ён таксама додае калькі эксперыментальных настаўк:
--checkers
--builders
--singleThreaded
Першыя два параметра даюць большую контроль над тым, як дзеліцца паралельная праца, а --singleThreaded выключае паралелізм, калі гэта неабходна, напрыклад, пад час дэбагавання працы кампайляра або пад час працы ў обмежаных умовах.
Монорэпозітарыя можу отрымаць наібольшую выгоду. Уявіце сабе рэпазітарый з катэгорыяй apps:
apps/
web/
admin/
mobile/
і каталог пакетаў:
packages/
ui/
api/
config/
utils/
domain/
TypeScript выкарыстоўваецца для адваротнай выпатраны працы ў межах графа залежнасцяў. З версіяй 7 большая частка ціяў можа выконвацца адночасна. Таму справа не толькі ў тым, што кампайляр стаў быстрэй, а ў тым, што кампайляр нарэшце можа выкарыстоўваць апаратнае забезпечэння, на яком работае.
Памяць
Прыдатнасць — гэта не толькі час CPU. Большыя праекты на TypeScript можу захопіць калькі гігабайтаў RAM, особліва калі сервер мовы работае разам з рэдагувальнікам, прыгледчыкам, Docker і серверамі разработкі. Публікаваныя Microsoft тэсты паказваюць, што памяць зменшылася на 6%–26% у калькі большых праектаў:
- Bluesky: прыблізна на 26% менш
- VS Code: прыблізна на 18% менш
- tldraw: прыблізна на 15% менш
- Playwright: прыблізна на 11% менш
Хоць прышвартаванне можа стаць у дзесяць разоў быстрэйшым, гэта можа здавацца незначным, але кожны, хто бачыў, як памяць ноутбука знікае ў большым монарэпа, разумее ўжоцэнку гэтага.
Новы сэрвар языка
Большая частка прыемнасці TypeScript аднако не выходзіць з tsc. Яна выходзіць з самага рэдагара: автадаптаванне коду, показ вялікіх паведамленняў з інфармацыяй пра тыпы, перэход да вызначэння, перыяды кожнага апылання, перэназначэнне сімвола ў всіх месцах, паказ бягаў у самым кодзе і можлівасць выправлення ўсьго адразу пры кліку. Значны частака таго, што спрыяе сучаснаму развіццю JavaScript, залежыць ад гэтага.
У TypeScript 7 прыносіцца новы сэрвар языка, створаны на аснове Language Server Protocol, з вікорыстаннем натыўнай рэалізацыі і багатапрацоўнічасці. Команда продовжае расшырвае яго функцыянал: з’явіліся кодавыя лэнзы, падказкі, семантычнае выявленне, сортаванне імпортаў і адключэнне невыкарыстоўваных імпортаў, а таксама аўтоматычныя імпорты, можлівасць перэходу да вызначэння ў вачыні і рэдагаванне JSX у сувязі з падказкамі. Мета выходзіць за межы проста шырэйшага tsc: весь цыкл, ад напісання коду да паведамленняя пра бягы, стае шырэйшы, і гэта, можна сказаць, ёсць большым прызнакам успеху.
Дэтэрміністычны выхад пад паралельнасцю
Адна з змян не такая прыгожая, але тэхнічна ўсё ж прыемная. TypeScript выконвае больш заўсёды внутршнія аператыўнія задачы з тыпамі, сімволамі, аб’еднаннямі і дэкларацыямі. Калі калькুляторы працуюць адночасова, парадак стварэння внутршніх об’ектаў можа змініцца, што магае пацягнуць за сабой змяну ўнутршніх ID-ў і такім чынам змяніць парадак створаных дэкларацыяў.
TypeScript 7 справляецца з гэтым, дэтэрміністычна аранжуя элементы на адной засадзе ўместаўкі ўнутршніх об’ектаў, уместо таго, каб спакоювацца на парадку, у якім яны былі створаны. Возьмімо гэтую функцыю:
function foo(condition: boolean) {
return condition ? 100 : 500;
}
Ён можа даець такое заявленне:
export declare function foo(
condition: boolean
): 100 | 500;
І рэйтанг унія застаецца стабільным, незалежна ад таго, як будзе выканана паралельная праца. Большасць разрабоў не зазначыць гэтага, але самэ гэта являецца тым інжынерным рашэннем, якое робіць высокапаралельны кампайляр надзеяным.
Не версія з новымі фічамі
Усі, хто спакуўваюцца на ўсё гэта:
type NewSuperPower<T> = ...
Альбо большая кантыя новых можнасцей языка можа спачатку здавацца такой, што TypeScript 7 не ўсё такі вражаючы. Большая частка зусіль была спрамована на інфраструктуру, а не на новыя можнасці сістэмы тыпаў. Команда гады працавала над стварэнням аднойчыннага фундаменту для наступнага пакоління TypeScript, і цяпер ён існуе. План развіцці вказывае на працю над новымі функцыямі, практычнасцю, дальнейшым падвышэнням працэздатнасці і новым API-м компілятора пасля версіі 7.0. Цяжэйш заўважыць у выпуску канец пярэдней эры, чым пачатак новай.
Узгадкі для создатэў інструментаў
Сюды робіцца цікава сітуацыя для тых, хто стварае інструменты. TypeScript 7.0 не прыходзіць заўсёды з старым API-м компілятора, і команда спакушаецца, што 7.1 уведзе новы. Гэта важліва, таму што вялікая частка экасістэмы не проста запускае tsc. Лінтары, компіляторы фрэймворкаў, службы языка і інструменты для складання працуюць з TypeScript прамаўным спосабам.
Гэта адзін з прычын, чаму TypeScript 6 і 7 можаць зараз працаваць парадульна. Компанія Microsoft запрацавала @typescript/typescript6, каб спрыяць пераходу, тады праект можа застаўляць версію 6 для інструментаў, якім яшчэ патрэбны яе API, адночасна выкарыстоўваючы компіляр версіі 7. Апгрэйд компіляра не завжды такі просты, як зміна адной лініі:
{
"devDependencies": {
"typescript": "^7.0.0"
}
}
У большых экасыстэмах кампайляр являецца інфраструктурой, а інфраструктура мае залежнасці.
Іншыя абмежэннія стосуюцца фрэймворкаў і інструментаў, якія вбудовваюць TypeScript у своія сэрвісы компіляцыі або обслужвання мовы. Команда называе Vue, MDX, Astro, Svelte і Angular местамі, дзе падтрымка новай концэпцыі обслужвання мовы ўсё шчэ розвіваецца, і знову ж такі відсутнае стабільнае програмнае API ёсць прычыной гэтага. Звычныя прыклады аплікацый на React і TypeScript могу буць перэнесены без вялікіх проблем. Аднак інтэграцыя з складнымі фрэймворкамі, плагінамі кампайляра або плагінамі обслужвання мовы стварае большыя труднасці. Гэта вартая увагі практыка пры абнаўленні любога большага рэпазітарыя ў працэсе вырабоцтва.
TypeScript 6 як падступак
TypeScript 6 ніколі не быў проста версіяй, якая прадшлася 7. Ён быў спецыяльна створаны як мост. Некалькі старых опцый кампайляра былі пазначаны як застарэлыя і зовсім знятыя ў версіі 7, таму команда радзіць пракінуць іх перад пераходам. Вікорыстоўванне проміжнай версіі, як паказана ніжэй, лепшая, чым спрыяваць версіі 7 як самастоятэльнаму апдэйту:
TypeScript 5.x
↓
TypeScript 6
↓
TypeScript 7
Усе паведамленні пра прабытчыню, якія праект выдае пад TypeScript 6, заслуговаюць на увагу. Яны фактычна ўпамінанні пра міграцыю, прышлыя з будучыні.
Чаму важліва гэтая петля зворотнага зв’язку
TypeScript знікае пасля компіляцыі, таму развівачы фронтэнду рэдка калі вважаюць яго частынай часу працы прыкладнення. Але ён сільна вплывае на час працы пад час разработкі. Кожны раз, калі рэдактар праходзіць па такому цыклу:
type something
↓
autocomplete appears
↓
you navigate to a definition
↓
you rename a symbol
↓
you save
↓
CI runs
↓
the project gets type-checked
TypeScript участвуе ў кожным кроку, а яго роль расходзіцца ў меру розвітку прыкладнікаў. Затрымка у 100 мс не мае значэння, затрымка у 10 секунд — так, чаканне 30 секунд змінюе спосаб працы чалавека, а перагляд коду за дапамою інструменту CI прыблізна за пяць хвілін змінюе спосаб працы цэлага калектыва. Таму главная перадоўга TypeScript 7 — не у дзесяць разоў быстрэйшая компіляцыя, а меншы прымежак часу между напісаннем коду і выявленнем, чы робіцца ён правільна.
Пробаваць
Для новага праекту TypeScript 7 без сумнева варта рассмотрзець. Для вялікі ўжо праекта паслужыць болей адзячаны падход. Пачніце з установкі яго як завіснае праграма для разработкі:
npm install -D typescript@7
Потым адзейніце перакананне на тып без выдавання:
npx tsc --noEmit
і перагляньце рэзультаты, аналізуючы следуючыя аспекты:
- Памяткі кампайляра
- Застарэлая настройка
- Сумеснае працаванне інструментаў для складання
- Інтэграцыя з ESLint
- Інтэграцыя з фрэймворкамі
- Працаванне IDE
- Прыдатнасць CI
- Спрацоўванне памяці
У большым манорэпае зрабіце тэсты да і пасля, выкарыстоўваючы ўсё тое ж:
time npx tsc --build
І парабялейце рэзультат з ныямі версіяй TypeScript. Канечныя цыфры не павінны быць едыным акцэнтам. Гэта важна ўсё развіцце распрацоўшчыка.
Паўтарна будова фундаменту
TypeScript 7 выдзеляецца сярод інструментаў для фронтэнду таму, што команда не адбыла звычнага крока па ададзенні ўсё большых функцыяй да існуючай архітэктуры, а замест таго паўтарна пабудавала базу. Самам языку не была патрэбна пераробка; патрэбна была пераробка інфраструктуры. Часавы момент таксама ўзрозумімы: усё большыя праекты на JavaScript, распашчастыя монорэпозітарыі, API з абавесцю тыпаў паўсюды, розумнейшыя рэдактары, інструменты для кодавання на базе AI, якія жадаюць сэмантычных дадзеных, і распрацоўшчыкі, якія чакаюць майжэ мгновенных адказаў. Кампайляр, які будзе дастатнька шырокі для прыемлівання аплікацый 2015 года, не павінен неабходна справляцца з монорэпозітарыем 2026 года.
Простаючы, гэты вылік парадоксальна тым, што паўтарае, iшто стары дызайн быў эфектывны, але сучасныя програмы сталі занадта сложныя для яго. Узамест таго, каб абмовіцца ад сістэмы тыпаў, якая вялікім пласцовам спадабаецца распрацоўшчыкам, команда перабудавала тое, што працуе пад спадом. З гэтай прычыны гэты вылік мае большое значэнне, ніж можа здавацца з пераказанага спісу функцый. Гэта аднойчыны база для таго, каму стане TypeScript у будучыні, а таксама для шырэйшага tsc. Калі обяцаныя практычныя выгоды будуць перанесены ў весь экасыстэм, найцікавейшыя функцыі TypeScript можаць нават не з’явіцца ў версіі 7. Яны могуць стаць практычнымі толькі таму, што версія 7 дастае можлівасць быстро іх стварыць.
„Дзесяць разоў“ — гэта заглавле. Але за ім крыўдзіцца паралелізм, выконанне на роўні аперацыйной сістэмы, зменшанне вікорыстоўвання памяці, новы сервер мовы, дэтэрміністычны вылік компілятора і падготовка для будучых інструментаў. Для тых, хто адпавядае за вялікія прыкладнікі на TypeScript, гэта, можа, ценнейша, чым ўсё новыя інструменты для працы з тыпамі.