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
Smart Nano Stores, or how we made front-end sim...
Search
Nina Torgunakova
November 09, 2023
Programming
740
1
Share
Smart Nano Stores, or how we made front-end simpler (for the FOF meetup in Lisbon)
Nina Torgunakova
November 09, 2023
More Decks by Nina Torgunakova
See All by Nina Torgunakova
Smart nano stores for state management, or how we made front-end simpler
ninoid
0
1.1k
Unveiling Nano Stores
ninoid
0
1k
Умные nano stores, или как мы сделали веб-разработку проще
ninoid
0
990
Solving algorithms: beyond cramming for job interviews
ninoid
0
2.2k
Other Decks in Programming
See All in Programming
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
2.1k
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
11k
柔軟なPDFレイアウトエディタを支える型システム設計 — Discriminated UnionとConditional Typeの実践
minako__ph
4
1.2k
TypeScriptだけでAIエージェントを作る フロント・エージェント・インフラのフルスタック実践
har1101
6
1.2k
TSKaigi 2026 TypeScriptバックエンドのオブザーバビリティ戦略 — Datadog × NestJSの実践
taiseiyamamotoan
1
210
Inside Stream API
skrb
1
420
ECR拡張スキャンでSBOMを収集して サプライチェーン攻撃の影響調査を 爆速で終わらせてみた
akihisaikeda
2
210
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
100
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
4
1.1k
iOS26時代の新規アプリ開発
yuukiw00w
0
220
肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 / JJUG CCC 2026 Spring
hirokunimaeta
0
260
AI駆動開発で崩れていくコードベースを立て直す
kyoko_nr_nr
1
400
Featured
See All Featured
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
150
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
290
How to Ace a Technical Interview
jacobian
281
24k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
240
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
820
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
23k
Art, The Web, and Tiny UX
lynnandtonic
304
21k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.4k
Faster Mobile Websites
deanohume
310
31k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
460
WENDY [Excerpt]
tessaabrams
11
38k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
190
Transcript
Smart nano stores for state management 1 @evilmartians or how
we made front-end simpler
Nina Torgunakova Frontend Engineer 2 @evilmartians
3 @evilmartians What we had before
4 What we have today * Source: www.medium.com/@withinsight1/the-front-end-spectrum-c0f30998c9f0/ @evilmartians
The modern Web Development World is becoming more and more
complex. Who suffers from it? 5 @evilmartians
1. Developers 6 @evilmartians
7 Everything is built around frameworks but remains complex @evilmartians
2. Users 8 @evilmartians
The average size of web pages is constantly growing up
9 * Source: www.keycdn.com/support/the-growth-of-web-page-size @evilmartians
3. Business 10 @evilmartians
11 Often, to do the same amount of work, more
programmers are needed. Now Before @evilmartians
12 Result: the growing complexity of Web Development makes everyone
frustrated Users Developers Business @evilmartians
13 Let's try to find inspiration! @evilmartians
Fold knowledge into data, so program logic can be stupid
and robust. 14 Eric Raymond, “Rule of Representation” @evilmartians
15 Framework Logic UI Features Data @evilmartians
But what if we made a mistake? 16 @evilmartians
17
None
19 Data Logic UI Features @evilmartians Framework Logic UI Features
Data Framework
State Management 20 Application Data State @evilmartians
21 Use stores to move logic outside of components @evilmartians
Component Component Component Store Store
OK, any other ideas about the ideal process of state
management? 22 @evilmartians
Bad programmers worry about the code. Good programmers worry about
data structures and their relationships. 23 Linus Torvalds @evilmartians
24 Global State Any State Change All Components Call the
selector function Popular global state approach: @evilmartians
25 How about improving data structure and making it faster?
@evilmartians
26 Reactive programming approach: @evilmartians
27 Applying to State Management: Component Component Component Subscriber 1
Subscriber 2 Subscriber 3 @evilmartians Small Store Small Store Small Store
28 But what if some data depends on other data?
@evilmartians
29 Solution: Relationships between stores Store Store Store Store @evilmartians
Component Component
1. Move logic to stores outside of component 2. Make
stores small and smart Let's go further! 30 @evilmartians
Perfection is achieved, not when there is nothing more to
add, but when there is nothing left to take away. 31 Antoine de Saint-Exupéry @evilmartians
32 @evilmartians State Management in modern frameworks
33 Smart Store Set value Get value @evilmartians
34 Let's summarize! @evilmartians
1. Move logic to stores outside of components. 35 Component
Component Component Store Store @evilmartians
2. Make stores smart. 36 Store Store Store Store @evilmartians
Store Component Component
3. Provide minimalism and simplicity. 37 Store One-line operations: •
Create store • Get value • Set value @evilmartians Get value Set value
38 ??? What state manager will solve all the problems?
@evilmartians
39 Nano Stores @evilmartians
Let's build a simple online catalog: 40 @evilmartians
41 @evilmartians
Creating atom store for products in catalog: // core/state.ts import
{ atom } from 'nanostores'; export const $products = atom<Product[]>([ { name: 'Nano Phone', price: 30 }, { name: 'Nano TV', price: 75 }, { name: 'Nano Laptop', price: 75 } ]); 42 @evilmartians
Using atom store: // components/Catalog.tsx import { useStore } from
'@nanostores/react'; import { $products } from 'core/state'; const Catalog = () => { const products = useStore($products); return <>{products.map((product) => <Card product={product} />)}</>; }; 43 @evilmartians
44 @evilmartians
Adding filtering using search input 45 @evilmartians
Creating atom store for search input: // core/state.ts import {
atom } from 'nanostores'; export const $searchInput = atom<string>(''); 46 @evilmartians
Using atom store for search input: // components/SearchBar.tsx import {
useStore } from '@nanostores/react'; import { $searchInput } from 'core/state'; const SearchBar = () => { const searchInput = useStore($searchInput); return <input onChange={(e) => $searchInput.set(e.target.value)} value={searchInput} />; }; 47 @evilmartians
Adding computed store to filter catalog: // core/state.ts import {
computed } from 'nanostores'; export const $filteredProducts = computed( [$searchInput, $products], (searchInput, products) => { return products.filter(product => product.name.includes(searchInput)); } ); 48 @evilmartians
Using computed store in components: // components/Catalog.tsx import { useStore
} from '@nanostores/react'; import { $filteredProducts } from 'core/state'; // Usage is exactly the same: const Catalog = () => { const filteredProducts = useStore($filteredProducts); return <>{filteredProducts.map((product) => <Card product={product} />)}</>; }; 49 @evilmartians
50 @evilmartians
So, what is next? 1. Try out a new approach
to state management in your own project. 2. See the power of simplicity! 51 @evilmartians github.com/nanostores
ninaTorgunakova 52 @evilmartians Questions? github.com/nanostores