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
Vanilla JS challenge
Search
tomoaki kanayama
February 11, 2024
Programming
180
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Vanilla JS challenge
tomoaki kanayama
February 11, 2024
More Decks by tomoaki kanayama
See All by tomoaki kanayama
Gemini API で デロリアン
aknow2
0
150
Other Decks in Programming
See All in Programming
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.7k
OSINT for SRE: 学術論文とポストモーテムから探る システム障害の共通パターン / SRE NEXT 2026
tomoyk
1
1.1k
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
250
フィードバックで育てるAI開発
kotaminato
1
100
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
0
130
Claude Opus 4.6以後の受託開発エンジニアの変化(Claude Code開発ノウハウ大公開スペシャルbyクラスメソッド)
iidatakuma
1
170
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
380
自作OSでスライド発表する
uyuki234
1
3.6k
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
740
symfony/aiとlaravel/boost
77web
0
120
dRuby over BLE
makicamel
2
410
20260623_Loop Engineeringで自分の分身の問い合わせBotを作る
ryugen04
0
130
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Statistics for Hackers
jakevdp
799
230k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
260
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
The SEO Collaboration Effect
kristinabergwall1
1
500
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
A better future with KSS
kneath
240
18k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
It's Worth the Effort
3n
188
29k
Evolving SEO for Evolving Search Engines
ryanjones
0
240
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Transcript
Vanilla JS challenge 金山智昭
だれ 金山智昭 (Kanayama Tomoaki) 三重県津市在住のプログラマーです Frontend(React, Vue, webgl) Apps (Electron,
ReactNative) Cloud (AWS, Firebase, Supabase) Backend (django, RoR) GeoVisualization Agile
去年末のある日 https://www.youtube.com/shorts/91WgzdDF3yk
アプリにしたら楽しそう
作った https://6-ro.com
今回開発する上での縛り 1. ブラウザで動作するWebアプリ プラットフォームとか考えるとネイティブ面倒 HTMLとjsのみで動作する 2. Vanilla jsで行く http://vanilla-js.com/ 要は全部自分で書く
モチベーション ReactとかVue、Three, p5とか.jsはもうお腹いっぱい 最近はWeb標準のAPIでも色々出来るようになってきている FWを使わずに、Web標準でどこまで快適に行けるか試してみよう
開始10分後
ただし、色々面倒なので以下は使う Vite 開発体験向上(HMR, Bundler, unittest) Typescript WebGL回りはコードがゴチャるのでTypescriptがあった方が安心 というかChatGPTが吐いたコードが、、、
Vanilla.jsで試したい事 コンポーネント指向の開発 AngularやVue,Reactでの流行り始めたやつ UI(ボタン、フォーム)とかパーツかして使い回せる様にして開発する 従来はCSSで実現してたが、DOMや振る舞いまで使い回せるところが違う Reactive 値が変わったら勝手にUIが更新されるよ!ってやつ(後述) CSS SCSSいらん CSS
in JSもいらん WebGL WebGPU WebGL2 WebGL
コンポーネント指向の開発 React // index.jsx function HelloWorld(props) { return <span className="title">Hello!
{props.name}<span> } function Root() { return <div> <HelloWorld name="world"> <HelloWorld name="vanilla js"> </div> }
コンポーネント指向の開発 Web component <!-- DOMを独自に定義 --> <hello-world name="world"> <hello-world name="Vanilla
JS"> class HelloWorld extends HTMLElement { connectedCallback() { const shadow = this.attachShadow({ mode: 'closed' }); // このコンポーネント専用のCSSが書ける shadow.innerHTML = /* html */ ` <style> span { text-align: center; } </style> <span>Hello ${ this.name }!</span>`; } } defineComponent('hello-world', HelloWorld)
Reactive 状態が変わったら勝手にUIが更新される Excelの表を想像
Reactive Web component <Counter id="counter" count="0"></counter> class Counter extends HTMLElement
{ // 属性の値が変わったら更新される attributechangedcallback() { const shadow = this.shadowRoot; const count = this.getAttribute('count') shadow.innerHTML = /* html */ ` <span>Count: ${ count }!</span>`; } } const counter = document.getElementById('counter') counter.setAttribute("count", "6")
Reactive 状態管理 特に目新しい事が無くて、面白味がないので割愛 いわゆるObserberパターンで実装
CSS コンポーネントに閉じられるので、名前被りの心配は要らない(BEMとか要らない) グローバルなCSSが出来ないのが逆に面倒。色とかは、共通CSSを準備して全ての コンポーネントで読み込んでいる。かなり冗長 CSSのネストもサポートされはじめたしSCSSは不要では?
WebGL WebGPUを使ってみたかったが、Safariとかが未対応だったのでWebGL2を採用 正直、簡単に書きたいならライブラリ使った方が良い Shaderで細かく調整したいなら、生で書いた方が楽そう 特に今回は全体を回転させたり、特殊な事を色々したかったので、ライブラリ使 わずにやったのは正解だった気がする # vertex ... void
main() { ... mat2 rotation = mat2(c, -s, s, c); gl_Position = vec4(rotation * a_position, 0.0, 1.0); } # fragment void main(){ gl_Frag_color = v_color; }
まとめ FWのバージョンアップに悩まされないし、趣味で書くにはフレームワーク要らな いんじゃね?とはなる まともに仕事で開発しようと思ったら、まだまだ辛い チームで開発するにはオレオレフレームワークにせざるを得ないので、規律を決 めるのが面倒そう
None