Webpacker でやっていけるか!? Frontend on Rails
2018-05-22 Tue.
2018/05/23 追記
entry 作る箇所だけ小さく別ライブラリにしました。 euxn23/webpacker-entry
はじめに
この内容は meguro.es#15 での発表を元に内容を整理したものです。
リポジトリ: euxn23/webpacker-pure-config
スライド: slideshare
Rails で JS つらかった問題
- 標準設定で ES6 が使えない
- JS ライブラリの gem 移植 hoge-rails の本体追従が遅い
- gem 経由でインストールされる JS / CSS ライブラリ
- Sprockets という独自のモジュールバンドラ
Webpacker の誕生
- Rails 5.1 で標準搭載
- Webpacker を Rails に合わせて使えるように作られた Ruby / JS ライブラリ
- 隠蔽されたゼロコンフィグの Webpack
- npm エコシステムベースのビルドフローが使える
- Rails 向けの View Helper
普通の JS 開発ができる!!
本当に?
- 環境変数で分岐するモジュール(Undocumented)
- 独自の config 記法
- webpack v4 への未追従
Webpacker makes it easy to use the JavaScript pre-processor and bundler webpack 3.x.x+ to manage application-like JavaScript in Rails.
何がつらいか
- 独自の設定構文を覚える必要がある
- 既存の webpack.config をそのまま使えない
- Undocumented な挙動
- Webpack 本体への追従の遅さ
webpacker.js 危険なのでは?
脱 webpacker.js
config の要件
- ruby 側の webpacker のデフォルト設定で動くようにする
- JS の配置ディレクトリ(public/packs or public/packs-test)
- キャッシュ回避のためのハッシュ(Rails の作法)
- ManifestPlugin ベースの key-value の entry 設定
{ [relativePath]: absolutePath }
実装
煩雑
ライブラリ化
特徴
- webpack 準拠の config で実装
- 公式 Docs 準拠に読み書き可能
- 暗黙的な NODE_ENV 依存無し(環境別に提供)
- Config Object が export されるだけなので Rest Spread で拡張可能
- Rails / webpacker.yml 依存無し(ゼロコンフィグ)
Q. Webpack に追従できるの?
A. 独自機能とかないのでまあ、がんばります(がんばりましょう)(一緒にメンテしてください)
Other Works
2024-05-11 Sat.
Powerfully Typed TypeScript
- TSKaigi 2024
2024-05-10 Fri.
pnpm の node_modules を探検して理解しよう
- ドワンゴ教育サービス開発者ブログ
2024-03-17 Sun.
neverthrow で局所的に Result 型を使い、 try-catch より安全に記述する
- Zenn
2023-12-20 Wed.
レガシーブラウザ向けのビルドオプションを剪定する
- ドワンゴ教育サービス開発者ブログ
2023-05-26 Fri.
Next.js で dynamic import を使い Client だけで動かす Component を実現する
- Zenn
2023-05-02 Tue.
Node.js でファイル名から拡張子を取り除く/取り出すために path.parse を使う
- Zenn
2023-02-27 Mon.
WSL2 で外部からアクセス可能にするために bridge mode を有効にする
- Zenn
2023-01-26 Thu.
init.vim & dein から init.lua & lazy.nvim へ、シンプル設定で移行した
- Zenn
2023-01-13 Fri.
kindle の本をブクログ形式の csv でエクスポートする@2023初春
- Zenn
2023-01-10 Tue.
自宅サーバの移設に際して docker から nerdctl に移行した
- Zenn
2023-01-10 Tue.
自宅サーバを rootless に移行した際のトラブル対応
- Zenn
2021-11-11 Thu.
並列実行した Promise で throw されても全てハンドルしたいときの方法(allSettled, finally, etc...)
- Zenn