Skip to main content

What is Tracker?

Tracker is an incredibly tiny (~1k) but incredibly powerful library for transparent reactive programming in JavaScript. It gives you much of the power of Functional Reactive Programming (FRP) without requiring you to rewrite your program as a data flow graph.
Tracker is essentially a simple convention that lets reactive data sources (like your database) talk to reactive data consumers (such as a live-updating HTML templating library) without the application code in between having to be involved.

The Big Idea

With Tracker, you write normal JavaScript code, but it automatically reruns when data changes:

Core API

Tracker.autorun

Runs a function now and reruns it whenever dependencies change:
The function is called once immediately, then again whenever any reactive data source it accessed changes.

Tracker.Dependency

Creates a reactive data source:

Tracker.Computation

Represents a reactive computation:

Tracker.nonreactive

Run code without tracking dependencies:

Reactive Data Sources

Meteor provides several built-in reactive data sources:

ReactiveVar

A single reactive value:

ReactiveDict

A reactive key-value store:

Session (Global ReactiveDict)

Session is global and persists across hot code pushes. Use with caution in larger apps - prefer component-level ReactiveDict or ReactiveVar.

Minimongo Collections

Database queries are reactive:

Meteor.user() and Meteor.userId()

Current user is reactive:

Real-World Example: Temperature Monitor

Here’s the complete temperature example from Tracker’s README:

Integration with UI Libraries

React

Use useTracker hook:

Blaze

Blaze templates are automatically reactive:

Vue

Use autorun in lifecycle hooks:

Advanced Patterns

Computation Lifecycle

Async Autoruns (Meteor 3.x)

Meteor 3 supports async autoruns:

Throttling Reruns

Selective Invalidation

How It Works Internally

Here’s the actual implementation from packages/tracker/tracker.js:

Dependency Implementation

Global State

Autorun Implementation

Performance Considerations

Each autorun has overhead. Combine related logic:
Reactive queries only invalidate when results change:
Clean up when done:
In React:

Debugging Reactivity

Next: DDP Protocol

Learn about Meteor’s real-time data protocol