Skip to content

Instantly share code, notes, and snippets.

@teppeis
Last active August 29, 2015 14:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save teppeis/16fcd61d30ee1df65944 to your computer and use it in GitHub Desktop.
Save teppeis/16fcd61d30ee1df65944 to your computer and use it in GitHub Desktop.
効率的なAST tool chainのご提案

JSer.info 200回記念イベントのLT資料

今朝起きたら、万が一のためLTを準備しておかなければいけないとTwitterに書いてあったので、実装してみました。

背景

ASTを使ったツールは世に溢れいているけど (eslint, jscs, power-assert, istanbul, uglify2...)、
それらのツールを複数組み合わせる場合、 grunt、gulp、browserify、いずれのビルドツールを使っても、Source => AST => Source の再変換が毎回起きて非効率。

参考: 多段SourceMapとASTの現状について話してきた | Web Scratch

一方、asterのような専用ツールもあるが、一般ユーザー(普通のWeb開発者)はそんなツールは使わないし、実際プラグインも増えてない。

そこで、gulp pluginで一般ユーザーが何も気にせず使えて、ASTを引き回せるような "Next logical step" を実装してみた。

課題

  • 本家Vinyl Fileが自由な運用なので、世の中では勝手プロパティ追加しまくりだった
    • サブクラスじゃなくて、モンキーパッチ&勝手にメソッド書き換えしちゃおう
    • 本家がObject.defineProperty()が中心の実装なので若干つらい。
  • 各プラグインが期待するパーサーの違い
    • esprima, recast, esparse, acorn... 微妙に違うAST JSON
    • パーサーに渡すオプション
    • パーサーのバージョン: ES6系のシンタックスに対するASTのスキーマは誰がどこで決めてるの?
  • 世の中のASTを使ったツールは、ソースを受け取るAPIしか持っていない。 ASTを渡せるAPIがないので、そのままではvinyl-ast対応プラグインが作れない。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment