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
Space City JS — Using Electron & React to Build N1
Search
Nylas
May 14, 2016
Programming
120
0
Share
Space City JS — Using Electron & React to Build N1
Using Electron & React to Build N1: The Open Source Email Client
Nylas
May 14, 2016
More Decks by Nylas
See All by Nylas
Switching Off to Switch On!
nylas
1
110
Why Observability Matters
nylas
0
460
Billions of Emails Synced with Python
nylas
0
320
Profiling Python in Production
nylas
1
230
Debugging Python using GDB
nylas
0
75
Plugins with React & Challenges with Data
nylas
0
120
Waffle JS: Desktop Apps with Electron, React, & Observables
nylas
0
460
Electron, Node, and the New Desktop @ SFNode
nylas
0
350
The New Desktop: Electron, React, and Pixel-Perfect Native-Feeling Experiences — Forward 4 Web Summit
nylas
1
980
Other Decks in Programming
See All in Programming
The Arts and Crafts of Work in the AI Era — Toward Mastery in Software Development
kuranuki
0
360
AIエージェントの隔離技術の徹底比較
kawayu
0
430
要はバランスからの卒業 #yumemi_grow
kajitack
0
190
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
190
Skillは並べた。動かなかった。契約で繋いだ。— 65個のSkillから、自走する開発サイクルへ
junholee
0
740
AI Agent と正しく分析するための環境作り
yoshyum
2
610
AI時代になぜ書くのか
mutsumix
0
450
開発とはなにか、Essenceカーネルで見えるもの
ukin0k0
0
210
TSKaigi 2026 TypeScriptバックエンドのオブザーバビリティ戦略 — Datadog × NestJSの実践
taiseiyamamotoan
1
190
GitHub Copilot CLIのいいところ
htkym
2
1.1k
関係性から理解する"同一性"の型用語たち
pvcresin
2
530
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
7
2k
Featured
See All Featured
Docker and Python
trallard
47
3.8k
The Limits of Empathy - UXLibs8
cassininazir
1
340
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
Amusing Abliteration
ianozsvald
1
180
For a Future-Friendly Web
brad_frost
183
10k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
190
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.5k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
360
The Invisible Side of Design
smashingmag
302
52k
Site-Speed That Sticks
csswizardry
13
1.2k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
510
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.4k
Transcript
Using Electron & React to Build N1: The Open Source
Email Client Evan Morikawa | @e0m |
[email protected]
| May 14 2016 Nylas
Standing on the shoulders of giants Evan Morikawa | @e0m
|
[email protected]
| May 14 2016 Nylas
None
None
None
None
None
How do we: Deliver to the desktop Support 3rd party
plugins Keep data & view in sync Work offline Keep it performant Pay it forward
How do we: Deliver to the desktop Support 3rd party
plugins Keep data & view in sync Work offline Keep it performant Pay it forward
None
Shell NW.js (Node Webkit) Swing | Qt | Cocoa |
GTK | WPF/WinRT
Shell
None
None
None
Chromium
Chromium Browser aka Backend aka Main Process
Chromium Browser aka Backend aka Main Process C++
Chromium Browser aka Backend aka Main Process C++ Renderer Renderer
Renderer HTML / JS (DOM) HTML / JS (DOM) HTML / JS (DOM)
Chromium Browser aka Backend aka Main Process C++ Renderer Renderer
Renderer HTML / JS (DOM) HTML / JS (DOM) HTML / JS (DOM) ipc
Browser aka Backend aka Main Process Renderer Renderer Renderer HTML
/ JS (DOM) HTML / JS (DOM) HTML / JS (DOM) ipc
Nylas N1
Nylas N1 main.js
Nylas N1 main.js const win = new BrowserWindow() win.loadURL(`file://index.html`) win.show()
Nylas N1 main.js const win = new BrowserWindow() win.loadURL(`file://index.html`) win.show()
Nylas N1 main.js const win = new BrowserWindow() win.loadURL(`file://index.html`) win.show()
index.html index.js
Nylas N1 main.js const win = new BrowserWindow() win.loadURL(`file://index.html`) win.show()
index.html index.js React.render()
Nylas N1 main.js const win = new BrowserWindow() win.loadURL(`file://index.html`) win.show()
index.html index.js React.render()
Nylas N1 main.js const win = new BrowserWindow() win.loadURL(`file://index.html`) win.show()
index.html index.js React.render() Composer Work Window
None
How do we: Deliver to the desktop Support 3rd party
plugins Keep data & view in sync Work offline Keep it performant Pay it forward
None
None
<div id=“actions”> <SendButton draft={this.props.draft} /> <AttachFileButton draft={this.props.draft} /> <TrashButton draft={this.props.draft}
/> </div>
<div id=“actions”> <InjectedComponentSet location={‘composer-actions’} passedProps={{draft: this.props.draft}} /> </div>
<div id=“actions”> <InjectedComponentSet location={‘composer-actions’} passedProps={{draft: this.props.draft}} /> </div> Actions.registerComponent(TranslateButton, {
location:’composer-actions’ })
None
None
How do we: Deliver to the desktop Support 3rd party
plugins Keep data & view in sync Work offline Keep it performant Pay it forward
React ReactiveX.js Redux Flux +
ReactiveX.js
const q = `SELECT * FROM threads WHERE …` Rx.Observable.fromQuery(q).subscribe((threads)
=> { this.setState({threads}) })
const q = `SELECT * FROM threads WHERE …` Rx.Observable.fromQuery(q)
.filter(myFn).subscribe((threads) => { this.setState({threads}) })
const q = `SELECT * FROM threads WHERE …` Rx.Observable.fromQuery(q)
.filter(myFn) .map(mapFn).subscribe((threads) => { this.setState({threads}) })
How do we: Deliver to the desktop Support 3rd party
plugins Keep data & view in sync Work offline Keep it performant Pay it forward
Web SQL Local Storage
Web SQL Local Storage
Web SQL Local Storage
None
How do we: Deliver to the desktop Support 3rd party
plugins Keep data & view in sync Work offline Keep it performant Pay it forward
None
None
How do we: Deliver to the desktop Support 3rd party
plugins Keep data & view in sync Work offline Keep it performant Pay it forward
None
https://github.com/nylas/n1 Open Source
How do we: Deliver to the desktop Support 3rd party
plugins Keep data & view in sync Work offline Keep it performant Pay it forward
N1 Core Team @e0m @bengotow @juanstejada YOU! @karim_hamidou @jackiehluo
N1 Extended Team
Evan Morikawa | @e0m |
[email protected]
| May 2016 Thank
you Slides here