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
Breaking Up with SVG-in-JS
Search
wakamaki
July 28, 2023
Programming
1
1k
Breaking Up with SVG-in-JS
HRBrain Fly High #4 -Frontend-にて使用した資料
wakamaki
July 28, 2023
Tweet
Share
Other Decks in Programming
See All in Programming
maplibre-gl-layers - 地図に移動体たくさん表示したい
kekyo
PRO
0
230
Fundamentals of Software Engineering In the Age of AI
therealdanvega
1
230
ベクトル検索のフィルタを用いた機械学習モデルとの統合 / python-meetup-fukuoka-06-vector-attr
monochromegane
2
350
new(1.26) ← これすき / kamakura.go #8
utgwkk
0
1.9k
TROCCOで実現するkintone+BigQueryによるオペレーション改善
ssxota
0
170
Rで始めるML・LLM活用入門
wakamatsu_takumu
0
170
株式会社 Sun terras カンパニーデック
sunterras
0
2k
CSC307 Lecture 13
javiergs
PRO
0
310
PostgreSQL を使った快適な go test 環境を求めて
otakakot
0
520
Ruby x Terminal
a_matsuda
7
590
エージェント開発初心者の僕がエージェントを作った話と今後やりたいこと
thasu0123
0
240
Codex の「自走力」を高める
yorifuji
0
1.1k
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
77
5.3k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
81
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
150
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
My Coaching Mixtape
mlcsv
0
69
HDC tutorial
michielstock
1
520
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.6k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
310
BBQ
matthewcrist
89
10k
Building the Perfect Custom Keyboard
takai
2
710
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
470
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Transcript
Breaking Up with SVG-in-JS
自己紹介 大学 法政大学経済学部 4年 趣味 サウナ、キーボード
はじめに kurtextremさんのBreaking Up with SVG-in-JS in 2023 という記事の内容を参考にさせていただきました https://kurtextrem.de/posts/svg-in-js
Background
これまでのSVG-in-JSの扱い方
<!-- Icon.svg --> <svg viewBox="0 0 300 300"> <g><path d="M0
200 v-200 h200 a100,100 90 0,1 0,200 a100,100 90 0,1 -200,0z" /></g> </svg> import React from 'react'; import Icon from "./Icon.svg"; const Test = () => { return <Icon /> }
import * as React from "react" const Svg = (props)
=> ( <svg viewBox="0 0 300 300" width="1em" height="1em" {...props}> <path d="M0 200V0h200a100 100 90 0 1 0 200 100 100 90 0 1-200 0z" /> </svg> ) export default Svg import React from 'react'; import Svg from ".svg"; const Test = () => { return <Svg fill="red" width={20} height={20} /> } SVGR
なぜ SVG-in-JS はアンチパターンなのか
SVG要素は、Javascriptコードの一部として存在することがある バンドルサイズが大きくなるほど、Javascriptが パースとコンパイルにかけるコストが大きくなる。 大量のSVG要素が読み込まれる場合、パフォーマンスに影響 パース&コンパイル
SVG-in-JS SVG-in-HTML SVGがReactコンポーネントとして 存在するため、 Reactのレンダリングプロセスに 含まれる SVGは直接HTMLに含まれるため、 Reactのレンダリングプロセスに含まな い レンダリング
JS bundle から SVGs を取り除くベストプラクティス
<!-- Icon.svg --> <svg viewBox="0 0 300 300"> <g><path d="M0
200 v-200 h200 a100,100 90 0,1 0,200 a100,100 90 0,1 -200,0z" /></g> </svg> import React from 'react'; import Icon from "./Icon.svg"; const Test = () => { return <img src={Icon} /> } Using <img> to load the SVG
パフォーマンス vs ユーザーエクスペリエンス imgタグを使用する方法 • ページが最初にダウンロードされたときに、 アイコンのレンダリングで、ちらつきが生じる • CSSを使ってスタイルを設定できない
SVG sprites – using <use> <svg style="display: none;"> <symbol id="icon-heart"
viewBox="0 0 32 32"> <title>heart icon</title> <path d="M16 29.414l-13.413-13.415 6.826-6.826 6.587 6.587 6.587-6.587 6.8266.826z"></path> </symbol> </svg> <svg class="icon icon-heart"><use href="#icon-heart"></use></svg> <svg class="icon icon-heart"><use href="#icon-heart"></use></svg>
SVG sprites – using <use> メモリ使用量の削減: SVGスプライトと<use>要素を使用すると、 一つのSVGイメージを定義し、その定義を再利用して 同じイメージを複数の場所で表示することができる。 メモリ使用量が削減される。
SVG sprites – using <use> JavaScriptバンドルのサイズ削減: SVGスプライトを使用すると、SVGイメージは JavaScriptバンドルの一部ではなく、 独立したSVGファイルとして存在する。 JavaScriptバンドルのサイズが削減される。
SVG sprites – using <use> レンダリングパフォーマンスの向上: JavaScriptエンジンではなく ブラウザのHTMLパーサーとSVGレンダリングエンジン によってパースとレンダリングが行われる。 これはJavaScriptエンジンによるパースとレンダリングよりも効率
的で、レンダリングパフォーマンスが向上する。
環境にもよりますが、、 SVG sprites – using <use> を使うのが良さそう
まとめ SVG-in-JSは、パフォーマンスとメモリ使用量の観点から見るとアンチパターンである。 SVG-in-HTMLは、Javascriptバンドルサイズを小さくするための最善の方法。 ただし、 最適化すべきもっと重要なことがあるかもしれません。SVG最適化の前に、SVG-in-JSが最大の原 因ではないかもしれないことを心に留めておいてください。
ありがとうございました