esprima系統のtoolはどれも自分の仕事領域を綺麗に分割していて,
- esprima
- codeを受け取って, Parser API ASTを返す(tree)
- escodegen
- ASTを受け取って, 適切なcodeに変換する
- この時, codegenの職務の一つとして, codeの意味を変えない形での圧縮も可能 (spaceやindentの削除など)
- esmangle
- ASTを受け取って, 変数名の短縮, true / falseなどを!0 / !1に変換したりなどして圧縮したASTを返す
というふうになっている. esprimaはparseしたASTにloc optionを指定するとlocation informationを付けることができる. この時, escodegenはlocation informationを用いてsource mapを出力できるようになった.
これはどのように使えるかというと, 例えば, CoffeeScriptRedux projectでは以下の様な経路を通り, compileが行われる.
CoffeeScript code => [parser] => CoffeeScript AST (CSAST) => JS AST (Parser API AST) => [escodegen] => JS code
この時, CoffeeScriptRedux compilerは, CSAST => JSAST変換時に, CoffeeScriptでのlocation informationをJSASTにつけながら変換する. 結果, JSAST上に, CoffeeScriptのsource mapping情報が保存されており, escodegenによって自動的にCoffeeScriptへのsource mapを取得することができる.
そして今esmangleでは, 圧縮や書き換えを行った際に, 元々のlocation informationをきちんと残そうという風に計画している. これがうまくいくと,
CoffeeScript code => [parser] => CoffeeScript AST (CSAST) => JS AST (Parser API AST) => [esmangle] => Compressed JS AST => [escodegen] => JS code
という風にでき, この時, 最後までちゃんとCoffeeScriptのlocation informationがescodegenに行くので, 圧縮済みscriptのoriginal coffee scriptへのmappingが得られる.