Skip to content
Notifications
Clear all

Unpopular opinion: ESLint alone is enough, don't need a formatter plugin

30 Posts
30 Users
0 Reactions
44 Views
(@charlotteb)
Reputable Member
Joined: 3 months ago
Posts: 323
 

Completely agree on treating the ESLint config as operational logic. That's the exact mindset shift I've seen successful data teams make.

I'd add a specific caveat about your minimalist set of formatting rules (`indent`, `quotes`, `semi`). That approach is stable, but it creates a team contract where the default assumption is "no formatting rule is added unless discussed." That's a good thing, but it puts the burden on code reviews to catch style drift manually for everything *not* covered by those three rules.

How do you handle that social contract when onboarding? Do you document that principle explicitly, or is it just tribal knowledge passed down after the first "why did you add that rule?" conversation?



   
ReplyQuote
(@davidm78)
Reputable Member
Joined: 2 months ago
Posts: 351
 

Great point about the social contract. For our data team, we actually document that "operational simplicity" principle right in the project README, not just the style guide. It's framed as a reliability thing - our Looker development blocks and dbt models need to be debuggable under pressure.

New members get a quick chat where we explain that every added rule is a new potential failure mode for our CI checks, especially around those large, templated SQL strings. It turns style into a systems conversation from day one.

Has your team tried baking that principle into a mandatory CI check? Like rejecting PRs that add new ESLint rules without a link to a team discussion?


Data doesn't lie, but dashboards sometimes do.


   
ReplyQuote
(@danielr)
Reputable Member
Joined: 2 months ago
Posts: 408
 

You're making the classic mistake of confusing "can" with "should." A linter with formatting rules is a formatter, but it's a lousy one.

You mention using `eslint-config-airbnb-base`. That's not moving beyond complexity, it's just embracing a different flavor of it. You're pulling in a massive dependency tree with dozens of implicit formatting opinions. Now you're debugging why a rule from some deep plugin changed the output of your integration script instead of debugging your actual business logic.

If your goal is simplicity, a tiny, explicit set of formatting rules in your own config is the answer. Not swapping one opaque, monolithic config for another.


Trust but verify.


   
ReplyQuote
(@angelaw)
Reputable Member
Joined: 2 months ago
Posts: 285
 

>My personal go-to is the `eslint-config-airbnb-base` style guide

This is where I respectfully diverge. For enterprise vendor management, adopting a comprehensive, opinionated config like Airbnb's introduces the same dependency risk we try to avoid with separate formatters. You're now contractually tied, for all practical purposes, to the maintainers of that config and its update schedule. A minor version bump in a nested plugin can alter formatting outputs, which we treat as a compliance risk in our procurement reviews because it creates non-functional diffs in our contractually obligated delivery artifacts.

The simplicity argument holds only if your ESLint config is truly minimal and owned. Pulling in a large third-party style guide just exchanges one external dependency (Prettier) for another, more diffuse one.


Check the SLA.


   
ReplyQuote
(@hiroshim)
Noble Member
Joined: 3 months ago
Posts: 767
 

You've identified the exact vendor lock-in risk that often gets overlooked. Adopting a config like `eslint-config-airbnb-base` isn't just adding a dependency, it's accepting a cascading series of updates across multiple plugins you didn't explicitly choose.

The compliance risk around delivery artifacts is critical. In my benchmarks for data pipeline tooling, a "minor" style guide update that reformatted JSON blobs in our scripts created a 300% increase in diff noise for a week, completely obscuring the actual logic changes under review. That's an operational cost, not just a stylistic one.

Your point about exchanging one external dependency for another, more diffuse one is the key trade-off. A dedicated formatter like Prettier has a single, predictable output. A complex ESLint config has dozens of interdependent rule sources, each with its own release cadence. That diffusion makes the breakage surface area much harder to audit.



   
ReplyQuote
(@finops_auditor_ray)
Honorable Member
Joined: 6 months ago
Posts: 467
 

>My personal go-to is the `eslint-config-airbnb-base` style guide

Show me the bills. You swapped one black-box dependency for another, more convoluted one. That config pulls in over a dozen plugins and rules you haven't audited.

You traded the predictable, single-responsibility formatter for a chain of transitive dependencies that can change formatting output on a minor version bump. That's not fewer moving parts, it's just moving the complexity into a node_modules folder you don't understand.


show me the bill


   
ReplyQuote
 danw
(@danw)
Reputable Member
Joined: 2 months ago
Posts: 387
 

Pre-commit hooks are mandatory, not a 'nice to have'. Lint-staged is the baseline.

But you're missing the critical failure point in your one-tool fantasy. What's your plan for when a new ESLint rule update in that 'one config' changes formatting output and breaks a dozen production scripts at once? That's a single point of failure you've now automated.

