Ives van Hoorne
@compuives

Co-Founder @ CodeSandbox
Eeeevs
Aives
Flip
https://codesandbox.io

Inner Workings
Future
Story

5 years back


What if I put my local editor on
the web?







31 October 2016
11 November 2016


25 November 2016

26 November 2016
17 December 2016

29 December 2016

Component Editor
Component Library Builder
Online Component Library Builder
Online React Editor
Let the idea
evolve
26 January 2017

I lost motivation


Seek external feedback
Release fast
Follow KISS
Keep it simple, stupid
Don't overengineer

Values
Accessibility
Collaboration
Empowerment
Lower the learning curve
Encourage Sharing & Discovery
Stay in flow
So, what is CodeSandbox today?
And how does it work?

In-Browser Bundler
In-Browser VSCode
Live Collaboration
Challenges
-
Bundling
-
NPM Dependencies

Before
import Hello from './Hello';
var Hello = require('./Hello').default;
Evaluate
JavaScript
Transpiled
const require = (path) => { };
(0, eval)(transpiledCode)
Limitations
1. Everything needs to be synchronous
2. No parallelization
3. No support for emitting module
- .vue => {.css, .js, .js}
4. No chained loaders
- sass => css => css modules
Now
Evaluate
Files
Transpiled









var

var

var

var

var

var
Workers
https://codesandbox.io/s/example-bundler-2-bru8v
Challenges
-
Bundling
-
NPM Dependencies

npm
npm
Create React App
158MB
Average Phone
1MB/s
3 minutes
creating a package






























creating a package
saving the package
react@16.2.0.json

npm
react@16.2.0 & react-dom@16.2.0
I want
Packager
Packager
react
react-dom


Merge Dependencies
browser
It's not perfect
unpkg.com/react-icons/fa/beer.js

unpkg.com/react-icons/?meta
Sandpack
https://github.com/codesandbox/sandpack
https://sandpack.vercel.app/

In-Browser Bundler
In-Browser VSCode
Live Collaboration
VSCode Themes


.tmLanguage

oniguruma
onigasm

NeekSandhu
What about extensions?

How VSCode Extensions Work
VSCode + UI
Extension Host
tsserver
CodeSandbox Scenario #1
CodeSandbox
Extension Host
tsserver
bridge
CodeSandbox Scenario #2
CodeSandbox
Extension Host
tsserver
VSCode
Node
Shims
Node
Shims

Main Process
Renderer Process
Renderer Process
fs
net
tty
module
http
os
electron
Try #1







fileService
notificationService
clipboardService
storageService
requestService
editorService
codeSandboxService
fileService
storageService
Try #2
Requirements
Don't change code
Expose VSCode as an API
Keep it fast and small
The Future of CodeSandbox™
Sandboxes
Prototypes
Bug Reports
Workshops
Job Interviews
Examples
Demos

Excalidraw
Sandbox
Project
CodeSandbox Projects
Single click fork
Start in single click
No configuration
Share with a link
Customizable devtools
But for git repositories
Live collaboration
Every branch is shared


Every branch is shared



Every branch is shared









Clicking "Fork" creates new branch





Clicking "Fork" creates new branch





Every branch is backed by a VM









/:owner/:repo/main
/:owner/:repo/feature/branch
Every VM is backed by a URL







/:owner/:repo/main
/:owner/:repo/feature/branch


But you can use any editor you like
with live collaboration!

Demo
Future Work

Thanks a lot!
@compuives
codesandbox/codesandbox-client

Facebook Talk CodeSandbox
By Ives van Hoorne
Facebook Talk CodeSandbox
- 858