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
1
550
Smart Nano Stores, or how we made front-end simpler (for the FOF meetup in Lisbon)
Nina Torgunakova
November 09, 2023
Tweet
Share
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
820
Unveiling Nano Stores
ninoid
0
790
Умные nano stores, или как мы сделали веб-разработку проще
ninoid
0
940
Solving algorithms: beyond cramming for job interviews
ninoid
0
2k
Other Decks in Programming
See All in Programming
CSC305 Summer Lecture 12
javiergs
PRO
0
130
Constant integer division faster than compiler-generated code
herumi
2
700
Google I/O recap web編 大分Web祭り2025
kponda
0
2.9k
「リーダーは意思決定する人」って本当?~ 学びを現場で活かす、リーダー4ヶ月目の試行錯誤 ~
marina1017
0
240
Oracle Database Technology Night 92 Database Connection control FAN-AC
oracle4engineer
PRO
1
220
『リコリス・リコイル』に学ぶ!! 〜キャリア戦略における計画的偶発性理論と変わる勇気の重要性〜
wanko_it
1
600
TanStack DB ~状態管理の新しい考え方~
bmthd
2
340
LLMOpsのパフォーマンスを支える技術と現場で実践した改善
po3rin
8
990
サーバーサイドのビルド時間87倍高速化
plaidtech
PRO
0
520
Honoアップデート 2025年夏
yusukebe
1
860
Nuances on Kubernetes - RubyConf Taiwan 2025
envek
0
200
Jakarta EE Core Profile and Helidon - Speed, Simplicity, and AI Integration
ivargrimstad
0
210
Featured
See All Featured
Building Adaptive Systems
keathley
43
2.7k
Music & Morning Musume
bryan
46
6.7k
Raft: Consensus for Rubyists
vanstee
140
7.1k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.9k
Agile that works and the tools we love
rasmusluckow
329
21k
A Modern Web Designer's Workflow
chriscoyier
695
190k
A designer walks into a library…
pauljervisheath
207
24k
Embracing the Ebb and Flow
colly
87
4.8k
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.5k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Documentation Writing (for coders)
carmenintech
73
5k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.5k
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