The Problem
You’re building a React app. And you keep typing the same boilerplate:
import React from 'react';
const ComponentName = () => {
return (
<div>
</div>
);
};
export default ComponentName;
It looks small — but it adds up fast:
- ~10 seconds per component
- Dozens of components per week
- Hours lost on repetitive typing
The solution: Custom VS Code snippets that generate complete, production-ready components in seconds.
Step 1: Open Snippet Configuration
Press:
Ctrl + Shift + P
Then search:
Preferences: Configure User Snippets
Choose:
-
javascriptreact.json→ for.jsx -
typescriptreact.json→ for.tsx
Step 2: Add a Production-Ready Snippet Pack
Paste this into your snippet file:
{
"React Functional Component": {
"prefix": "rfc",
"body": [
"import React from 'react';",
"",
"const ${1:ComponentName} = () => {",
" return (",
" <div className=\"${2:container}\">",
" $3",
" </div>",
" );",
"};",
"",
"export default ${1:ComponentName};"
],
"description": "Generate a React functional component"
},
"React Component with Props": {
"prefix": "rcp",
"body": [
"import React from 'react';",
"import PropTypes from 'prop-types';",
"",
"const ${1:ComponentName} = ({ ${2:propName} }) => {",
" return (",
" <div>",
" $3",
" </div>",
" );",
"};",
"",
"${1:ComponentName}.propTypes = {",
" ${2:propName}: PropTypes.${4:string}.isRequired,",
"};",
"",
"export default ${1:ComponentName};"
],
"description": "React component with PropTypes"
},
"React Component with useState": {
"prefix": "rcs",
"body": [
"import React, { useState } from 'react';",
"",
"const ${1:ComponentName} = () => {",
" const [${2:state}, set${2/(.*)/${1:/capitalize}/}] = useState(${3:initialValue});",
"",
" return (",
" <div>",
" $4",
" </div>",
" );",
"};",
"",
"export default ${1:ComponentName};"
],
"description": "React component with useState hook"
},
"React Component with useEffect": {
"prefix": "rce",
"body": [
"import React, { useState, useEffect } from 'react';",
"",
"const ${1:ComponentName} = () => {",
" useEffect(() => {",
" $2",
" }, []);",
"",
" return (",
" <div>",
" $3",
" </div>",
" );",
"};",
"",
"export default ${1:ComponentName};"
],
"description": "React component with useEffect hook"
},
"React Component with CSS Module": {
"prefix": "rccss",
"body": [
"import React from 'react';",
"import styles from './${1:ComponentName}.module.css';",
"",
"const ${1:ComponentName} = () => {",
" return (",
" <div className={styles.${2:container}}>",
" $3",
" </div>",
" );",
"};",
"",
"export default ${1:ComponentName};"
],
"description": "React component with CSS Module"
},
"React Arrow Function Export": {
"prefix": "rafc",
"body": [
"export const ${1:ComponentName} = () => {",
" return (",
" <div>",
" $2",
" </div>",
" );",
"};"
],
"description": "Named export arrow function component"
}
}
Step 3: How to Use
Inside any .jsx or .tsx file:
| Prefix | Output |
|---|---|
rfc |
Functional component |
rcp |
Component with PropTypes |
rcs |
Component with useState |
rce |
Component with useEffect |
rccss |
Component with CSS Modules |
rafc |
Named export component |
Press Tab to expand and move through placeholders.
Pro Tips
1. Name Once, Reuse Everywhere
When you type the component name, it updates:
- Function name
- Export
- References
2. Build Snippets for Your Patterns
Look at your real codebase:
- API-heavy → create
rcapisnippet - Redux → include hooks
- Tailwind → prefill class names
3. Share With Your Team
Create a project-level snippet file:
.vscode/component.code-snippets
Commit it → everyone uses the same structure.
4. TypeScript Version
For .tsx:
"prefix": "rfc",
"body": [
"interface ${1:ComponentName}Props {",
" $2",
"}",
"",
"export const ${1:ComponentName} = ({ $3 }: ${1:ComponentName}Props) => {",
" return <div>$4</div>;",
"};"
]
Real Example
Without snippets:
Manual setup every time.
With rcs:
import React, { useState } from 'react';
const UserProfile = () => {
const [user, setUser] = useState({});
return (
<div>
{/* Your code */}
</div>
);
};
export default UserProfile;
Generated in seconds.
2-Minute Challenge
- Open VS Code
- Configure user snippets
- Paste the snippet pack
- Create a new file
- Type
rfc→ pressTab
You’ve just eliminated repetitive boilerplate permanently.
What This Really Solves
This isn’t about saving 10 seconds.
It’s about:
- Reducing friction
- Maintaining consistency
- Increasing output without burnout
Follow for more daily blogs
Write less boilerplate. Focus on logic.
Top comments (2)
The thing that caught my attention isn't the snippets themselves—those are solid—but the line about creating snippets for your actual codebase patterns. The API-heavy one, the Redux one, the Tailwind one. That's where this stops being a productivity tip and becomes something closer to architectural documentation.
I've noticed that the boilerplate I find most annoying to write isn't random—it's the patterns I haven't fully internalized yet. When I'm comfortable with a pattern, I type it without thinking. When I'm not, I hesitate, look up examples, copy-paste from another file, worry I'm missing something. Snippets end up being training wheels for the patterns that haven't settled into muscle memory yet. But the interesting side-effect is that by encoding those patterns as snippets, you're also making an explicit decision about what patterns the team should reach for by default. It's a gentle form of standardization that doesn't feel like a rule.
The project-level snippet file committed to the repo is the part I'd emphasize most. Individual snippets are personal preference. Shared snippets are a quiet way of saying "this is how we do things here" without writing a style guide nobody reads. Curious how you handle it when two developers on the team have genuinely different preferences for the same component pattern—do you let both snippets coexist, or does someone have to concede?
This is a great way to put it—"training wheels for the patterns that haven't settled into muscle memory yet." I think that's exactly right, and it points to something I hadn't fully articulated: snippets aren't just for speed, they're for reducing cognitive load during that awkward in-between phase where you know the pattern exists but can't quite trust yourself to write it cold.
On the team preference question—yeah, that's the real friction point. I've seen both approaches play out. Letting both snippets coexist sounds democratic, but in practice it tends to confuse newer devs ("which one am I supposed to use?") and can lead to PR comments that feel like style nitpicking. On the other hand, forcing one person to concede can breed quiet resentment, especially if the chosen pattern isn't objectively better, just the louder person's preference.
What I've landed on is using the shared snippet file as a forcing function for a conversation. Someone proposes a snippet for a pattern, and before it gets committed, the team has to agree on that pattern's shape. That five-minute discussion often surfaces why people prefer different approaches—maybe one handles edge cases better, maybe one is more readable, maybe it's just habit. Once that decision is made, the snippet encodes the team consensus, and the other preference becomes a local-only snippet for that one developer. They still type fast; they just don't drag the team into their habits.
Curious if you've ever had a snippet cause more confusion than it solved, despite everyone agreeing on it upfront?