Math.floor を使っていると webpack の minify で Error: Couldn’t find intersection が発生する

症状

Rails5.2 で ./bin/webpack 実行時に Error: Couldn't find intersection というエラーが発生する。

再度 ./bin/webpack を実行すると発生しなくなる。 tmp/cache/webpacker を削除すると再現する。

キャッシュが無い状態で ./bin/webpack もしくは rails assets:precompile 時に発生するため、開発環境では2回目のコンパイルでうまくいくのでスルーしてしまい、CIやデプロイ時にエラーになってしまう。

assets:precompile の時はログに Compilation failed: とだけ出力されるので webpack のフェーズでのエラーだと気づくのに時間がかかってしまった。

原因

https://github.com/babel/minify/issues/904

.babelrc の presets から minify を外すと再現しなくなるため、こちらの issue の通り、minify に問題があるようだった。

2019/11 時点で issue は対応されておらず、問題が発生する条件はいくつかあるようだが、Math.floor を使っていると発生する、ということに心当たりがあった。

解決?(応急処置)

minify が呼び出しているbuiltIns というプラグインで Math.floor の変形をしている。

https://babeljs.io/docs/en/babel-plugin-minify-builtins

ひとまず、.babelrc の presets で minify の builtIns を無効にすることでエラーは発生しなくなった。

["minify", {"builtIns": false }]