🚀

【Rails5用】rails-ujsとactivestorageの依存をsprocketsからnpmに移行する

2021/01/04に公開

問題

rails new myapp --webpack

でwebpackerベースでRailsプロジェクトを作成しても、assets/javascripts/application.jsが残っていて、そこにはsprocketsベースの記述が残っています。

↓これ

// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, or any plugin's
// vendor/assets/javascripts directory can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// compiled file. JavaScript code in this file should be added after the last require_* statement.
//
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
// about supported directives.
//
//= require rails-ujs
//= require activestorage

rails-ujs,activestorageは使いたいが、sprocketsベースの記述は技術的負債になるので書きたくない。。。

せっかくwebpacker使ってるのだからjsの依存は全部package.jsonに書いてしまいたいですね。

移行手順

1. rails-ujs,activestorageをpackage.jsonに追記

rails-ujs、activestorageともにnpmモジュールが提供されているので、追記します

yarn add rails-ujs activestorage

2.packs/application.jsから呼び出す

packsのほうのapplication.jsの上の方の以下のコードを追記します。

import Rails from 'rails-ujs'
Rails.start()

import * as ActiveStorage from 'activestorage'
ActiveStorage.start()

3.assets/javascripts/application.jsを消す

これでwebpackベースのapplication.jsにrails-ujsとactivestorageの移行することができました。

assets/javascripts/application.jsは削除してしまいましょう。

application.html.erbの

javascript_include_tag 'application'

の削除も忘れずに。

これで移行は完了です!

ちなみにRails6だと

ruby 3.0, rails 6.1.0では、

rails new myapp --webpack

でプロジェクトを作成すると、本記事で解説した移行手順は不要で、すでにSprocketsを使わない構成になっています。

デフォルトで作られるapplication.jsはこんな感じ。

// This file is automatically compiled by Webpack, along with any other files
// present in this directory. You're encouraged to place your actual application logic in
// a relevant structure within app/javascript and only use these pack files to reference
// that code so it'll be compiled.

import Rails from "@rails/ujs"
import Turbolinks from "turbolinks"
import * as ActiveStorage from "@rails/activestorage"
import "channels"

Rails.start()
Turbolinks.start()
ActiveStorage.start()

Discussion