文章

Ruby On Rails 6 中使用 Webpacker 管理 Javascipt 模块和相关的 CSS

Ruby On Rails 6 中使用 Webpacker 管理 Javascipt 模块和相关的 CSS

本文成文过久,请谨慎参考。

Ruby On Rails 6 相对 5 极好的一个变化就是默认使用了 Webpacker 模块做 Javascript 库管理,package.json 就像 Gemfile 一样,存储了相关的模块和依赖关系。使用 yarn 安装模块可是容易多了。

新建一个 Rails 6 工程,开始本文的 Webpacker 之旅。

1、新建一个资源,使用脚手架:

1
2
3
rails g scaffold Post title publish_date:date --no-scaffold-stylesheet

rails db:migrate

2、更改根路由:

1
root to: "posts#index"

这时执行 rails s 命令,启动应用后,是一个默认的帖子空列表页面,点击 “New Post” 按钮,表单的日期输入还是默认的日期选择框,我们将更改为更好看的更人性化的组件:flatpickr。

3、化腐朽为神奇

执行命令:

1
yarn add flatpickr

编辑 app\javascript\packs\application.js 文件,增加如下内容:

1
2
3
4
5
6
7
8
9
10
import flatpickr from "flatpickr"
require("flatpickr/dist/flatpickr.css")

document.addEventListener("turbolinks:load", () => {
  flatpickr("[data-behavior='flatpickr']", {
    altInput: true,
    altFormat: "F j, Y",
    dateFormat: "Y-m-d",
  })
})

Webpack 不光集成 Javascript,还可以集成相关的样式表,比如:require(“flatpickr/dist/flatpickr.css”),增加了对应的 helper 函数:stylesheet_pack_tag 和 javascript_pack_tag,我们在 application.html.erb 文件中会用到。

Post 的 _form.html.erb 文件,更改 publist_date 的输入方式:

1
<%= form.text_field :publish_date, data: { behavior: "flatpickr" } %>

application.html.erb 增加:

1
<%= stylesheet_pack_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>

完整的:

1
2
3
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= stylesheet_pack_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>

此时,刷新你的首页,看看是否达到预期。

更多例子:

4、使用 Bootstrap 及相关套件

执行命令:

1
yarn add bootstrap jquery popper.js

设置 Webpack,编辑 config/webpack/environment.js,增加如下内容:

1
2
3
4
5
6
7
8
const webpack = require('webpack')
environment.plugins.prepend('Provide',
  new webpack.ProvidePlugin({
    $: 'jquery/src/jquery',
    jQuery: 'jquery/src/jquery',
    Popper: ['popper.js', 'default']
  })
)

完整内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
const { environment } = require('@rails/webpacker')

const webpack = require('webpack')
environment.plugins.prepend('Provide',
  new webpack.ProvidePlugin({
    $: 'jquery/src/jquery',
    jQuery: 'jquery/src/jquery',
    Popper: ['popper.js', 'default']
  })
)

module.exports = environment

编辑 app/javascript/packs/application.js,增加:

1
2
require("bootstrap")
require("bootstrap/scss/bootstrap")

如果兼容旧版 stylesheet_link_tag 的话,也可以不写 require(“bootstrap/scss/bootstrap”),而替换为在文件 app/assets/stylesheets/application.css 中增加:

1
@import 'bootstrap/scss/bootstrap'

番外:Procfile.dev 的 foreman

foreman 是管理多条启动命令的工具,可以同时启动你的数据库,缓存,sidekiq,还有 webpack-dev-server。

Procfile.dev 典型命令行:

1
2
3
rails: bin/rails s -p 3000
webpack-dev: bin/webpack-dev-server
worker: sidekiq

根目录新建 .foreman:

1
procfile: Procfile.dev

运行命令:

1
foreman start
本文由作者按照 CC BY 4.0 进行授权