esbuildを読む
swcなどと同様にbabelなどの代替手段として作られたもの、READMEに書いてある通り早い
Rustはわからないが、Goならある程度は読めるし、GoでJavascriptASTをいじりたいのでそのためにコードを読む。
FAQのところにいい質問がたくさん書いてあるので読んだ方が良さそう
基本的に関数のところに英語でコメントがあり、ある程度何がしているかは理解できそう
設計思想として
- 最大限の並列化
- 不必要な作業の回避
変換してさらにそれを読んでっていうのをなくしてる - ES6とCommonJSの両方の構文のサポート
- キャッシュの局所性を高めるためにできるだけ少ないfullASTにしてる
- インクリメンタルにコンパイルできる「ウォッチモード」を可能にするための構造
変更時の再実行するコードを最小限にしてる
ビルド過程にあるスキャンとコンパイルの処理はどちらもbundler.goに書いてあるっぽい
バンドルに含まれる必要のあるすべてのモジュールを見つける処理
スキャン
コンパイルの処理
コンパイルの中でリンカーを使用しており、リンカーはlinker.goに定義されている
コンパイルの中でリンカーを使用している箇所
linker.go
config.loaderによってパースするファイル形式を判定してる
CLIのflagの場合分けをここでやってる
APIの実装
The transform API call operates on a single string without access to a file system. This makes it ideal for use in environments without a file system (such as a browser) or as part of another tool chain.The transform API call operates on a single string without access to a file system. This makes it ideal for use in environments without a file system (such as a browser) or as part of another tool chain.
The build API call operates on one or more files in the file system. This allows the files to reference each other and be bundled together.
transformは任意の長さの文字列を変形してくれる、buildは一つまたは複数のファイルの中身を変形してくれる
js_parser.goにesbuildのパーサーが何をしているのかが書かれている
- Parse the source into an AST, create the scope tree, and declare symbols.
- Visit each node in the AST, bind identifiers to declared symbols, do constant folding, substitute compile-time variable definitions, and lower certain syntactic constructs as appropriate given the language target.
So many things have been put in so few passes because we want to minimize the number of full-tree passes to improve performance. However, we need to have at least two separate passes to handle variable hoisting. See the comment about scopesInOrder below for more information.
logger にtokenとかの情報が入ってる
printer -> linker -\
input -> parser -> scanner ---> compiler -> output
NewLexer -> newParser -> Parse -> parseFile -> maybeParseFile -> scanAllDependencies -> ScanBundle -> Compile -> buildImpl -> Build
Printer -> link -> Compile