webpackerの高速化をしようと色々試したら、灯台下暗しだったひとのお話。
環境
rails5.2.3
rails/webpacker v4.2.2
capistrano v3.x
あらまし
デプロイがクッッッッッッソ遅い
デプロイ1回につきアセットのビルドに早くても200秒程度かかる。キレそう。
まあ待てないこともないけど結構辛い
とくにjs関係ないfixのデプロイに数分待たされるのはかなりしんどい
1) sourcemapをオフ
webpackのsourcemapを作ってる時間って割と長い。
自分の場合、200秒のデプロイ時間のうち、100秒くらいはsourcemapの作成に取られてた
高速化の手段としては有効だと思うけど、sourcemap消したくなかったので今回はパス
あとwebpackerでこの設定いじるのはなかなかめんどくさいので、webpackerマンは覚悟した方がいい
2) SplitChunksPluginでよしなに
webpackの便利機能にSplitChunksPluginっていうのがある。詳しくは知らんけど。
アプリケーションとライブラリでチャンクを分けるとかするといいらしいって先輩が言ってた
しかしwebpackerでこの設定いじるのなかなかめんどくさいんだよなぁ(2回目)、ということでパス
誰か脱webpackerしやすいライブラリをつくってくれ〜〜〜
3) public_output_pathをsharedにする
最終的に行き着いたのがこれ
...
# Default value for linked_dirs is []
# public_output_pathに指定しているディレクトリを追加(今回は"public/packs"になってる)
append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system", "public/packs"
...
capistranoだと、linked_dirsを設定するとそのディレクトリがsharedになる(=バージョンに関わらず共通のディレクトリになる)のだが、そこにpublic_output_pathを追加していなかった。要はwebpackの結果を毎回0から作り直していてた。(・ω<) てへぺろ☆
この設定をすると正しくキャッシュが効くようになったようで、3分はかかってたビルドが最短30秒くらいで済むようになった
ここからは余談。
いま扱っているプロジェクト、実は脱Sprocketsもできてないのだが、デプロイ時にSprocketsはキャッシュっぽい挙動をしてるのに、webpackerはしていない、もしかしてwebpackerキャッシュしてないのでは?と気づいたことからこの策が浮上した。
ちなみにSprocketsのキャッシュ先はデフォルトのpublic/assets以下なのだが、これをlinked_dirsに入れた覚えはない。じゃあどこで?と調べて見ると、capistrano/railsで require 'capistrano/rails/assets'
するときによしなにしてくれていた。いや、webpackerもよしなにしろよ!!!
あと、今の所副作用はないけど、webpackの挙動全然知らないマンなので、このやり方まずいですよ!って感じだったら教えてください
結論
誰か脱webpackerしやすいライブラリをくれ!!!(懇願