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
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
TechTown - Creating Composable Callables in Contemporary C++
rollbear
0
110
phperだってパンチカードでコーディングしたい
o0h
PRO
0
300
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
8
6k
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
160
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
160
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
250
すこし踏み込む CancellationToken
htkym
2
1.7k
ChromeでローカルLLM
ryu1013
0
120
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.6k
パスワード再設定メールのURLについて知っておこう
uyuki234
0
140
CodeRabbitの効果検証と過ごしてみた3ヶ月
armondando
0
230
Featured
See All Featured
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
350
How STYLIGHT went responsive
nonsquared
100
6.3k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
400
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
780
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
810
A Modern Web Designer's Workflow
chriscoyier
699
190k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
530
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
280
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
620
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Git: the NoSQL Database
bkeepers
PRO
433
67k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
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を使いたい おまけ