chore(core): replace microbundle with esbuild #1417
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
vivliostyle.js/core のビルドに microbundle を使用していたのを esbuild に変更しました。
ビルド結果のJSコードサイズが大きくなる問題を解決
変更の理由は、microbundleでのビルドはBebelでの変換が使われるために、ビルド結果のサイズが大きくなることがあるためです。Vivliostyleは古いブラウザはサポートしていないため、Babelでの変換は不要です。
とくにUnicode character class escape (
\p{Zs}
など)を使った正規表現がBabelによってこの機能を使用しない正規表現に変換されるのでとても大きくなっていました。例えば、/^[\s\p{Zs}\p{P}\p{Mn}]*[\p{L}\p{N}]\p{Mn}*(?:[\s\p{Zs}]*\p{P}\p{Mn}*)*/u
という73バイトの正規表現が、ビルド後のコードでは 24KB もある巨大な正規表現(元のサイズの330倍)に変換されていました。esbuildに変更したことで、ビルド結果の vivliostyle.js のサイズが 795832 から 594576 に縮小されました。
試行錯誤したこと
yarn dev
で esbuild の--watch
が終了してしまう問題にぶつかった。次のissueを見つけて、--watch=forever
を使うことで解決できることがわかった:ビルドができて実行すると「TypeError: Cannot read properties of undefined (reading '0')」というエラーが発生した。
packages/core/src/vivliostyle/matchers.ts の
NthFragmentMatcher.fragmentIndices
がundefined
になっていた。classのstatic fieldの初期化がうまくいっていないようだ。調べたところ、esbuild の v0.18.5 での次の変更が原因であることがわかった:
https://github.com/evanw/esbuild/releases/tag/v0.18.5
tsconfig.json に
"useDefineForClassFields": true
を追加することで解決した。esbuild は d.ts ファイルを生成しない。
tsc --emitDeclarationOnly
で d.ts ファイルを生成するようにした。