ts-blank-spaceBloomberg заопенсорсили свой компилятор TS в JS. Это, конечно, сложно назвать компилятором - он очень быстро удаляет весь синтаксис TS и оставляет только нативный синтаксис JS.
Сам инструмент максимально простой: парсит AST, находит токены, связанные с TS и заменяет их на пробелы (поэтому
blank-space
в названии).
Зачем это вообще нужно.
Во первых, тул не проводит никакой тайп-чек, да и сам алгоритм простой, что делает его очень быстрым.
Во вторых, подстановка пробелов вместо конструкций TS позволяет гарантировать, что код никуда не съехал. Это лучше показать на примере
Оригинальный код
class Cat<T> {
public whiskers: number;
public tail: T;
constructor(count: number, tail: T) {
this.whiskers = count;
this.tail = tail;
}
}
throw Error();
Код, скомпилированный TS в esnext
class Cat {
whiskers;
tail;
constructor(count, tail) {
this.whiskers = count;
this.tail = tail;
}
}
throw Error();
Очень близко к оригиналу, но вы можете заметить что исчезли пустые строки. А это значит, что теперь stacktrace у ошибки будет указывать на другую строчку.
ts-blank-space
компилирует код в такой вариант
class Cat {
whiskers ;
tail ;
constructor(count , tail ) {
this.whiskers = count;
this.tail = tail;
}
}
throw Error();
Как видите, вся специфика TS была заменена на пробелы, все значимые токены остались на своих местах. Это позволяет упростить дебаг: stacktrace ошибок всегда указывает на ту же строчку и колонку, на которой стоит конструкция в оригинальном коде; также упрощается сбор сорс-мапов. Если код меняется, то сорсмапы, грубо говорят, содержат мапинг вида "вот была строчка 10 колонка 11, теперь она строчка 7, колона 8". С использованием
ts-blank-space
сорсмапы описываются 1 строчкой
//# sourceURL=cat.ts
Простота инструмента позволяет ему быть быстрым: по бенчмаркам блумберга, если не учитывать работу с AST для сорс-мапов, то ts-blank-space уступает лишь esbuild и
@swc/core
. Если же учитывать мапинг сорс-мапов, то
ts-blank-space
является самым быстрым тулом
Простота инструмента также и ограничивает его. Поддерживается на весь синтаксис TS:
- не поддерживаются неймспейсы (
declare namespace
поддерживается)
- не поддерживается специфика commonJS
- енамы (
declare enum
поддерживается)
- Свойства класса, объявляемые в конструкторе
constructor(public prop) {}
В общем, интересный тул. Для каких-то простых проектов можно спокойно использовать.
https://bloomberg.github.io/ts-blank-space/
#development #javascript #typescript #bloomberg #compiler