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
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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
240
Debugging Python using GDB
nylas
0
77
Plugins with React & Challenges with Data
nylas
0
130
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
AIだと陥りがちなJakarta EE最新技術への移行時の落とし穴と解決策
tnagao7
0
100
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
210
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
330
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
190
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
260
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
7
4.1k
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2k
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
150
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
150
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
120
Oxcを導入して開発体験が向上した話
yug1224
4
310
Signal Forms: Beyond the Basics @ngBaguette 2026 in Paris
manfredsteyer
PRO
0
240
Featured
See All Featured
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
310
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
Building an army of robots
kneath
306
46k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.5k
Fireside Chat
paigeccino
42
3.9k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
200
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
270
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.7k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
200
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
360
Designing for Performance
lara
611
70k
GitHub's CSS Performance
jonrohan
1033
470k
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