JSConf
Traditional MVC frameworks fail at scale because bi-directional data binding creates brittle mutation cascades, which React eliminates by treating views as pure transforms that compute minimal browser patches.
AI-assisted summary of [JSConfUS 2013] Tom Occhino and Jordan Walke: JS Apps at Facebook — original source. Check the original for full context.
Source published:
Key ideas
- Facebook officially open-sourced React at JSConf US 2013, releasing the client-side UI library on GitHub after roughly 18 to 24 months of internal production development. (17:57)
- React rejects two-way data binding and observable models, instead using a unidirectional flow where interfaces are declared as pure transforms of application state and re-rendered conceptually from scratch on every change. (2:37)
- To bypass the performance bottleneck of touching real browser DOM nodes, React generates an internal element representation and reconciles changes via recursive tree diffing to execute only minimal DOM updates. (3:44)
- The acquisition of Instagram acted as the key forcing function to decouple React from proprietary Facebook infrastructure, proving its standalone viability by powering the web profiles on instagram.com. (15:28)
Detailed notes
## Background Published by JSConf on YouTube on August 5, 2013, this presentation features Facebook engineers Tom Occhino and Jordan Walke delivering their talk titled "JS Apps at Facebook." While no video description is provided on the page, the session serves as the historic public unveiling of React and its underlying architectural philosophy.
## TL;DR Tom Occhino and Jordan Walke challenge traditional client-side MVC architectures, arguing that bi-directional data binding and manual view mutation create brittle, overly complex systems. They introduce React, a library designed around the radical mental model of re-rendering the entire user interface from scratch whenever state changes, made computationally feasible through an internal reconciliation diffing engine. Walke demonstrates how JSX, declarative components, and state transitions via setState isolate updates and unlock decoupled workflows such as server-side rendering. Occhino closes by explaining how Instagram's acquisition served as the forcing function to untangle React from Facebook's proprietary infrastructure, culminating in the live announcement that React had just been open-sourced on GitHub.
## Atmosphere & style The presentation carries an engaging split dynamic, alternating between Occhino’s conversational, high-level storytelling and Walke’s deliberate, code-centric walkthrough. There is a palpable sense of bold, quiet conviction as the speakers casually challenge the prevailing front-end orthodoxies of MVC and observable data models with radical concepts like JSX and full-tree re-renders. The talk transitions smoothly from philosophical debate to hard-nosed engineering realities, ending on an electric, historic high note when the room erupts in applause at the surprise reveal that React was published to open source just thirty minutes before.
## Bulletin - [17:57](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=1077s) Facebook officially open-sourced React at JSConf US 2013, releasing the client-side UI library on GitHub after roughly 18 to 24 months of internal production development. - [02:37](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=157s) React rejects two-way data binding and observable models, instead using a unidirectional flow where interfaces are declared as pure transforms of application state and re-rendered conceptually from scratch on every change. - [03:44](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=224s) To bypass the performance bottleneck of touching real browser DOM nodes, React generates an internal element representation and reconciles changes via recursive tree diffing to execute only minimal DOM updates. - [15:28](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=928s) The acquisition of Instagram acted as the key forcing function to decouple React from proprietary Facebook infrastructure, proving its standalone viability by powering the web profiles on instagram.com.
## Key takeaways - [00:00](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=0s) Traditional MVC and MVW frameworks rely on observable models and bi-directional data binding, which inherently encourage and complicate manual state mutation. - [00:00](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=0s) Facebook sought an architecture that eliminates manual mutation orchestration, adopting a single, controlled update channel that flows downward toward the view. - [02:37](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=157s) The conceptual model behind React is rendering the entire view from scratch on every event, bypassing the need for complex state-synchronization logic. - [02:37](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=157s) Because direct DOM teardown and recreation is prohibitively expensive, React introduces a reconciliation layer to make full conceptual re-renders computationally feasible. - [03:44](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=224s) JSX serves as an optional, lightweight syntactic transform that maps XML tags directly into JavaScript function calls without altering line numbers or breaking linter diagnostics. - [03:44](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=224s) JSX tags do not instantiate actual DOM nodes; they create lightweight internal React element representations. - [05:53](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=353s) React components function as pure transforms from input properties (`this.props`) to UI descriptions, avoiding deep object-oriented inheritance hierarchies. - [10:12](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=612s) Interactive components act as state machines, utilizing `getInitialState` to define their baseline and `setState` to perform discrete state transitions that trigger re-rendering. - [12:17](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=737s) The component lifecycle separates initial string markup generation from object instantiation and event binding, enabling server-side rendering on separate machines. - [12:17](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=737s) Reconciliation recursively compares subsequent render trees to compute minimal DOM patches, updating deeply nested text nodes without reading from the DOM. - [14:19](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=859s) React incorporates escape hatches for raw DOM access, facilitating gradual adoption alongside existing third-party JavaScript libraries and legacy codebases. - [14:19](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=859s) Performance optimization hooks allow developers to prune entire subtrees from the reconciliation diff search space as an afterthought rather than a structural development tax. - [15:28](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=928s) Prior to open sourcing, React was heavily battle-tested across core Facebook features including Chat, comments, notifications, like buttons, and buddy lists. - [15:28](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=928s) Instagram engineers refactored React to eliminate proprietary internal dependencies, successfully running all of instagram.com on the framework within weeks. - [17:57](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=1077s) Facebook concluded the presentation by open-sourcing React under the Facebook GitHub organization and inviting community contributions via IRC and mailing lists.
## Detailed walkthrough ### [00:00](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=0s) Rethinking UI Architecture: Beyond MVC and Mutation
Tom Occhino opens the presentation by thanking Chris and explaining the split format of the talk: Tom will handle the high-level conceptual background, while Jordan Walke will cover the deeper technical details of how the library works under the hood. Tom focuses directly on client-side web browser applications, noting that while Facebook runs Node.js and other server infrastructure, the core question they have revisited constantly is how to structure user interfaces. Over the years, the web development community moved the platform forward through frameworks that embraced Model-View-Controller (MVC) or its variants like MVVM and AngularJS's "Model View Whatever" (MVW). Tom notes that while he genuinely admires Angular's declarative data binding—describing it as something of a "Holy Grail in terms of APIs"—most of these frameworks share a fundamental architectural dependency on observable models.
```mermaid flowchart LR accTitle: Bi-directional Data Binding Cycle accDescr: Diagram contrasting bi-directional MVC binding against React's unidirectional rendering flow.
subgraph BiDirectional["Traditional MVC / MVW (Bi-directional)"] M["Observable Model"] <-->|"Two-way data binding"| V["Views / DOM"] end
subgraph UniDirectional["Facebook Architecture (Unidirectional)"] In["User Input / Updates"] --> Flow["Single Channel Flow"] Flow --> State["Application State"] State -->|"Blow away and re-render"| RV["View (Pure Transform)"] end ```
In standard MVC systems, models implement observable objects backed by event listeners and event emitter APIs. Developers then use two-way (bi-directional) data binding to link views to these models: when a model mutates, views re-render or patch their nodes, and when a user alters a view, it directly updates the model, cascading mutations back out to other dependent views across the system. Tom emphasizes that this observable pattern fundamentally relies on and encourages continuous mutation. As Tom puts it:
> “So this observable model pattern encourages mutation though and mutation is complex.”
Starting several years prior during a complete rewrite of Facebook Chat, the team set out to drastically reduce the amount of mutation that application engineers had to write or manually coordinate.
- Acknowledges Peter Higgins and Dojo's pioneering role in client-side framework design ("Dojo did it first"). - Identifies mutation as an unavoidable, necessary evil in stateful user interfaces, but argues that application developers should not be responsible for orchestrating it by hand. - Contrasts bi-directional binding cascades with a single, controlled update channel that feeds data downward toward the view layer.
---
[02:37](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=157s) The Dream of Re-rendering Everything: Introducing React
When evaluating how to eliminate manual view mutation, the Facebook team arrived at a radical mental model: whenever application state changes, simply destroy the existing UI and rebuild the entire view tree from scratch. Tom acknowledges the immediate skepticism of this approach, recognizing that anyone familiar with web performance will point out that touching the real DOM is notoriously slow and that tearing down and re-creating HTML elements on every real-time event would be prohibitively expensive.
Despite the obvious DOM performance bottleneck, Facebook realized that from a developer-experience and conceptual standpoint, rendering from scratch on every change is vastly superior because it frees engineers from writing state-synchronization logic. To bridge the gap between this clean conceptual model and real-world browser constraints, they spent 18 to 24 months developing a dedicated library designed to make total re-renders feasible without the DOM overhead. Tom formally introduces this library as React:
> “We want to build something that gives us the conceptual simplicity of rendering from scratch on every single event, um, but you know, without the overhead because that's prohibitively expensive.”
- Development on React began roughly 18 months to two years before this presentation (circa late 2011 to early 2012). - The core design goal was preserving the developer ergonomics of a pure, top-down full re-render while abstracting away the underlying browser penalties.
---
[03:44](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=224s) Declarative Views and the JSX Syntax
Jordan Walke takes the stage to explain how React realizes these design goals. React minimizes developer-facing mutation through a strictly declarative programming model. Rather than writing procedural DOM manipulation code, developers provide a non-mutative description of what the user interface should look like across all points in time. React explicitly ships without built-in observable data binding; instead, it replaces the need for observables with declarative UI definitions.
To make declaring tree structures natural inside JavaScript, Facebook introduced an optional embeddable XML syntax named JSX. Jordan emphasizes that unlike older XML-in-script proposals, JSX is not a heavy domain-specific language or runtime framework; it is a straightforward syntactic transform that converts XML tags directly into standard JavaScript function invocations.
```mermaid flowchart TD accTitle: JSX Compilation and Component Rendering Pipeline accDescr: Pipeline showing how JSX transforms to function calls, produces virtual React elements, and reconciles into minimal DOM patches.
subgraph SyntaxTransform["Build / Compile Step"] JSX["JSX Syntax<br/><code><ActionButton text='...' /></code>"] -->|"Lightweight AST Transform"| JS["Function Invocations<br/><code>React.DOM.div(...)</code>"] end
subgraph Runtime["React Runtime"] JS --> ElementTree["React Component Tree<br/>(Lightweight Objects, not DOM)"] ElementTree --> Reconcile{"Diff with Previous Tree"} Reconcile -->|"Compute Minimal Mutations"| DOMPatch["Single Span Text Update"] end ```
The resulting code preserves original line numbers precisely, ensuring that linters (such as JSHint) and stack traces report errors on the exact lines where variables or syntax issues appear. Furthermore, tags like `<div>` in JSX do not instantiate real browser DOM nodes; they instantiate lightweight internal React element representations.
- JSX is fully optional: engineers can choose to write raw JavaScript function calls directly, though JSX provides a far more readable representation of nested interfaces. - Tooling simplicity and fast compilation workflows were prioritized over creating an entirely separate templating language. - Linters can immediately spot out-of-scope component identifiers because custom tags map directly to in-scope JavaScript variables.
---
[05:53](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=353s) Custom Components, Props, and Pure Transforms
Jordan explains that React is primarily an abstraction tool designed to build reusable custom components while encapsulating UI implementation details. Components are instantiated with JSX using standard XML-style attributes, which are passed into the component instance as `this.props`. Rather than relying on heavyweight object-oriented class hierarchies, components are defined by passing an object specification to `React.createClass`.
```javascript // Example component definition structure discussed by Jordan var ActionButton = React.createClass({ render: function() { return ( <button onClick={this.props.onAction}> <span>{this.props.text.toUpperCase()}</span> </button> ); } }); ```
A component must supply a `render` method, whose entire responsibility is to describe the component's UI at any given point in time. Inside JSX, curly braces allow arbitrary JavaScript expressions to be interpolated, transforming properties directly into the rendered output (such as running `.toUpperCase()` on `this.props.text`). Because JSX is embedded directly in JavaScript, event handlers like `onAction` can accept first-class functions rather than string evaluations. As Jordan describes this mental model:
> “And so it helps to view, at least initially, a react component as a transform from these properties into a user experience and you can just kind of imagine these being routed to their proper locations.”
When a component's input properties change over time, the `render` function runs again, producing a new description of the UI. React then compares this description with the previous output and computes the absolute minimum set of DOM mutations required to bring the browser into alignment—such as updating only the `textContent` of an inner `<span>` while leaving the outer `<button>` untouched.
- `React.createClass` mixes React’s base component behaviors into the prototype while deliberately avoiding deep object-oriented class inheritance trees. - Attributes passed to components are not restricted to strings; they accept functions, objects, and any valid JavaScript expression. - The `render` method is a pure projection over time, not a one-off setup script that only runs during initial page load. - Having demonstrated stateless components driven solely by properties, Jordan transitions to explaining how React manages internal state for complex, interactive applications.
[10:12](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=612s) Components as State Machines: `getInitialState` and `setState`
Jordan Walke demonstrates how React handles interactive applications that require more than simple stateless views. If developers want to build real application logic, components need to assume the role of a state machine, which inherently requires an initial state. React provides a dedicated method called `getInitialState` to define this starting baseline. In the walkthrough example, a counter component reuses the previously defined `ActionButton` component twice—once to increment and once to decrement. The component initializes its state property `count` from `this.props.initialCount` (which receives a value of `4` in the demo).
```mermaid flowchart LR accTitle: React Component State Transition accDescr: Flow diagram showing how user actions trigger setState to transition state and re-render the view. subgraph UI ["User Interaction"] A["ActionButton Click"] end subgraph StateMachine ["State Transition"] B["addToCount(delta)"] C["setState()"] end subgraph View ["Render Output"] D["render()"] E["H3 Text Node Updated"] end A --> B B --> C C --> D D --> E ```
Just as components can read `props` inside their `render` function and rely on React to keep them fresh, they can read `this.state` with the identical guarantee. Any time state or props change, the render output stays satisfied by the React system. For example, an `<h3>` tag displays the current `this.state.count`, but developers are free to insert arbitrary JavaScript expressions or ternaries to show custom contextual messaging depending on the numeric tally. To trigger actual mutations, the component binds an `addToCount` callback to the buttons' action events with a delta of `+1` or `-1`. As Jordan explains the architectural concept behind state updates: “If our components are a state machine then set state is how you perform State transitions on the state machine and what we do is we set the next count to be equal to the current count plus the Delta.”
[12:17](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=737s) Component Lifecycle: Initial Render, Server Rendering, and Reconciliation
Jordan outlines the two primary stages of a React component's lifecycle: initial rendering and data reconciliation. In the initial render pass, React prioritizes architectural flexibility by computing a single giant markup string across the entire component hierarchy tree and injecting it into the target container. Immediately following that markup generation, a secondary phase instantiates all backing objects and wires up the event handlers. Because these two initial phases are decoupled, they can run in completely separate computing environments across the globe. As Jordan points out: “So you could in theory render the markup on a server and then attach all the event handlers and instantiate all the backing views on the client two completely separate machines.”
```mermaid flowchart TD accTitle: React Lifecycle and Reconciliation Flow accDescr: Diagram illustrating the two phases of React component lifecycle from initial string markup to recursive diffing. subgraph InitialPhase ["Initial Render Stage"] A["Traverse Component Tree"] --> B["Generate Giant Markup String"] B --> C["Inject DOM Markup"] C --> D["Instantiate Backing Objects & Bind Event Handlers"] end subgraph UpdatePhase ["Reconciliation Stage"] E["Data / State Change"] --> F["Subsequent render() Invocations"] F --> G["Recursive Tree Diffing"] G --> H["Serialize Minimal Mutation Commands"] H --> I["Apply Diff to DOM (Zero Unnecessary Reads)"] end ```
The second lifecycle phase begins whenever underlying data changes and the user interface must be refreshed. React handles this through reconciliation: recursively comparing the outputs of subsequent invocations of `render` to compute the smallest structural diff possible. Rather than tearing down elements, React serializes minimal mutation commands across a logical bridge to the DOM. If a single class name, style attribute, or child node changes fifty levels deep inside a complex hierarchy—such as button text changing from "book flight" to "book hotel"—React executes only the single DOM mutation necessary to update that inner text span, avoiding reads from the DOM entirely.
[14:19](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=859s) Escape Hatches, Pragmatic Integration, and Pruning the Diff Search Space
Acknowledging that conference talks typically showcase contrived demos, Jordan addresses real-world constraints by detailing React's escape hatches. Applications rarely exist in a vacuum; developers must integrate with preexisting libraries and legacy codebases. React accommodates this by offering hooks to drop down directly into raw DOM access whenever necessary. Furthermore, because computing a diff across massive tree structures can become computationally expensive, React provides optional escape hatches that allow developers to help guide the reconciliation engine.
These performance escape hatches allow engineers to prune large sections of the diff search space early, signaling to React when whole subtrees have not changed and do not need inspection. Jordan emphasizes that performance tuning is designed to be an afterthought rather than a structural tax on everyday development: “So those are completely optional you can you can put them in your code or you can take them out and the same application runs just faster or slower so it's treat it's it's treating this optimization step as a completely a completely separate part of development it's not core you don't start with the optimizations but you you identify the bottlenecks and apply them where necessary.”
[15:28](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=928s) Production Battle-Testing at Facebook and the Instagram Forcing Function
Jordan hands the presentation back to Tom Occhino, who reinforces why escape hatches were vital to React's survival and adoption inside Facebook. Instead of requiring developers to rewrite entire systems from scratch, React allowed teams to adopt it piecemeal. If a team needed an auto-growing textarea or a third-party autocomplete widget, they could simply ask React for the underlying DOM node and initialize their existing JavaScript plugins directly. As Tom highlights: “Another hook that you get is basically at any point you can say just give me a DOM node and let me write JavaScript.” This evolutionary, non-dogmatic strategy enabled React to gain significant ground over the preceding 18 months to two years, powering heavily trafficked Facebook features including comment threads, like buttons, chat windows, buddy lists, and notifications.
The catalyst for open sourcing React arrived when Instagram was acquired by Facebook about a year prior. Historically, Facebook presentations at JSConf carried the caveat that internal technologies were too tightly bound to internal server and build infrastructures to ever be released. Instagram wanted to adopt Facebook's frontend infrastructure, but their stack ran outside of Facebook's corporate environments. Taking inspiration from a talk by Rebecca Murphey about authoring code as though it is open source from day one, Facebook's engineers set out to decouple React from proprietary internals.
- Instagram engineers served as the critical forcing function, refactoring React and its build tooling so it could run anywhere. - Within one to two weeks of joining, the Instagram team used React to build the entire web profile experience on `instagram.com`. - With all of `instagram.com` successfully running on React, Facebook had an external-style client proofing the framework's modularity.
[17:57](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=1077s) Open Source Release Announcement and Community Invitation
Having validated React outside of Facebook's monolithic codebase with Instagram, the engineering team realized the technology was ready for the broader JavaScript ecosystem. Tom surprises the JSConf audience with a live release announcement: “The Logical next step for all the people that have been working on this this is you know you know we want to open source this and actually incidentally we did that about a half hour ago.”
The audience breaks into enthusiastic applause as Tom invites the community to explore the newly launched project on GitHub under the Facebook organization. In closing, Tom adopts a humble tone, stressing that React is simply a tool that solved difficult synchronization problems for Facebook and that the team is eager for community feedback. He encourages attendees to get involved, contribute, and report bugs across the newly established GitHub repository, IRC chat room, and Google Groups mailing list.
## Notable quotes > [02:37](https://www.youtube.com/watch?v=GW0rj4sNH2w&t=157s) We want to build something that gives us the conceptual simplicity of rendering from scratch on every single event, um, but you know, without the overhead because that's prohibitively expensive. — Tom Occhino
## Mentioned Tom Occhino, Jordan Walke, Chris, Facebook, Node.js, AngularJS, Peter Higgins, Dojo, React, JSX, JSHint, Instagram, Rebecca Murphey, GitHub, Google Groups, IRC
[Source](https://www.youtube.com/watch?v=GW0rj4sNH2w)