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
2年かけて Deno に DOMMatrix を実装した話 / How I implement...
Search
petamoriken / 森建
July 24, 2026
Programming
210
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
FE Yatai Talks vol.2
https://fe-yatai.connpass.com/event/396289/
petamoriken / 森建
July 24, 2026
More Decks by petamoriken / 森建
See All by petamoriken / 森建
WebAssembly を読み込むベストプラクティス 2026年春版 / Best Practices for Loading WebAssembly (Spring 2026)
petamoriken
5
1.2k
コントリビューターによるDenoのすゝめ / Deno Recommendations by a Contributor
petamoriken
0
270
Module Harmony
petamoriken
3
1.1k
Denoでフロントエンド開発 2025年春版 / Frontend Development with Deno (Spring 2025)
petamoriken
1
1.6k
非ブラウザランタイムとWeb標準 / Non-Browser Runtimes and Web Standards
petamoriken
0
680
ふかぼれ!CSSセレクターモジュール / Fukabore! CSS Selectors Module
petamoriken
0
340
フロントエンドの標準仕様をどう追っているか / How I follow the frontend standards specs
petamoriken
4
2.8k
ECMAScript、Web標準の型はどう管理されているか / How ECMAScript and Web standards types are maintained
petamoriken
3
680
DOM Observable
petamoriken
1
380
Other Decks in Programming
See All in Programming
自動化したのに回らないテスト運用の壁ーAI時代の品質責任と生産性
mfunaki
0
130
AIが無かった頃の素敵な出会いの話
codmoninc
1
420
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
500
What's New in Android 2026
veronikapj
0
260
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
230
メールのエイリアス機能を履き違えない
isshinfunada
0
240
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
490
自動化したのに回らない テスト運用の壁―AI時代の品質責任と生産性
mfunaki
0
160
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
460
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
150
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
2.8k
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
640
Featured
See All Featured
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
170
Producing Creativity
orderedlist
PRO
348
40k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
1.1k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
320
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.2k
KATA
mclloyd
PRO
35
15k
Six Lessons from altMBA
skipperchong
29
4.4k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
What's in a price? How to price your products and services
michaelherold
247
13k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Navigating Team Friction
lara
192
16k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Transcript
2年かけて Deno に DOMMatrix を実装した話 FE Yatai Talks vol.2 pixiv
Inc. 森内建太 @petamoriken 2026.7.24
自己紹介 petamoriken WebDev in Fukuoka 2 • Web エンジニア •
Deno / ECMAScript コントリビューター • FEC Fukuoka 2026 ゲストスピーカー
https://scrapbox.io/petamoriken/ 3
唯一型チェック機能を持つランタイム Deno • TypeScript (tsc) 同梱 ◦ tsgo (TS v7)
をデフォルトにする作業中 ◦ JSX サポート • Linter, Formatter, LSP 内蔵 ◦ deno lint で Oxlint を使う変更が議論中 ▪ Oxlint に Type-Aware Linting が来ましたね 4
5
今日は Web 標準 API のニッチな話 6
DOMMatrix • 4x4 の行列で回転、平行移動などの線形変換を扱う ◦ 2D の場合は 2x3 のアフィン行列として扱われる const
matrix = new DOMMatrix() .rotateSelf(0, 0, 90) .translateSelf(20, 30); console.log(matrix.toString()); // "matrix(0, 1, -1, 0, -30, 20)" 7
何故 Deno に DOMMatrix を入れるのか • SSR で CSS Transforms
生成に使える(かも) • WebGPU で GPU に変換行列を送るのに使える • OffscreenCanvas で Canvas 2D を実装したい ◦ Canvas 2D 実装には DOMMatrix が必要 ◦ コンテンツに合わせて OGP の画像生成が出来る ◦ deno desktop の Raw モードでゲームを作りたい 8
コンテンツに合わせて OGP 画像生成 • Cloud Functions で node-canvas を使ったことがある ◦
導入や設定が大変 ◦ 読み込みでよくタイムアウトしてしまっていた • 今なら Satori や skia-canvas を採用するのがよさそう ◦ 絵文字対応とか大変そう • Deno でネイティブサポートしてもろもろ解決! 9
deno desktop • Deno 2.9 で入ったデスクトップアプリを作る機能 • Next.js などのフレームワークからアプリが作れる •
色々なモードがある ◦ WebView モード: OS のブラウザ使用(Tauri 相当) ◦ CFE モード: Chromium 埋め込み(Electron 相当) ◦ Raw モード: ブラウザなし(現状 WebGPU のみ) 10
DOMMatrix(再掲) • 4x4 の行列で回転、平行移動などの線形変換を扱う ◦ 2D の場合は 2x3 のアフィン行列として扱われる const
matrix = new DOMMatrix() .rotateSelf(0, 0, 90) .translateSelf(20, 30); console.log(matrix.toString()); // "matrix(0, 1, -1, 0, -30, 20)" 11
DOMMatrix は CSS Transforms をパースする • CSS Transfroms には関数が 20
個定義されている • パーサーを実装するのに CSS 仕様を読み必要がある const matrix = new DOMMatrix( "rotate(90deg) translate(20px, 30px)" ); console.log(matrix.toString()); // "matrix(0, 1, -1, 0, -30, 20)" 12
CSS Transforms は Values and Units に依存 • 引数内で CSS
Values and Units の関数が使える ◦ Values and Units には関数が 21 個定義されている ◦ 四則演算が使える • 全部頑張って実装する const matrix = new DOMMatrix( "translateX(calc(1px + 2px)) rotate(atan2(3, 2))" ); 13
14
CSS 4 から異なる次元の掛け算・割り算可能に • 四則演算の途中では物理量が基本次元でなくてもよい • が、頑張る…… 15
16
なんやかんや実装し、マージされた • 詳細は Zenn の記事へ! 17
まとめ • Deno は便利なのでみんな使ってね ◦ TypeScript を同梱している ◦ Deno 2.9
で入った deno desktop が面白そう • Web 標準 API に行列を扱う DOMMatrix がある ◦ 2年かけて Deno に実装した ◦ CSS Functions のパーサーを作るのは結構大変 18
Deno に Canvas 2D 実装中 • vello + wgpu と
vello_cpu を使っている 19