On this page
A useful editor setup catches mistakes early without making every save an unpredictable rewrite. For frontend development, that means separating language intelligence, linting, formatting, and framework support instead of installing several extensions that compete for the same job.
Start with tasks, not extension rankings
Write down three recurring problems before opening the marketplace: inconsistent formatting, missed lint errors, and unfamiliar API response shapes are good examples. Use the JSON to TypeScript tool with a sanitized sample response to draft interfaces, then inspect those interfaces in VS Code. Generated types describe the sample, not every possible server response, so review optional fields and nullability yourself.
Treat each extension as a dependency with access to your workspace. Check its publisher, maintenance history, requested capabilities, and documentation. Install from a trusted source and avoid look-alike names. The VS Code extension documentation explains management and workspace recommendations.
Create a minimal baseline first. VS Code already includes JavaScript and TypeScript language services, debugging, Git integration, Emmet, and JSON support. You do not need a separate extension simply to get TypeScript completion. Keep extensions only when they solve a problem the built-in features do not handle adequately.
Give ESLint and Prettier separate responsibilities
Install Microsoft's ESLint extension, identified as dbaeumer.vscode-eslint, when the repository uses ESLint. Its job is to surface the project's configured rules and apply supported fixes. Installing the extension alone does not establish a lint policy: the repository still needs compatible dependencies and configuration.
Use esbenp.prettier-vscode when the team has adopted Prettier. Let it control layout, including indentation, wrapping, and quote formatting. Keep potentially conflicting stylistic ESLint rules disabled with the project's chosen integration. Follow the Prettier editor integration guide rather than layering arbitrary format-on-save recipes from unrelated projects.
A small workspace configuration makes responsibility explicit:
{
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
},
"prettier.requireConfig": true
}Here, explicit saves can trigger ESLint fixes; do not assume every Auto Save event behaves identically. Requiring a Prettier configuration avoids unexpectedly formatting unrelated projects with personal defaults. In a mixed-language repository, use language-specific formatter settings where necessary rather than forcing Prettier onto unsupported files.
Test the arrangement on one intentionally untidy file. Save it, inspect the diff, and run the repository's formatting and lint commands. Editor feedback should agree with command-line checks; it must not become a second, undocumented source of truth.
Add framework intelligence only where needed
For Tailwind projects, the official Tailwind CSS IntelliSense extension, bradlc.vscode-tailwindcss, adds class suggestions, hover previews, and diagnostics. Confirm that the project's Tailwind version and stylesheet or configuration layout are supported. If completion is missing, investigate project detection before installing another class-completion extension.
Vue projects generally benefit from Vue - Official, while Svelte and Astro have their own official language extensions. Select the extension recommended by the framework's current documentation. Avoid leaving obsolete competing language servers active in the same workspace: duplicate diagnostics often look like code defects but actually come from competing tools.
Framework snippets are optional. A snippet that inserts an outdated component pattern can cost more time than it saves. Prefer a few team-maintained snippets for recurring structures, and review generated code just as carefully as handwritten code. Language support is essential; expanding boilerplate automatically is not.
For plain React with TypeScript, begin with the built-in TypeScript service. Choose the workspace TypeScript version when the repository requires it, then verify that imports and diagnostics match the command line. More extensions will not repair a mismatched compiler version.
Share recommendations without sharing personal preferences
Commit extension recommendations in the repository so new contributors can discover the supported setup. Recommendations suggest installations; they do not enforce them or install project dependencies.
{
"recommendations": [
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode",
"bradlc.vscode-tailwindcss"
]
}Place that document in .vscode/extensions.json and omit Tailwind when the project does not use it. Put agreed formatting behavior in workspace settings, but keep personal fonts, themes, keybindings, and terminal choices out of shared configuration. Explain required command-line checks in the contributor documentation.
Use separate VS Code profiles for work that genuinely needs different tooling. A frontend profile and a documentation profile can keep extension lists understandable without constantly uninstalling packages. For remote containers or SSH sessions, check whether an extension belongs locally or on the remote extension host.
The VS Code Workspace Trust guide is particularly important when opening unfamiliar repositories. Do not approve a workspace merely because its recommended extensions look familiar. Review tasks, scripts, and configuration before enabling execution-capable features.
Diagnose slowdowns with a repeatable audit
When typing or saving becomes slow, measure the delay on a small, representative file. Note whether the pause occurs during completion, formatting, lint fixes, or file watching. Large generated directories and monorepo-wide analysis can cause trouble even with a short extension list.
Use VS Code's running-extension diagnostics to inspect activation and runtime behavior. Try a clean profile, then use Extension Bisect when a third-party extension appears responsible. Reproduce the same action each time; otherwise the search is comparing different workloads. Check output channels for ESLint and the relevant language server before changing source code to silence a tooling problem.
Audit workspace scope as well. Exclude generated output from searches and avoid opening a parent folder containing dozens of unrelated projects. In monorepos, ESLint working-directory configuration may be necessary, but it should follow the repository's actual layout rather than a copied universal setting.
Keep a short acceptance checklist: completion works, errors appear, formatting is stable, and command-line checks pass. Broader development resources can help identify whether a problem belongs to the editor or build tooling. Use the dev-tools guides when documenting the resulting workflow, rather than making the extension list itself the onboarding plan.
Key takeaways
- Start with built-in capabilities and add extensions for specific missing tasks.
- Assign formatting to Prettier and code-quality rules to the project's ESLint configuration.
- Share recommendations and repository behavior, not personal editor preferences.
- Match framework extensions and TypeScript versions to the actual project.
- Diagnose slowdowns with repeatable actions before adding more tooling.
Reach designers & developers at work
Put your product next to the tools people use every day. One sponsor per placement, no tracking pixels.
Become a sponsor