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
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
1.1k
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
210
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
3.5k
Android CLI
fornewid
0
210
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
susisu
0
140
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
3
750
霧の中の代数的エフェクト
funnyycat
1
460
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.7k
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
550
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
460
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
4
360
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
180
Featured
See All Featured
For a Future-Friendly Web
brad_frost
183
10k
The untapped power of vector embeddings
frankvandijk
2
1.8k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
450
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
390
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
Fireside Chat
paigeccino
42
4k
It's Worth the Effort
3n
188
29k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
240
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.8k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.2k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
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を使いたい おまけ