TypeScript — это больше не TypeScript...

BBetter Stack
Computing/SoftwareInternet Technology

Transcript

00:00:00TypeScript только что выпустил release candidate седьмой версии, и это будет та версия, где
00:00:04TypeScript — это уже не TypeScript. Если вы не следили за новостями, они работали над переписыванием
00:00:07компилятора TypeScript с самого TypeScript на Go, и, судя по всему, результаты в 10 раз быстрее.
00:00:12Они ожидают выпустить TypeScript 7 в следующем месяце, так что давайте разберем, что изменилось,
00:00:17насколько это быстро и есть ли критические изменения, о которых вам нужно знать перед установкой.
00:00:26Итак, если вы пропустили новости о переносе на Go, то они начали это около года назад,
00:00:29и суть в том, что они поняли: JavaScript никогда не был предназначен для тяжелой работы, связанной с процессором,
00:00:34которую выполняет проверка типов. Поэтому они начали переписывать его на Go, добившись раннего успеха. Они фактически начали с того,
00:00:39что переносили существующую реализацию TypeScript практически построчно, так что логика проверки типов
00:00:44была структурно идентичной и имела такое же поведение, и можно было даже заметить, что некоторые
00:00:48функции были почти идентичны, кроме самого языка. Я также почти уверен, что это было до того,
00:00:52как можно было просто натравить Claude на свою кодовую базу и сказать: “перенеси на любой язык, который хочешь”.
00:00:56Я смотрю на тебя, Bun. Результаты переноса говорят сами за себя. Здесь у меня
00:01:00репозиторий Playwright, и если я запущу проверку типов, используя старую версию TypeScript, мы увидим, что
00:01:04это занимает около шести секунд, и было пройдено 1400 файлов и полмиллиона строк
00:01:08кода. Если я теперь переключусь на release candidate, не меняя ничего, кроме этой команды,
00:01:12в сумме это заняло 0,87 секунды. Это серьезное улучшение. Он также нашел точно такое же количество
00:01:18ошибок, те же самые ошибки. Он прошел через те же файлы и все строки кода, так что он работает в точности
00:01:23так же, как TypeScript 6. Родной код на Go просто фундаментально быстрее, чем JavaScript для
00:01:27такой задачи, но это также позволяет им использовать параллелизм с общей памятью, так что там, где компилятор JavaScript
00:01:32был однопоточным, Go может распределять проверку типов по нескольким ядрам одновременно. В TypeScript
00:01:377 вы на самом деле можете принудительно сделать его однопоточным с помощью флага, возможно, вы занимаетесь отладкой
00:01:41или запускаете на машине с ограниченными ресурсами. И если я сделаю это в кодовой базе Playwright
00:01:46здесь с TypeScript 7, мы увидим, что в однопоточном режиме это занимает около двух секунд, что
00:01:50все равно в три раза быстрее, чем раньше. Говоря о запуске параллельно, они также открывают
00:01:54новый флаг checkers, который позволяет вам задать, сколько рабочих процессов проверки типов может работать параллельно,
00:01:58и по умолчанию это значение равно четырем. Увеличение этого числа может ускорить сборку в больших кодовых базах, если у вас
00:02:03много ядер процессора, но это будет стоить дополнительного использования памяти. Если я установлю checkers
00:02:08в значение 8 в этом репозитории Playwright, что вдвое больше значения по умолчанию, это действительно поможет сократить еще
00:02:12на треть время выполнения. Также есть новый флаг builders для распараллеливания сборок с project references, то есть сборки
00:02:16нескольких проектов одновременно. Этот флаг позволяет контролировать количество параллельных сборщиков, которые могут
00:02:20работать одновременно, и стоит отметить, что если вы объедините это с checkers, которые мы только что видели, давайте
00:02:24скажем, у вас по четыре каждого, это означает, что у вас может одновременно работать до 16 средств проверки типов. Теперь, помимо
00:02:29изменений в нативном коде и параллелизма, еще одним большим изменением в TypeScript 7 стал режим watch.
00:02:34Когда они переносили его на Go, это было немного сложнее, так как стандартная библиотека не предоставляет
00:02:38встроенных API для отслеживания файлов, а у сторонних библиотек, которые они пробовали, были проблемы с такими вещами, как
00:02:43стабильность, производительность и кроссплатформенная поддержка. Поэтому команда фактически посмотрела на сборщик Parcel,
00:02:47его файловый наблюдатель, который Microsoft на самом деле немного использует в VS Code, но поскольку он был на C++, им также
00:02:53пришлось перенести нужные им части на Go. Хорошая новость в том, что они сделали
00:02:57все, и это, кажется, работает очень гладко и лучше, чем раньше. Далее, поскольку это
00:03:01мажорное обновление версии, вы могли ожидать много критических изменений, особенно учитывая, что это большое
00:03:05переписывание, но я на самом деле не думаю, что их много, если вы обновляетесь с TypeScript 6 до 7. Если
00:03:10вы хотите перейти с 5 на 7, их будет довольно много, поэтому, похоже, они рекомендуют
00:03:14сначала перейти на 6, заставить всё работать, а затем переход на версию 7 не должен быть проблемой. Несколько
00:03:19больших изменений в TypeScript 6 заключались в удалении цели ES5, удалении baseUrl и отмене поддержки систем модулей
00:03:24AMD, UMD и SystemJS. Они также сделали strict равным true по умолчанию, заставили module по умолчанию использовать esnext,
00:03:31а target по умолчанию — текущая стабильная версия ECMAScript, непосредственно предшествующая esnext. Это было
00:03:36в основном избавление от прошлого и модернизация TypeScript, что мне очень нравится, так как
00:03:40иногда попытка поддерживать устаревшие проекты в каждой версии, которую вы делаете, может действительно замедлить
00:03:45прогресс инструмента. Просматривая остальную часть этого поста в блоге, кажется, что единственное новое
00:03:49функция или изменение, которое действительно касается самого языка TypeScript, — это то, что шаблонные литеральные
00:03:53типы теперь сохраняют кодовые точки Unicode. По сути, до TypeScript 7 TypeScript на самом деле разделял кодовые единицы UTF-16,
00:03:59поэтому он в итоге разбивал эмодзи пополам, и вы получали эти странные типы для заголовков
00:04:04и хвостов здесь. Однако в TypeScript 7 он на самом деле разделяет по целым кодовым точкам, то есть полным символам,
00:04:09так что теперь эмодзи сохраняются, и разделение происходит именно так, как вы бы ожидали. Я бы,
00:04:13честно говоря, был невероятно впечатлен, если кто-то из вас когда-либо сталкивался с этим за время использования TypeScript.
00:04:18В общем и целом, эти изменения должны сделать всё, что использует TypeScript, намного быстрее, как TypeScript
00:04:22в вашем редакторе, особенно для больших проектов. Стабильный релиз ожидается примерно через месяц,
00:04:27но стабильный программный API, то есть то, что авторы инструментов используют для создания надстроек поверх компилятора,
00:04:32появится в версии 7.1. Из-за этого также есть пакет совместимости, чтобы вы могли запускать
00:04:36TypeScript 6 и 7 бок о бок, не сталкиваясь с конфликтами. Дайте мне знать, что вы думаете обо всём
00:04:41этом, и мне интересно, чувствовали ли вы когда-нибудь, что TypeScript работает медленно. Дайте знать в
00:04:44комментариях. А пока вы там, подписывайтесь, и, как всегда, увидимся в следующем видео.

