トランスパイラ

ある言語のソースコードを別の言語や同じ言語の異なるバージョンに変換するツール

ビルド言語

トランスパイラとは

トランスパイラ (Transpiler / Source-to-Source Compiler) は、TypeScript → JavaScript、JSX → JavaScript、ES2024 → ES5 のように、ソースコードを別の言語や同じ言語の古いバージョンに変換するツールである。コンパイラが高水準言語を機械語に変換するのに対し、トランスパイラは高水準言語を別の高水準言語に変換する。

主要なトランスパイラ

ツール 言語 変換 速度
tsc TypeScript TS → JS (型チェック付き) 遅い
Babel JavaScript ES2024 → ES5、JSX → JS 中程度
SWC Rust TS/JSX → JS 高速 (Babel の 20 倍)
esbuild Go TS/JSX → JS + バンドル 極めて高速

TypeScript のトランスパイル

// TypeScript (入力)
interface User { name: string; age: number; }
const greet = (user: User): string => `Hello, ${user.name}`;

// JavaScript (出力): 型情報が除去される
const greet = (user) => `Hello, ${user.name}`;

TypeScript の型情報はトランスパイル時に完全に除去される。実行時には存在しない。tsc は型チェックとトランスパイルの両方を行うが、SWC や esbuild は型チェックをスキップしてトランスパイルだけを高速に行う。

tsc vs SWC vs esbuild

tsc:     型チェック + トランスパイル (遅い、正確)
SWC:     トランスパイルのみ (高速、型チェックなし)
esbuild: トランスパイル + バンドル (極めて高速、型チェックなし)

推奨構成:
  CI: tsc --noEmit (型チェックのみ) + esbuild (トランスパイル + バンドル)
  開発: Vite (内部で esbuild を使用) + エディタの TypeScript LSP (型チェック)

Babel のポリフィル

Babel は構文の変換だけでなく、古いブラウザに存在しない API (Promise, Array.from) のポリフィルも提供する。@babel/preset-env でターゲットブラウザを指定し、必要なポリフィルだけを含める。

{
  "presets": [["@babel/preset-env", { "targets": "> 0.5%, not dead" }]]
}

JSX のトランスパイル

// JSX (入力)
const element = <Button onClick={handleClick}>Click me</Button>;

// JavaScript (出力): React.createElement に変換
const element = React.createElement(Button, { onClick: handleClick }, "Click me");

// React 17+ の新しい JSX Transform
import { jsx as _jsx } from "react/jsx-runtime";
const element = _jsx(Button, { onClick: handleClick, children: "Click me" });

Lambda でのトランスパイル

SAM の esbuild ビルドメソッドを使えば、TypeScript を直接デプロイできる。

実践的な知識は関連書籍でも得られる。

関連用語