Rails 5.1 的一大賣點是支援 Webpack (透過 webpacker gem).

以前曾經在某專案嘗試把 webpack 融入一個 rails 4.2 專案, 支援 react, redux, es6, … 後來順利完成了, 當時整理了一堆相關設定等等, 但一直都沒機會再次使用到這些資料…

看到 webpacker 的時候真的是感動落淚! 其實這個東西可以用在 rails 4.2 以上的專案, 所以這邊來嘗試一下能不能產生一個完全不需要 sprockets 的 rails 專案吧.

首先我們要拿掉一堆東西:

$ gem install rails -v 5.1.0.rc1
$ rails new <app-name> --no-rc --webpack --skip-sprockets --skip-coffee --skip-javascript --skip-turbolinks

但是 app/assets 還是會有一些不想看到的東西, 把他們砍掉吧:

$ rm -rf app/assets

要開兩個 server (rails 和 webpack) 太麻煩了, 用 foreman 來管理吧.

在 Gemfile 加入 gem 'foreman', 建立一個 Procfile:

rails: bin/rails server
webpack: bin/webpack-dev-server

然後隨便建立一個 controller, 把 root 指過去吧:

$ rails generate controller home --no-assets --no-helper

修改 app/views/layouts/application.html.erb:

<%= stylesheet_pack_tag 'application' %>
<%= javascript_pack_tag 'application' %>

這個時候系統會跟你說找不到 application.css.

webpacker 提供的設定中, 會將你任何在 [filename].js 中 require/import 的 css 檔案, 全部抽出來變成 [filename].css (透過 extract-text-webpack-plugin 達成), 所以只要在 application.js 中隨便 require/import 一個 css 即可:

import './application.css'
// 或者
require('./application.css')

這樣就沒問題了?

React

webpacker 已經有寫好的設定了, 只要這樣:

# 建立專案時
$ rails new <app_name> --webpack=react
# 之後追加
$ rails webpacker:install:react

Action Cable

用 yarn 安裝:

$ yarn add actioncable

在 javascript 中使用它:

import ActionCable from 'actioncable'

let cable = ActionCable.createConsumer()

jQuery

跟 Action Cable 差不多…

$ yarn add jquery
import $ from 'jquery'

跟 Action Cable 差不多…

$ yarn add turbolinks
import Turbolinks from 'turbolinks'
Turbolinks.start()

Bootstrap

這個比較麻煩一點.

$ yarn add bootstrap

如果直接這樣的話, 會出現 jQuery is not defined (即使有 import jQuery from 'jquery'):

import 'bootstrap'

需要在 config/webpack/shared.js plugins 的陣列中加入:

new webpack.ProvidePlugin({ $: 'jquery', jQuery: 'jquery' })

這有點像是做這件事:

window.$ = require('jquery')
window.jQuery = require('jquery')

css 的部分:

import 'bootstrap/dist/css/bootstrap'

To be continued?