Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Importmapを使ったJavaScriptの 読み込みとブラウザアドオンの影響
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
shu_numata
October 26, 2024
Programming
3.1k
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ネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
8
5.5k
The Rails Doctrine Decade
koic
2
510
CodeRabbitの効果検証と過ごしてみた3ヶ月
armondando
0
170
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
380
Turning Architecture into Unit Tests in the AI Era (NSSpain XIV)
steliosf
PRO
1
130
Ghostty + Neovimで作る 透明でカッコ良い開発環境
j341nono
0
150
SalesForceを内製化!? ~ HR事業を支える顧客管理基盤のインフラを大公開 ~
oku053
0
140
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
190
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
350
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.8k
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
34
15k
Are APIs Still Relevant in the AI Era?
soyuka
0
430
Featured
See All Featured
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
2
2k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Leo the Paperboy
mayatellez
10
2.4k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
520
Ruling the World: When Life Gets Gamed
codingconduct
0
390
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
860
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
490
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
320
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
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を使いたい おまけ