rails + webpacker + foreman

2018-06-05

rails, ruby, webpacker, foreman

公式

このページででてくるキーワードの公式ページです

rails
webpacker
foreman
jquery
yarn
ruby

それっぽいところを探してみましたが間違ってたらコメントください

webpackerを使う

webpacker(https://github.com/rails/webpacker) は webpackのヘルパーです
railsでwebpack を使いやすくしてくれます
既に々なところで解説されていますが、私も使ってみたので残しておきます

使用動機

なんか流行ってるようなので一応かじっておこう
使用してる現場もチラホラ

私はjQueryぐらいしか使わないんですけど

環境

手持ちの mac と windows 両方の環境で試してみました
すでにあるプロジェクトに導入するときのほうがつまづきそうなので
rails new した後にwebpackerを導入する感じで実施してます

mac

1
2
3
4
$ sw_vers
ProductName:  Mac OS X
ProductVersion: 10.12.6
BuildVersion: 16G1314

windows

1
2
3
windows 10 Home 64bit
vagrant 2.0.2
CentOS Linux release 7.5.1804 (Core)

公式によると

1
2
3
4
5
Prerequisites
  Ruby 2.2+
  Rails 4.2+
  Node.js 6.0.0+
  Yarn 0.25.2+

らしいので、これ以上になる環境を作っておきます
私の場合は

mac

1
2
3
4
5
6
7
8
$ ruby -v
ruby 2.4.3p205 (2017-12-14 revision 61247) [x86_64-darwin16]
$ rails -v
Rails 5.2.0
$ yarn -v
1.7.0
$ node -v
v10.3.0

windows(CentOS7)

1
2
3
4
5
6
7
8
$ ruby -v
ruby 2.4.3p205 (2017-12-14 revision 61247) [x86_64-linux]
$ bin/rails -v
Rails 5.1.6
$ yarn -v
1.7.0
$ node -v
v6.14.2

上記の環境で以下手順が動作することを確認しています

やってみる

プロジェクト作成

1
2
$ rails new sample
$ cd sample

webpackerインストール

gem 'webpacker' をGemfileに追加して

1
2
$ bin/bundle
$ bin/rails webpacker:install

jQueryのインストール

$ yarn add jquery

app/views/layouts/application.html.erb を変更

<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
<%= javascript_pack_tag 'application' %> に置換

app/javascript/packs/application.js

以下を追加してjQueryのグローバル変数を使用可能にします
global.$ = global.jQuery = require('jquery');

なんか適当に画面追加

1
2
$ bin/rails g scaffold user name:string
$ bin/rails db:migrate

なんかしらjQueryの処理を追加

app/views/users/index.html.erb に

1
2
3
4
5
<script type="text/javascript">
  $(document).ready(function() {
    alert('foo').text());
  });
</script>

とか書いてみる

サーバー起動

1
2
$ bin/rails s -b 0.0.0.0 -p 3000
$ bin/webpack-dev-server # 別のコンソールで

実行

http://localhost:3000/users
foo ってアラートが出たら成功

foreman インストール

Gemfilegem 'foreman' を追加して
Rails.root/Procfile を作成し、以下のように記述します

1
2
rails: bin/rails s -b 0.0.0.0 -p 3000
webpack: bin/webpack-dev-server

サーバー起動[開発環境]

1
$ bin/bundle exec foreman start

サーバー起動[本番環境]

1
2
$ RAILS_ENV=production bundle exec rails assets:precompile
$ RAILS_ENV=production bundle exec rails webpacker:compile

補足

vagrantなどの仮想環境を使用している場合、webpack-dev-server用の
hostとport設定が必要なコトがあります
ブラウザのコンソール上に「通信できねぇ」的なエラーが出ている場合は
そこを疑ってみるのも
私のVagrantfileは

1
2
config.vm.network "forwarded_port", guest: 3000, host: 3000 # rails server 
config.vm.network "forwarded_port", guest: 8881, host: 8881 # webpack-dev-server

としていたので config/webpacker.yml を以下のように設定しました

1
2
3
host: 0.0.0.0
port: 8881
public: 0.0.0.0:8881

使ってみて

やってしまえば手順も手数も大したことないのですが、初めて設定した時は結構時間がかかりました
私のような小規模サイトで「jQuery使いたいだけ」だとまったくありがたみはないですね:thinking:
jQuery公式からダウンロードする方法で充分です

公式に用意されている React,Angular,Vue などを使用した大規模サイトだと恩恵が受けられるのでしょうか
常に最新版を使用するようなオプションもあるようです
本番環境で使い込むにはきっちりコストをかけて学習した方が良さそうですね

「JQuery依存からの脱却」は別にいいんですけど、フロントとの依存関係 というかスパゲッティ度はさらに加速したと感じます
なんでサーバーサイドでこんなもん管理しなきゃならんのだ?と元Flash開発者は思いました。

また、webpackerがなくても環境作れるようにはしておきたいですね
フロントとバックの分断はこれからもっと進んでいくでしょうし
そうなれば環境はもっと小さく個別に自由に作れるようになるんじゃないかな

と、おもった。

コメント

投稿する

投稿したコメントはご自身で削除できません

不適切なコメントと判断した場合は管理側で削除することがあります