2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

webpackerを高速化した話

Last updated at Posted at 2020-01-15

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にする

最終的に行き着いたのがこれ

deploy.rb

...

# 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/railsrequire 'capistrano/rails/assets' するときによしなにしてくれていた。いや、webpackerもよしなにしろよ!!!

あと、今の所副作用はないけど、webpackの挙動全然知らないマンなので、このやり方まずいですよ!って感じだったら教えてください

結論

誰か脱webpackerしやすいライブラリをくれ!!!(懇願

2
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?