JavaScript you actually need for React.
Learn the idea. Play with it. Break it. Use it in React. Build something real.
jsToReact is a practical learning path that teaches the JavaScript that shows up in real React code, then uses it to build a small issue tracker called TinyBoard from scratch.
No JavaScript encyclopedia. No React crash course. Just the parts that matter, in the order they matter.
You're comfortable with HTML and CSS. You know what a variable and a function are. You want to build React apps without spending weeks memorizing syntax you won't use for a long time.
Most learning material is either a wall of API docs or a tiny "build a counter" demo.
This path is built around one idea:
understand one concept
↓
try a tiny example
↓
predict the result
↓
do a small exercise
↓
connect it to React
↓
add it to TinyBoard
You don't collect knowledge. You build a thing.
You start with a few plain JavaScript objects. By the end, you have a working issue tracker with:
- reusable React components
- create, edit, and delete flows
- search, filters, and sorting
- forms with validation
- local persistence
- URL routing
- custom hooks
- behavior tests
- keyboard shortcuts and accessible UI
The finished version lives in app/. You build your own in sandbox/.
The finished version is a reference, not a thing to copy from. If you're stuck for a while, sure, look. But make sure you understand what you copied before moving on.
Read START-HERE.md. Then LEARNING-MAP.md for the full path.
Part 1 — JavaScript you'll actually use
- Values, variables and data
- Functions, parameters and return
- Arrays, objects and data shape
- Arrow functions and callbacks
- Destructuring and defaults
map,filter,find,some- Conditions you'll use in UI code
- Spread, references and immutability
- Modules:
importandexport - Async JavaScript,
fetchand errors
Part 2 — React without magic
- What React is actually doing
- Components and JSX
- Props and one-way data flow
- Events and event handlers
- State and
useState - Rendering lists and using keys
- Forms and controlled inputs
- Updating arrays and objects in state
- Derived data and better state design
- Sharing state and component composition
- Refs and the DOM escape hatch
- Effects: when you need them and when you don't
- Routing and URL parameters
- Reusable logic with custom hooks
- Loading, error and empty states
- Testing behavior instead of implementation
- Accessibility, debugging and cleanup
Each lesson is small. Most take 20–40 minutes if you actually do the exercises.
You need Node.js 22.12 or newer.
node --versionClone the repo, then install in the two project folders:
cd sandbox
npm install
cd ../app
npm installYou'll only install once per folder.
In sandbox/ and app/:
npm run dev # start the dev server
npm run build # production build
npm run test # run the tests once
npm run test:watch # run tests in watch mode
npm run lint # check for lint errors
npm run format # format with PrettierFor JavaScript lessons 01–10 you can also run a challenge directly:
node challenge.jsREADME.md # this file
START-HERE.md # read this first
LEARNING-MAP.md # the full path at a glance
PROJECT-JOURNEY.md # what TinyBoard looks like at each checkpoint
HOW-TO-THINK.md # a few mental models worth keeping
WHAT-NOT-TO-LEARN-YET.md # topics you can safely skip for now
REFERENCE-NOTES.md # choices the reference app makes and why
BONUS.md # where to go after the core path
lessons/ # 27 lessons, each with README + EXERCISES + challenge + solution
sandbox/ # your TinyBoard, starts almost empty
app/ # the finished reference TinyBoard
This path was written by a developer for a friend, not generated to fill a course template. The lessons try to explain the parts that actually trip people up, in the order they trip them up, and to be honest about what's worth learning now versus later.
If a section feels like it's hedging or repeating itself, that's intentional. Some ideas need to be said more than once before they stick.
This is a personal learning repo. Fork it, change the order, replace TinyBoard with your own project idea. The point is the path, not the specific app.