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
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
150
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.2k
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
390
Vite+ Unified Toolchain for the Web
naokihaba
0
320
3Dシーンの圧縮
fadis
1
780
OSもどきOS
arkw
0
570
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
580
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
170
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
140
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
260
AI時代のUIはどこへ行く?その2!
yusukebe
21
7.3k
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.3k
Featured
See All Featured
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
360
The Cult of Friendly URLs
andyhume
79
6.9k
Believing is Seeing
oripsolob
1
150
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
340
Code Review Best Practice
trishagee
74
20k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
210
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Designing Experiences People Love
moore
143
24k
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を使いたい おまけ