Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Importmapを使ったJavaScriptの 読み込みとブラウザアドオンの影響
Search
shu_numata
October 26, 2024
Programming
3k
5
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Importmapを使ったJavaScriptの 読み込みとブラウザアドオンの影響
shu_numata
October 26, 2024
Other Decks in Programming
See All in Programming
「人を評価する AI」の設計と実装
ryoyanara
0
140
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
200
php-fpmのプロセスが枯渇した日-調査・対処・そして本当にやるべきだったこと-
shibuchaaaan
0
210
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
410
Claude Team Plan導入・ガイド
tk3fftk
0
250
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.6k
FDEが実現するAI駆動経営の現在地
gonta
2
260
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
0
160
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
650
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
160
AIエージェントで 変わるAndroid開発環境
takahirom
2
770
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
1
120
Featured
See All Featured
The Curse of the Amulet
leimatthew05
2
13k
AI: The stuff that nobody shows you
jnunemaker
PRO
9
870
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.2k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
3
400
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Statistics for Hackers
jakevdp
799
230k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
420
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
240
It's Worth the Effort
3n
188
29k
Transcript
Importmapを使ったJavaScriptの 読み込みとブラウザアドオンの影響 2024/10/26 Kaigi on Rails 2024 swamp09
沼田 周 @swamp09 株式会社 永和システムマネジメント 現在はECサイトの開発プロジェクトに所属
• import mapsの概要 • importmap-railsを使う経緯 • 実際に使ってみて起こった問題
私のプロジェクトでのRailsアップデート業 Rails 6 -> Rails 7
Rails 7
Rails 7 Hotwire登場!
Webpackerの終わり
https://github.com/rails/webpacker
移行先
移行先 js-bundling-rails or importmap-rails
js-bundling-rails Webpackやesbuildを使うもの
Rails 7 でデフォルトになった importmap-rails ってなに?
// HTTPパス import dayjs from 'https://cdn.skypack.dev/
[email protected]
' // 相対パス import dayjs
from './node_modules/dayjs' Import maps
<script type="importmap"> { "imports": { "dayjs": "https://cdn.skypack.dev/
[email protected]
", } } </script>
<script type="module"> import dayjs from 'dayjs'; // ↓と同じになる // import dayjs from 'https://cdn.skypack.dev/
[email protected]
' </script> Import maps
import dayjs from 'dayjs' JSモジュールをCDNから node_modulesへダウンロード node_modulesにあるものを importする Webpackやesbuildのようなビルドツールで application.jsなどにビルドする
いままでは
node_modulesを使わず ブラウザ上でモジュールを読み込める ビルドしなくていい
https://caniuse.com/import-maps モダンブラウザでは安心して使える
importmap-rails # config/importmap.rb pin "dayjs", to: "https://cdn.jsdelivr.net/npm/
[email protected]
/dayjs.min.js"
importmap-rails # config/importmap.rb pin "dayjs", to: "https://cdn.jsdelivr.net/npm/
[email protected]
/dayjs.min.js" # application.html.erb <%=
javascript_importmap_tags %>
importmap-rails # config/importmap.rb pin "dayjs", to: "https://cdn.jsdelivr.net/npm/
[email protected]
/dayjs.min.js" # application.html.erb <%=
javascript_importmap_tags %> <script type="importmap" data-turbo-track="reload">{ "imports": { "dayjs": "https://cdn.jsdelivr.net/npm/
[email protected]
/dayjs.min.js" } }</script> <link rel="modulepreload" href="https://cdn.jsdelivr.net/npm/
[email protected]
/dayjs.min.js">
これがなんでRails 7から デフォルトになったのか
https://world.hey.com/dhh/modern-web-apps-without-javascrip t-bundling-or-transpiling-a20f2755
Babelでのトランスパイル 不要になった
HTTP2が当たり前に使われるようになった 一つのJSファイルにまとめなくていい
私のプロジェクト Webpackerからの移行
Webpackのままjs-bundling-rails使うか?
https://bun.sh/docs/bundler/vs-esbuild
importmap-rails使う?
Q. ビルドツールいらないの?
A. いらない TypeScript: 使ってなかった Vue.js: ちょっと使ってた、けどStimulusに移行する方針で決まった
https://twitter.com/robbyrussell/status/1712134715434819872
https://www.youtube.com/watch?v=-cEn_83zRFw
JSをno buildにして importmap-railsでやっていく
しばらくして
サーバーサイドに奇妙なエラー
ログを調査していると
Processing by PostsController#update as TURBO_STREAM のようなリクエストのはずが、 Processing by PostsController#update as
HTML となっている
直接リクエストしている疑い?
直接リクエストしている疑い? ログを見た限りそんなことはない
Turbo が動いていないかも
Honeybadgerという エラートラッキングサービスを 使っているが通知はなし https://www.honeybadger.io/
ユーザーの環境の問題?
ユーザーの環境の問題? エラーユーザーは最新バージョンのブラウザを使っている ChromeやFirefoxユーザーがいる
同じブラウザでも再現しない
同じブラウザでも再現しない Addonか?
よく使われるAddonってなに?
Adblockをいれるとエラーになる
// application.js import "@hotwired/turbo-rails" import { Application } from "@hotwired/stimulus"
import Honeybadger from "@honeybadger-io/js" Honeybadger.configure({ apiKey: ’aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa’ , }) const application = Application.start()
Adblockはいろいろある
Adblockが使うフィルターリスト
https://github.com/easylist/easylist
EasyPrivacyの中に関係あるものを発見
なるほど?
# config/importmap.rb pin "@honeybadger-io/js", to: "https://ga.jspm.io/npm:@honeybadger-io/
[email protected]
/dist/browser/honeybadger.js" <script type="importmap" data-turbo-track="reload">{ "imports":
{ "@honeybadger-io/js": "https://ga.jspm.io/npm:@honeybadger-io/
[email protected]
/dist/browser/honeybadger.js", ... } }</script>
importmap-railsに移行して起きた問題
importmap-railsで使用するモジュールを ダウンロードする
この問題が起きた時使用していたのは importmap-rails v1.2 bin/importmap pin xxx --download のようにdownloadオプションを使用して vendorディレクトリに保存する
# config/importmap.rb pin "@honeybadger-io/js" , to: "@honeybadger-io--js.js" <script type="importmap" data-turbo-track="reload">{
"imports": { "@honeybadger-io/js": "/assets/@honeybadger-io--js-98f68298ce509dfd7b221dfbdde2cf6c4fe60e97359d baed12ddaa7ad7c8c403.js", ... } }</script> SprocketsかPropshaftでフィンガープリントがつく
importmap-rails v2では vendorへのダウンロードが デフォルトの挙動になった
引き続き外部CDNの使用もしている importmap-railsのダウンロードで うまく使えないものもある
JSのライブラリの中には 1つのエントリポイントに 機能がまとまっていない場合がある
importmap-railsでは 一つのエントリファイルしか ダウンロードしない
さっくりダウンロードできるもの以外は 外部CDNをそのまま使っている
外部CDNを使う場合は Adblockにブロックされるかも
似たような問題が起きたときに 気づけるようにしたい 主要な機能でのTurbo Streamリクエストに リクエスト形式チェックを入れている
まとめ
• importmap-railsはjsのビルドの手間が改善できてよかった • importしたいJSモジュールがAdblockによってブロックされる ケースがある • 最新のimportmap-railsはデフォルトでvendorへJSモジュール をダウンロードする • JSモジュールがAdblockにブロックされることは今後もあるかも
しれないので、そうなったときに気づけるようにしたい まとめ
おわり • Turboを使っている場合はリクエストの形式で違和感に気づく ことができるが、他にいい方法あるんだろうか? • importmap使っていて困ったことがあったらぜひ共有してほし いです
おまけ
nodelessにできていない ESLintはいらないの? Playwrightを使いたい おまけ