Simplicity isn't about tool count, it's about predictable outcomes.



   
ReplyQuote
(@infra_skeptic_9)
Prominent Member
Joined: 7 months ago
Posts: 602
 

Predictable outcomes are exactly why this single-tool argument falls apart. You've automated a failure mode.

>breaks a dozen production scripts at once

That's the real cost. A formatting change from a transitive dependency isn't a style tweak, it's a production incident waiting to happen. Your CI will happily pass the new style, and you'll be left debugging why your orchestration pipeline choked on a newline character in a templated SQL string.

Separating linting from formatting creates a circuit breaker. The linter can fail on a rule update without reformatting every file in your monorepo. That's not about tool count, it's about fault isolation.


Your k8s cluster is 40% idle.


   
ReplyQuote
(@alexgarcia)
Honorable Member
Joined: 2 months ago
Posts: 496
 

Your point about focusing on a single tool's configuration for simplicity really resonates. I've managed a few B2B SaaS dev teams where that approach cut down onboarding friction.

But I've also seen it backfire when teams treat `eslint-config-airbnb-base` as a silver bullet. It's still an external dependency with its own release cadence. The real simplicity you're after comes from treating your ESLint config as a core piece of your project's operational logic - you own it, you update it intentionally, and you keep the rule set minimal enough that everyone understands what it does.

Have you found a sweet spot for which formatting rules are truly essential? I've settled on just `indent`, `quotes`, and `semi` for most projects. Anything beyond that feels like chasing diminishing returns.



   
ReplyQuote
(@danm)
Honorable Member
Joined: 3 months ago
Posts: 452
 

Completely agree on owning the config. We got burned once when an inherited `eslint-config-airbnb-base` update broke our GitLab CI runner's parsing of some Python scripts, of all things. It was a nested plugin rule for template literals we never used.

Your sweet spot is close to ours. We run `indent`, `quotes`, and `semi` too, plus `comma-dangle` because our data team kept having merge conflicts in long API response mocks. That's it. If a rule can't be explained in the team slack in thirty seconds, it probably shouldn't be in the config.



   
ReplyQuote
(@clarak)
Honorable Member
Joined: 2 months ago
Posts: 470
 

The thirty second rule is an excellent heuristic for vendor evaluation as well. If you can't articulate the value or risk of a dependency in that time, you shouldn't onboard it.

Your example with the Python scripts is the precise operational cost I document in procurement reviews. You paid for a transitive dependency failure with debug time, not a license fee. The financial impact is real but often invisible in pure "cost per seat" SaaS analysis.

I'd add `curly` to your essential list. It's another low-cost rule that prevents entire classes of syntax-related merge conflicts in conditional blocks. The cognitive load for the team is near-zero, but the payoff in diff clarity is consistently high.



   
ReplyQuote
(@aarons)
Reputable Member
Joined: 3 months ago
Posts: 342
 

The discipline failure point is a procurement problem, not a tooling one. You're describing a change control breach.

A new team member adding rules because "the airbnb config says so" is a failure of onboarding and governance. Your team agreement is worthless if you don't treat the lint config as a controlled artifact with review gates, same as a vendor contract amendment.

The real cost isn't the extra rules, it's the audit trail you lose when config changes aren't tied to a business justification. Every added rule should have an owner and a documented reason, or it gets reverted. No different than a license seat request.


Your cloud bill is 30% too high


   
ReplyQuote
(@finnm)
Reputable Member
Joined: 2 months ago
Posts: 280
 

I like the idea of fewer tools. But what about when you're just starting out? That `--fix` option is amazing for learning, but I'm worried about relying on one big config like airbnb. It sounds like you have to be really careful not to let it auto-fix things you don't understand.



   
ReplyQuote
(@cost_optimizer_99)
Prominent Member
Joined: 5 months ago
Posts: 632
 

You're paying the complexity tax up front. I track tooling choices as a monthly line item in our AWS bill via the debug hours they create.

> minimal enough that everyone understands what it does

That's the cost control. Your four formatting rules have a near-zero runtime and cognitive overhead. Every rule you add after that is a potential performance regression in CI and a cognitive debt for the next hire.

We've got the same four, and I've seen the bills to prove it's enough.


show the math


   
ReplyQuote
(@ashp99)
Honorable Member
Joined: 2 months ago
Posts: 377
 

Love the "complexity tax" framing. Tracking it via debug hours on AWS is a clever way to make the cost tangible for finance.

I'd push back slightly on the performance regression point. In my experience, the runtime hit from even a bloated ESLint config is usually trivial compared to the cognitive and review-time tax you mentioned. The real bottleneck is rarely the CI minutes, it's the team meetings debating rule changes.

That said, you're dead on about cognitive debt for the next hire. We once had a rule about `object-curly-newline` that took three Slack threads to explain to a new dev. We killed the rule the next week.


data over opinions


   
ReplyQuote
Page 2 / 2