415 job postings show the same stack repeating. React, TypeScript, Node.js, plus a layer of AI and infrastructure. Here are the exact code patterns that map to those requirements.
1. Typed React Props That Eliminate Runtime Bugs
Most React roles assume TypeScript even when not listed. This is the baseline filter.
Before (JavaScript)
function UserCard({ user }) {
return <div>{user.name}</div>
}
After (TypeScript)
type User = {
id: string
name: string
email?: string
}
type Props = {
user: User
}
export function UserCard({ user }: Props) {
return <div>{user.name}</div>
}
This removes an entire class of runtime errors. Teams expect this level by default. It reduces production bugs and improves IDE inference immediately.
2. Co-located API Routes with Next.js
Next.js appears in a growing share of postings because companies want full stack ownership.
Before (separate backend service)
// Express API
app.get('/api/user/:id', async (req, res) => {
const user = await db.user.findById(req.params.id)
res.json(user)
})
// React frontend
fetch(`/api/user/${id}`).then(res => res.json())
After (Next.js route handler)
// app/api/user/[id]/route.ts
import { NextResponse } from 'next/server'
export async function GET(
request: Request,
{ params }: { params: { id: string } }
) {
const user = await db.user.findById(params.id)
return NextResponse.json(user)
}
// server component
const user = await fetch(`/api/user/${id}`).then(res => res.json())
One repo. One deployment. Less latency. This is why full stack React roles are growing.
3. Node.js Service Layer with Type Safety
Node.js shows up in a quarter of postings. Not as scripts. As structured services.
Before (inline DB calls)
app.get('/orders', async (req, res) => {
const orders = await db.query('SELECT * FROM orders')
res.json(orders)
})
After (service layer + types)
type Order = {
id: string
total: number
}
class OrderService {
async getAll(): Promise<Order[]> {
return db.order.findMany()
}
}
const service = new OrderService()
app.get('/orders', async (req, res) => {
const orders = await service.getAll()
res.json(orders)
})
Separation of concerns. Easier testing. This is expected at mid to senior level.
4. Streaming AI Responses in the UI
31% of postings mention AI. Not model training. Integration.
Before (blocking response)
const response = await openai.chat.completions.create({
model: 'gpt-4',
messages: [{ role: 'user', content: prompt }]
})
return response.choices[0].message.content
After (streaming response)
const stream = await openai.chat.completions.create({
model: 'gpt-4',
messages: [{ role: 'user', content: prompt }],
stream: true
})
for await (const chunk of stream) {
const content = chunk.choices[0]?.delta?.content
if (content) {
process.stdout.write(content)
}
}
// React streaming UI
const [text, setText] = useState('')
useEffect(() => {
const eventSource = new EventSource('/api/stream')
eventSource.onmessage = (event) => {
setText(prev => prev + event.data)
}
return () => eventSource.close()
}, [])
Streaming is now a UX requirement. Chat, autocomplete, assistants all depend on it.
This pattern compounds with the broader shift described in the AI augmented JavaScript developer workflow where developers integrate AI directly into product features.
5. Dockerized Node App for Deployment Readiness
Infrastructure shows up in descriptions even when not tagged.
Before (local only)
node server.js
After (Dockerized service)
FROM node:20
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
docker build -t app .
docker run -p 3000:3000 app
This is the difference between “it works” and “it ships.” Many React roles now expect this.
6. CI Pipeline That Actually Deploys Code
CI/CD is mentioned in a large share of mid and senior roles.
Before (manual deploy)
git push
ssh server
git pull
npm install
pm2 restart
After (GitHub Actions)
name: Deploy
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install
run: npm install
- name: Test
run: npm test
- name: Build Docker
run: docker build -t app .
- name: Deploy
run: docker run -d -p 3000:3000 app
Automated pipelines reduce deployment time from minutes to seconds and remove human error.
Closing
If your codebase does not look like these patterns, you are not matching what companies are hiring for. Start with TypeScript, add Next.js, structure your Node services, then layer AI and deployment.
Pick one pattern. Implement it today. That is how you move from “React developer” to “hireable engineer.”
Top comments (0)