【Rails】webpackerの構成を✅
クリスマスイブだからいいよね、年末だからいいよね、が積み重なってデブにならないか危惧している23期中野昴こと「クリスマスプレゼントをまだ買えていない」です。
今回は、jsがデバイスごとに挙動が違うというissuehttps://github.com/subaru-hello/Zeroken/issues/107の解決を試みた話になります。
まず「 javascript iphone 動かない」や「javascript 本番環境 キャッシュ」などでググったところ、webpackerに原因があるのでは?という記事が多く掲載されていました。
webpackerを理解するために取り急ぎwebpacker.ymlを学習していきたいと思います。
webpacker.ymlとは
メインディレクトリconfig配下にあるwebpacker gemを管理するymlファイル(ファイルの書き方ルールのひとつ)。
Webpackと呼ばれる、「それぞれが依存関係にあるjs,scss,imageなどのファイルををまとめて静的アセットにバンドルするモジュールバンドラー」をRuby on Railsで使うために作られたのがwebpacker。webpackerの構造を管理するのがwebpacker.yml
下記のような構造で書かれている
app/javascript:
# Only Webpack entry files here
└── application.js
└── application.css
└── src:
│ └── my_component.js
└── stylesheets:
│ └── my_styles.css
└── images:
└── logo.svg
production,development,test環境のそれぞれをconfig/webpacker.ymlひとつが下記のように管理している。
config
│ ...
├── webpack
│ ├── development.js
│ ├── environment.js
│ ├── production.js
│ └── test.js
└── webpacker.yml
そのため、ローカルで動いたjavascriptやcssが本番では機能しない、、といった不具合の原因はここにある可能性が高い。そう感じている。
webpacker.ymlの構造を紐解く
source_path: app/javascript
webpackによってバンドルされるソースファイルをまとめる場所。
ソースエントリーパスが配置されている。このjavascriptという記述はfrontendという名前に変えたりする事ができる。images,cssといった静的アセットを使わない場合にfrontendと名前を変更する事が多い。
source_entry_path: packs
application.js、いわゆるエントリーポイントをここに書く。
public_root_path: public
source_pathのファイルがバンドルされた結果が出力される場所。
public_output_path: packs
manifest.jsonが出力される場所。
cache_path: tmp/cache/webpacker
再コンパイルの処理速度を高めるために、キャッシュを保存しておく場所。
sorth_path内の.jsに変更が加えられた際に差分を更新する必要がある。この、差分のみ更新すればいいのか、それとも全て更新しなくてはならないのか、で処理速度が変わるわけで、「差分のみを更新する」ことを実現してくれるのが、cache_path
webpack_compile_output
compileされた結果を出力する場所
基本的にtrueにしておくのがベター。俺は絶対ミスしないという自信があるのであればfalseにしてもいい?
cassh_manifest
The
cache_manifest
setting simply tells Rails whether we want to maintain the parsed manifest in Ruby memory.
頻繁にソースコードを更新する場合、cash_manifestをfalseにしておくことがベターとされている。
extract_css
extract_css: false
is helpful for development; most applications will want to setextract_css: true
in production.
webpackerによってバンドルされたcssファイルをアウトプットする方法が二つあり、assets pipelineから取り除きたいcssファイルをapplication.cssとして切り出しておく方法と、ブラウザーがロードされたタイミングでjavascriptが動的にページへcssを挟み込む方法がある。
開発環境ではfalse,本番環境ではtrueにしておく事が好ましい。
compile
webpackがassetファイルをコンパイルするとき、
本番環境環境においてprecompileされて欲しい、もしくは開発環境でwebpack-dev-serverを実行して欲しい場合はfalse,
railsにshell comand実行してもらいたいときはtrueにしておく。
一言
webpacker.ymlを見れば「iphoneとmacでの動作が違う」問題が解消されるかと思ったんだけど分からずじまいだな、、
ps
技術面談をしてアドバイスをいただき、smoothscroll-polyfillをアプリに入れたら本issueは解決いたしました!明日はpolyfillについて記事を書きます。
https://rossta.net/blog/how-to-use-webpacker-yml.html
https://railsguides.jp/webpacker.html
https://railsguides.jp/webpacker.html#development環境でwebpackerを実行する