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
110
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
670
ふかぼれ!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
670
DOM Observable
petamoriken
1
380
Other Decks in Programming
See All in Programming
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
230
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
610
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
Claude Team Plan導入・ガイド
tk3fftk
0
220
Built Our Own Background Agent at LayerX #aidevex_findy
layerx
PRO
8
3k
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
530
Foundation Models frameworkで画像分析
ryodeveloper
1
130
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
520
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
1
230
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
1k
初めてのKubernetes 本番運用でハマった話
oku053
0
130
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
180
Featured
See All Featured
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
420
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
470
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.7k
Being A Developer After 40
akosma
91
590k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Navigating Weather and Climate Data
rabernat
0
400
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
57k
Building Adaptive Systems
keathley
44
3.1k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Speed Design
sergeychernyshev
33
1.9k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
320
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
67
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