Key Takeaway

Переписывание компилятора TypeScript на Go в седьмой версии радикально повышает скорость проверки типов за счет параллельной обработки и нативной производительности, достигая десятикратного ускорения на крупных проектах.

Highlights

  • Переход компилятора TypeScript с JavaScript на Go обеспечивает десятикратное ускорение проверки типов.

  • В кодовой базе Playwright время проверки типов сократилось с 6 секунд на TypeScript 6 до 0,87 секунды на TypeScript 7.

  • В однопоточном режиме TypeScript 7 работает в 3 раза быстрее, чем предыдущие версии, за счет нативной реализации на Go.

  • Новые флаги checkers и builders позволяют параллельно распределять нагрузку по нескольким ядрам процессора.

  • Шаблонные литеральные типы в версии 7 теперь корректно обрабатывают символы Unicode, включая эмодзи, на уровне кодовых точек.

Timeline

Переход на Go и производительность

  • Компилятор TypeScript 7 переписан с JavaScript на Go для преодоления ограничений производительности CPU.
  • Реализация на Go позволяет задействовать параллелизм с общей памятью, используя многоядерность процессоров.
  • Проверка типов в проекте Playwright ускорилась с 6 секунд до 0,87 секунды.

Разработка TypeScript 7 сфокусирована на переходе с однопоточного JavaScript на нативный код Go. Новая архитектура позволяет распределять задачи по нескольким ядрам, сохраняя при этом идентичность логики и точность поиска ошибок. Даже при принудительном включении однопоточного режима производительность превышает показатели TypeScript 6 в три раза.

Параллелизация сборки и новые флаги

  • Флаг checkers определяет количество параллельных процессов проверки типов, по умолчанию устанавливая значение 4.
  • Флаг builders управляет распараллеливанием сборок при использовании project references.
  • Сочетание флагов checkers и builders позволяет задействовать до 16 рабочих процессов одновременно.

Инструментарий для масштабирования производительности расширен за счет флагов конфигурации. Увеличение числа рабочих процессов помогает сократить время сборки на мощных многоядерных системах, хотя это требует больше оперативной памяти. Настройка параметров позволяет тонко балансировать между скоростью выполнения и потреблением ресурсов системы.

Обновление режима watch и миграция

  • Файловый наблюдатель в режиме watch реализован на основе нативного кода Go для кроссплатформенной стабильности.
  • Миграция с TypeScript 5 на 7 рекомендуется через промежуточное обновление до версии 6.
  • Шаблонные литеральные типы теперь разделяются по целым символам Unicode вместо кодовых единиц UTF-16.

Система наблюдения за файлами была переработана для обеспечения стабильности и производительности. Мажорное обновление включает удаление устаревших целей (ES5, модули AMD/UMD) и модернизацию настроек по умолчанию (strict: true, esnext). Изменения в обработке Unicode исправляют ошибки при работе со строками, содержащими сложные символы и эмодзи.

Community Posts

No posts yet. Be the first to write about this video!

Write about this video