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
190
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
Discordを用いたラボオートメーション関連情報収集の自動化
noguhiro2002
0
490
Cloudflare is Agents
chimame
0
190
ハーネス設計入門 〜プロンプト、コンテキストの次〜
kinopeee
52
33k
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
0
150
源内ハンズオン概要編
hideg
0
240
信頼性の目標を誰も求めてない
shubox
0
470
楽しそうなつよつよエンジニアと目が死んでる僕/A brilliant engineer having a blast, and dead-eyed me.
3l4l5
2
280
MySQLとPostgreSQLって何が違うの?
akagami
PRO
0
160
AWS Transform Customによる Spring Boot 2.xから4.xへのVerUp
satoshi256kbyte
2
120
XHTMLが残したもの
yosuke_furukawa
PRO
1
350
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
210
いまどきの Codex で開発する visionOS アプリの開発スタイルについて
karad
0
180
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
640
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
270
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
RailsConf 2023
tenderlove
30
1.5k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
From π to Pie charts
rasagy
0
350
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
510
[SF Ruby Conf 2025] Rails X
palkan
2
1.3k
The browser strikes back
jonoalderson
0
1.6k
The untapped power of vector embeddings
frankvandijk
2
1.9k
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