Zenn Dev Ryo Kawamata Articles 2038aa5eb42a5b
RecastでASTを探索してコードを動的に変換する
- URL: https://zenn.dev/ryo_kawamata/articles/2038aa5eb42a5b
- 日付: 2026-06-26
- Tier: Tier 3
- 要旨: JavaScriptのAST(抽象構文木)を操作するライブラリRecastの機能と使用例を解説した記事。Recastはparse・visit・printの3ステップでコードの探索・変換・再出力ができ、namedTypes(型チェック)・builders(Nodeの生成)・prettyPrint(整形出力)などの補助APIも提供する。デフォルトはEsprimaパーサーだが、TypeScriptやJSXパーサーへの切り替えも可能。大規模コードベースでのリファクタリング自動化ツール(let→const置換、console.log削除、型アノテーション追加など)を作成する際に実用的に機能する。
詳細
Recastの基本フロー
- parse(): コード文字列をASTに変換
- visit(): ASTを探索し、特定Nodeを見つけて改変する(visitIdentifier、visitVariableDeclaration等のメソッドを登録)
- print(): ASTをコード文字列に再変換(変更されていない部分は元の書式を保持)
補助API
- types.namedTypes: Node型のチェックに使用(例: n.CallExpression.check(node))
- types.builders: 新しいNodeを生成(例: b.callExpression(b.identifier(“add”), […]))
- prettyPrint(): コードを整形して出力(print()は元の書式を維持するが、prettyPrint()は整形する)
パーサーの切り替え
- デフォルト: Esprima JavaScript parser
- TypeScript対応:
import TSParser from "recast/parsers/typescript"を第2引数に指定
実装サンプル(テストコード付き)
- let→const置換: visitVariableDeclarationでnode.kindを変更
- console.log削除: visitExpressionStatementでpath.prune()呼び出し
- use strict追加: visitProgramでbody.unshift()を使用
- 型アノテーション追加: TypeScriptパーサーでvisitFunctionDeclaration、b.tsTypeAnnotation(b.tsStringKeyword())でアノテーション生成