Rails7でJSライブラリを使う方法

  • このエントリーをはてなブックマークに追加

今回はRails7がリリースされたので、触っていきたいと思います。

個人的に気になったのが、フロントエンド周りの変更です。

NodeJSやYarnを使わない形になったので、例えばJavaScriptライブラリをどうやって使ったらいいのか分からなかったので色々試してみました。

全体の流れ

  • JavaScriptライブラリを使いたい場合はimportmapでpinする
  • pinしたパッケージはStimulusでimportして使う
  • 基本的にCDNを使うように設計されている

前提

  • rails7でnewしている

コード

ライブラリを追加したい場合は

./bin/importmap pin ライブラリ名

といったコマンドを実行するようです。

今回はセレクトボックスをいい感じにするslim-selectを使えるようにします。

まずは先程のコマンドで追加します。

$ .bin/importmap pin slim-select
Pinning "slim-select" to https://ga.jspm.io/npm:slim-select@1.27.1/dist/slimselect.min.mjs

これでimportmap.rbに追加されます。

# Pin npm packages by running ./bin/importmap

pin "application", preload: true
pin "@hotwired/turbo-rails", to: "turbo.min.js", preload: true
pin "@hotwired/stimulus", to: "stimulus.min.js", preload: true
pin "@hotwired/stimulus-loading", to: "stimulus-loading.js", preload: true
pin_all_from "app/javascript/controllers", under: "controllers"
pin "slim-select", to: "https://ga.jspm.io/npm:slim-select@1.27.1/dist/slimselect.min.mjs" # 追加される

あとはStimulusから呼び出します。

import { Controller } from "@hotwired/stimulus"
import SlimSelect from "slim-select"

export default class extends Controller {
  connect() {
    this.select = new SlimSelect({
      select: this.element
    })
  }

  disconnect() {
    this.select.destroy()
  }
}

importmapのおかげで、”slim-select”という名前でimportすることができます。

続いて対象のviewファイルにこのコントロールを指定します。

<%= form.select :category, ["ruby", "php"], { include_blank: true }, data: { controller: "select" } %>

最後にslim-selectの場合はCSSを読み込まないといけないので、これもCDNで読み込みます。

/*
 * This is a manifest file that'll be compiled into application.css, which will include all the files
 * listed below.
 *
 * Any CSS (and SCSS, if configured) file within this directory, lib/assets/stylesheets, or any plugin's
 * vendor/assets/stylesheets directory can be referenced here using a relative path.
 *
 * You're free to add application-wide styles to this file and they'll appear at the bottom of the
 * compiled file so the styles you add here take precedence over styles defined in any other CSS
 * files in this directory. Styles in this file should be added after the last require_* statement.
 * It is generally better to create a new file per style scope.
 *
 *= require_tree .
 *= require_self
 */

@import url("https://cdnjs.cloudflare.com/ajax/libs/slim-select/1.27.1/slimselect.min.css");

感想

importmapを使うことで、JavaScriptライブラリが扱いやすくなったと思いました。

CDNを使うのでnode_modulesもないし、セキュアに管理出来る気がします。

今回は試していませんが、ReactやVueも導入できるようです。

参考情報

  • このエントリーをはてなブックマークに追加