В системе сборки Esbuild обработка TypeScript реализована через
встроенные загрузчики, которые определяют, как именно интерпретируется
файл на этапе трансформации. Лоадеры ts и tsx
отвечают за разные сценарии компиляции TypeScript-кода, различаясь
поддержкой JSX-синтаксиса и внутренними правилами парсинга.
Каждый входной файл в Esbuild обрабатывается в соответствии с типом
загрузчика (loader). Загрузчик определяет:
Для TypeScript используются два основных варианта:
ts — чистый TypeScript без JSX;tsx — TypeScript с поддержкой JSX.Разделение обусловлено тем, что JSX требует отдельного этапа разбора, отличающегося от стандартного TypeScript-парсинга.
ts:
обработка чистого TypeScriptЗагрузчик ts применяется к файлам .ts, в
которых отсутствует JSX-разметка.
При использовании loader: 'ts' Esbuild выполняет
следующие шаги:
interface, type, enum в
зависимости от режима компиляции).function sum(a: number, b: number): number {
return a + b;
}
const value: string = "test";
function sum(a, b) {
return a + b;
}
const value = "test";
Типизация полностью удаляется, при этом логика кода остаётся неизменной.
tsx:
обработка TypeScript с JSXЗагрузчик tsx предназначен для файлов .tsx,
содержащих JSX-выражения. Он расширяет возможности ts
дополнительным этапом разбора JSX-дерева.
При активации loader: 'tsx' Esbuild:
ts-лоадеру;automatic,
transform).type Props = {
title: string;
};
const Component = ({ title }: Props) => {
return <h1>{title}</h1>;
};
const Component = ({ title }) => {
return React.createElement("h1", null, title);
};
ts и
tsxОсновное различие заключается не в обработке TypeScript, а в наличии JSX-синтаксиса.
| Характеристика | ts |
tsx |
|---|---|---|
| Поддержка TypeScript | да | да |
| Поддержка JSX | нет | да |
| Основное назначение | бизнес-логика, утилиты | React-компоненты, UI |
| Результат трансформации JSX | отсутствует | React/JSX runtime |
Использование неправильного загрузчика приводит к ошибкам парсинга,
особенно при наличии символа <, который в
ts интерпретируется как начало generic-типа.
tsx-файлахEsbuild поддерживает два основных режима трансформации JSX:
В этом режиме JSX преобразуется без явного использования
React.createElement.
const App = () => <div>Hello</div>;
Результат:
import { jsx as _jsx } from "react/jsx-runtime";
const App = () => _jsx("div", { children: "Hello" });
Используется при старой модели React.
const App = () => <div>Hello</div>;
Результат:
const App = () => React.createElement("div", null, "Hello");
Выбор режима определяется настройкой jsx в конфигурации
сборки.
Esbuild не выполняет полноценную типовую проверку TypeScript. Работа
ts и tsx ограничивается трансформацией
синтаксиса.
Не обрабатываются:
tsc-пайплайна.При этом учитываются некоторые опции tsconfig.json,
влияющие на трансформацию:
target — определяет версию ECMAScript;jsx — задаёт стратегию JSX-трансформации;module — формат модулей;jsxImportSource — источник JSX runtime.Esbuild определяет загрузчик на основе расширения файла:
.ts → ts.tsx → tsxПри явном указании loader в конфигурации приоритет имеет пользовательская настройка:
loader: {
".ts": "ts",
".tsx": "tsx"
}
.tsx;.ts, если отсутствует JSX;.ts приводит к ошибкам парсинга.Несмотря на высокую скорость, оба загрузчика имеют функциональные ограничения:
Esbuild не выполняет проверку типов. Ошибки вроде:
const a: number = "string";
не вызывают остановку сборки.
Частично поддерживаются:
react/jsx-runtime
или React.createElement).Разделение ts и tsx позволяет
оптимизировать пайплайн:
ts обрабатывается быстрее за счёт отсутствия
JSX-парсинга;tsx требует дополнительного AST-анализа JSX-узлов;На больших проектах разница становится заметной при массовой обработке UI-компонентов.
Используется ts:
Используется tsx:
ts к JSX-файлам;tsx для файлов без JSX в больших проектах
(не критично, но менее оптимально);jsx-настроек с
React-версией.Загрузчики ts и tsx могут модифицироваться
через плагины:
onLoad;Плагины могут переопределять поведение загрузчика, например:
Ошибки парсинга различаются в зависимости от загрузчика:
tstsx<T> vs
<div>).Типичная проблема:
const x = <T>(value: T) => value;
Интерпретируется как JSX, если контекст неясен, что требует корректного выбора загрузчика или синтаксического уточнения.
tsx;