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
700
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
Rubyのobject_id
qnighy
6
1.3k
私のEbitengineの第一歩
qt_luigi
0
440
マイグレーションコード自作して File-Based Routing に自動移行!! ~250 ページの歴史的経緯を添えて~
cut0
1
260
【TID2024】模擬講義:プログラマと一緒にゲームをデザインしてみよう!
akatsukigames_tech
0
560
デザインシステムとコンポーネント指向によるフロントエンド開発プロセスの革新 / Innovation in Frontend Development Processes through Design Systems and Component-Oriented Architecture
nrslib
8
5.3k
Method Swizzlingを行うライブラリにおけるマルチモジュール設計
yoshikma
0
110
Rubyとクリエイティブコーディングの輪の広がり / The Growing Circle of Ruby and Creative Coding
chobishiba
1
260
全部見せます! クラシルリワードのSwiftTesting移行プロジェクト
uetyo
0
190
Kotlin 2.0が与えるAndroid開発の進化
masayukisuda
1
270
開発を加速する共有Swift Package実践
elmetal
PRO
0
390
Understand the mechanism! Let's do screenshots tests of Compose Previews with various variations / 仕組みから理解する!Composeプレビューを様々なバリエーションでスクリーンショットテストしよう
sumio
3
440
dotfiles について話したい #湘なんか
stefafafan
2
290
Featured
See All Featured
YesSQL, Process and Tooling at Scale
rocio
167
14k
Debugging Ruby Performance
tmm1
72
12k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
38
9.2k
BBQ
matthewcrist
83
9.1k
The World Runs on Bad Software
bkeepers
PRO
64
11k
The Invisible Side of Design
smashingmag
295
50k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
34
1.7k
Building a Scalable Design System with Sketch
lauravandoore
458
32k
Fantastic passwords and where to find them - at NoRuKo
philnash
48
2.8k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
230
17k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
27
7.4k
The Illustrated Children's Guide to Kubernetes
chrisshort
47
48k
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が最大の原 因ではないかもしれないことを心に留めておいてください。
ありがとうございました