0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Importmapを利用したJavaScriptの適切な管理とパフォーマンス向上

Last updated at Posted at 2024-04-19

はじめに

Rails 7では、JavaScriptバンドラーを使わずにJavaScriptを効率的に管理するために、Importmapが導入されました。Importmapを利用することで、必要なJavaScriptだけをページごとに読み込むことが可能となり、パフォーマンスの最適化が期待できます。この記事では、Importmapを使用してJavaScriptの読み込みをページ固有で管理し、不要なスクリプトの読み込みを減らす方法について説明します。

Importmapの基本

Importmapは、ブラウザのネイティブなJavaScriptモジュールローダーを活用して、指定されたJavaScriptファイルをWebアプリケーションに直接インクルードする仕組みです。config/importmap.rb ファイル内でJavaScriptファイルを「ピン」することで、どのファイルがどのキーワードでアクセスされるかを定義します。

Importmapの設定方法

まず、config/importmap.rb ファイルにJavaScriptファイルをピンします。例えば、特定のページでのみ使用する staff_selector.js がある場合、以下のように設定します。

# config/importmap.rb
pin "staff_selector", to: "staff_selector.js"

ビューでのImportmapの使用

特定のビューでJavaScriptファイルを読み込むには、javascript_importmap_tags ヘルパーを使います。このヘルパーによって、指定したJavaScriptファイルがページに読み込まれます。

IDを用いる場合

<%= javascript_importmap_tags "staff_selector" %>

<%# 以下は通常のビュー %>
<div class="container mt-4">
  <h2><%= "#{@start_date.strftime('%Y年 %m月')}の月間スケジュール" %></h2>

  <%= form_with(url: '#', method: :get, local: true, id: "staff-selector-form") do |form| %>
    <%= label_tag :staff_id, "スタッフを選択:" %>
    <%# 以下のstaff_idに変更があった場合にJS発火 %>
    <%= select_tag :staff_id, options_from_collection_for_select(current_company.staffs, :id, :name, prompt: "スタッフを選択"), class: "form-select" %>
  <% end %>

  <%= month_calendar do |date| %>
    <div>
      <%= date.day %>
    </div>
  <% end %>
</div>

Classを用いる場合

<%= javascript_importmap_tags "staff_selector" %>
<div class="container mt-4">
  <h2><%= "#{@start_date.strftime('%Y年 %m月')}の月間スケジュール" %></h2>

  <%= form_with(url: '#', method: :get, local: true, id: "staff-selector-form") do |form| %>
    <%= label_tag :staff_id, "スタッフを選択:" %>
    <%# 以下のstaff_idに変更があった場合にJS発火 %>
    <%= select_tag :staff_id, options_from_collection_for_select(current_company.staffs, :id, :name), prompt: "スタッフを選択", class: "form-select staff-selector" %>
  <% end %>

  <%= month_calendar do |date| %>
    <div>
      <%= date.day %>
    </div>
  <% end %>
</div>

このタグをビューファイルの適切な場所(通常は <head> セクション)に配置することで、指定したJavaScriptがページに組み込まれます。

JavaScriptの適用

ページ特有のJavaScriptを適用するために、例として staff_selector.js で以下のような処理を行います。

IDを用いる場合

// app/javascript/staff_selector.js
document.addEventListener("turbo:load", function() {
  const selectElement = document.getElementById("staff_id");
  selectElement.addEventListener("change", function() {
    const selectedStaffId = this.value;
    window.location.href = `/staffs/${selectedStaffId}/monthly_schedule`;
  });
});

Classを用いる場合

document.addEventListener("turbo:load", function() {
  document.querySelectorAll(".staff-selector").forEach(selectElement => {
    selectElement.addEventListener("change", function() {
      const selectedStaffId = this.value;
      if (selectedStaffId) {
        window.location.href = `/staffs/${selectedStaffId}/monthly_schedule`;
      }
    });
  });
});

まとめ

Importmapを利用することで、Rails 7アプリケーションのJavaScriptの管理が簡素化され、ページごとに必要なスクリプトのみをロードすることが容易になります。これにより、ページの読み込み速度の向上が期待でき、エンドユーザーにとってより快適なブラウジング体験が提供できるようになります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?