Mastering ESLint: Write JavaScript That Doesn’t Fight Back
Let’s be honest—JavaScript is flexible to the point of chaos. One minute you're writing elegant arrow functions, the next you’ve got a var
floating in the global scope from a forgotten side project. That’s where ESLint steps in: a brutally honest linter that saves you from your worst JavaScript habits.
I've watched entire teams battle over spacing and quotes. ESLint doesn’t just settle those arguments—it prevents them. More importantly, it prevents bugs. In this guide, I’ll walk you through how ESLint works, how to configure it without rage-quitting, and how it fits into a modern JavaScript workflow.
What is ESLint, Really?
At its core, ESLint is a static analysis tool. It reads your JavaScript without executing it, scans for syntax issues, anti-patterns, and style violations, and throws helpful warnings (or errors) in your face.
It catches things like:
- Unused variables
- Accidental global assignments
==
when you meant===
- Inconsistent indentation or quotes
- Rogue
console.log()
s in production
Think of it as the code reviewer that never sleeps.
Why ESLint Matters in 2025
JavaScript isn't typed by default. It won’t stop you from writing garbage. That freedom is great—until your app crashes because someone shadowed a variable inside a loop.
ESLint solves that with:
- Early warnings on logic mistakes
- Enforced team-wide style consistency
- Real-time editor feedback
- Integration into CI/CD for automated code reviews
- Fewer bugs slipping into production
It’s not about code being pretty. It’s about code being predictable.
How to Install ESLint (The Clean Way)
Install ESLint using your package manager of choice:
npm install eslint --save-dev
# or
yarn add eslint --dev
Then initialize:
npx eslint --init
It’ll walk you through:
- Target environments (Node, browser, etc.)
- Style guide preference (Airbnb, Standard, etc.)
- Config file format (JSON, JS, YAML)
You’ll end up with something like .eslintrc.json
.
Sample ESLint Config That Doesn’t Suck
{
"env": {
"browser": true,
"es2021": true,
"node": true
},
"extends": ["eslint:recommended"],
"parserOptions": {
"ecmaVersion": 12,
"sourceType": "module"
},
"rules": {
"no-unused-vars": "warn",
"eqeqeq": "error",
"semi": ["error", "always"],
"quotes": ["error", "single"]
}
}
It’s simple, modern, and strict enough to catch the usual suspects. You can always customize it later, but this will give your project some much-needed structure.
ESLint + Prettier: Avoiding the Style War
ESLint handles quality. Prettier handles formatting. They overlap, and if you don’t configure them properly, they’ll fight like siblings.
Fix that with:
npm install --save-dev prettier eslint-config-prettier
Then extend Prettier's rules in ESLint:
"extends": [
"eslint:recommended",
"plugin:prettier/recommended"
]
This disables conflicting style rules in ESLint and lets Prettier handle the formatting.
If you’re curious how this fits into modern workflows, we cover that in writing clean JavaScript code in production.
Run ESLint From the CLI
Lint a file:
npx eslint your-file.js
Lint your entire codebase:
npx eslint ./src
Fix issues automatically:
npx eslint ./src --fix
It’s incredibly satisfying to run --fix
and watch your code shape itself into something readable.
Editor Integration: Lint as You Type
Real-time linting in your editor is where ESLint really shines.
- VS Code: Install the official ESLint extension
- WebStorm: Built-in support
- Sublime Text: Use SublimeLinter + ESLint plugin
You’ll get inline feedback before your code even hits the terminal.
Automate Linting in CI/CD
Don’t rely on humans to catch issues. Make ESLint part of your deployment pipeline.
Here’s a GitHub Actions workflow:
name: Lint Code Base on: [push, pull_request] jobs: eslint: runs-on: ubuntu-latest steps:
- uses: actions/checkout@v2
- name: Install dependencies
run: npm install
- name: Run ESLint
run: npx eslint . --ext .js,.ts,.jsx,.tsx
No more arguing over console logs in pull requests—they’ll be blocked automatically.
ESLint Rules That Actually Matter
Here are a few rules you’ll want in every project:
no-unused-vars
: Don’t leave dead code lying aroundeqeqeq
: Use strict equality, alwaysno-console
: Catch strayconsole.log
sno-debugger
: Clean up after yourselfcurly
: Prevent bugs from missing bracesarrow-body-style
: Keep arrow functions clean
All of them are configurable—or disable them if they get in your way.
Extend ESLint With Plugins
You’re not stuck with base JavaScript rules.
Popular plugins:
eslint-plugin-react
– essential for JSXeslint-plugin-vue
– Vue-specific linting@typescript-eslint/eslint-plugin
– TypeScript supporteslint-plugin-import
– import/export hygiene
Just install, add to plugins
and extends
, and move on.
ESLint + TypeScript: Your New Power Combo
Linting TypeScript? You’ll want:
npm install --save-dev @typescript-eslint/parser @typescript-eslint/eslint-plugin
Then in your config:
{
"parser": "@typescript-eslint/parser",
"extends": ["plugin:@typescript-eslint/recommended"]
}
TypeScript adds types. ESLint makes sure you use them responsibly.
Final Thoughts: Lint Like a Pro
ESLint isn’t just a tool. It’s a long-term investment in your codebase.
Once you set it up, it quietly enforces quality, consistency, and sanity. It spots bugs before they make it to QA. It settles style debates before they start. It scales with your team, your codebase, and your tech stack.
The best part? You’ll write better code without thinking about it. And in 2025, with JavaScript more complex than ever, that’s not just nice—it’s necessary.