$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Make Linting Great Again (Long version)
Search
Andrey Okonetchnikov
January 25, 2018
Programming
0
84
Make Linting Great Again (Long version)
Presented at Agent Conf 2018
Andrey Okonetchnikov
January 25, 2018
Tweet
Share
More Decks by Andrey Okonetchnikov
See All by Andrey Okonetchnikov
Component-Driven Design Systems Workshop
okonet
0
220
A Common Design Language
okonet
2
1.9k
Modular CSS v2 (CSS-in-JS edition)
okonet
3
1.1k
Make Linting Great Again
okonet
0
170
Modular CSS — Agent Conf '17 Edition
okonet
3
380
Modular CSS
okonet
3
280
JavaScript для насыщенных пользовательских интерфейсов
okonet
0
110
Профессия "Front-end архитектор"
okonet
0
160
Other Decks in Programming
See All in Programming
Rubyで鍛える仕組み化プロヂュース力
muryoimpl
0
160
実はマルチモーダルだった。ブラウザの組み込みAI🧠でWebの未来を感じてみよう #jsfes #gemini
n0bisuke2
3
1.3k
Implementation Patterns
denyspoltorak
0
120
ゲームの物理 剛体編
fadis
0
370
AIエージェントの設計で注意するべきポイント6選
har1101
5
2.3k
実は歴史的なアップデートだと思う AWS Interconnect - multicloud
maroon1st
0
260
Canon EOS R50 V と R5 Mark II 購入でみえてきた最近のデジイチ VR180 事情、そして VR180 静止画に活路を見出すまで
karad
0
140
TestingOsaka6_Ozono
o3
0
180
C-Shared Buildで突破するAI Agent バックテストの壁
po3rin
0
420
AIコーディングエージェント(Gemini)
kondai24
0
280
Findy AI+の開発、運用におけるMCP活用事例
starfish719
0
1.7k
Kotlin Multiplatform Meetup - Compose Multiplatform 외부 의존성 아키텍처 설계부터 운영까지
wisemuji
0
120
Featured
See All Featured
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.8k
The agentic SEO stack - context over prompts
schlessera
0
560
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
230
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
290
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
2
66
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
120
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.8k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
115
93k
Music & Morning Musume
bryan
46
7k
What's in a price? How to price your products and services
michaelherold
246
13k
[RailsConf 2023] Rails as a piece of cake
palkan
58
6.2k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
0
88
Transcript
Make Linting Great Again with @okonetchnikov
None
https://reason-conf.com
What the #$&% is lint?!
–Wikipedia “lint or a linter is any tool that flags
suspicious usage in software written in any computer language.”
–me “linter is a tool that finds stupid bugs.”
None
These things here :(
None
None
None
How to fix that?
Lint all the things!
Stylelint JSON Lint
Why lint?
– http://www.prweb.com/releases/2013/1/prweb10298185.htm “On average, software developers spend 50% of their
time finding and fixing bugs.”
– http://www.prweb.com/releases/2013/1/prweb10298185.htm “…this inefficiency is estimated to cost the global
economy $312 billion per year.”
None
In reality, though…
– http://www.prweb.com/releases/2013/1/prweb10298185.htm “On average, software developers spend 50% of their
time finding and fixing bugs.”
– me “On average, software developers spend 50% of their
time discussing code style.”
None
You don’t need to uglify your code if it’s already
ugly!
How to fix that?
One code style to rule them all!
None
None
Using linters & formatters leads to 1. Fewer (stupid) bugs
2. Better readability => less time in code reviews 3. But it can slow you down… :(
—Slow down?! —We’re not doing that then!
My typical day…
None
None
10 minutes later…
None
None
None
None
None
None
None
None
None
Raise your hand if this sound familiar to you ✋
None
None
None
428.689
None
2.844.799
– Everyone “I wish I could lint before committing the
changes to the repository”
git hooks
None
git hooks are 1. Hard to setup 2. Hard to
manage 3. Hard to share across the team
npm install -D husky yarn add --dev husky
{ "scripts": { "precommit": "eslint ." } }
None
None
Thanks husky! 1. Hard to setup 2. Hard to manage
3. Hard to share across the team
…but linting the whole project 1. Can be quite slow
2. Will display irrelevant results
None
What if we could run linters only on files we’re
about to commit?
Meet lint-staged!
npm install -D lint-staged yarn add --dev lint-staged
{ "scripts": { "precommit": "lint-staged" } }
{ "scripts": { "precommit": "lint-staged" }, "lint-staged": { "*.js": "eslint"
} }
None
git hooks are 1. Hard to setup 2. Hard to
manage 3. Hard to share across the team 4. Very slow 5. Displaying irrelevant results A WES OME!
There is more!
Automatically fix lint errors
{ "lint-staged": { "*.js": "eslint" } }
{ "lint-staged": { "*.js": [ "eslint --fix", "git add" ]
} }
Automatically reformat your code
None
{ "lint-staged": { "*.js": [ "eslint --fix", "git add" ]
} }
{ "lint-staged": { "*.js": [ "prettier --write", "git add" ]
} }
None
lint-staged and prettier being used in create-react-app
lint-staged and prettier being used in Babel!
How does it work?
#!/bin/bash executable=$(npm bin)/staged-files linter_name="eslint" linter_path=$(npm bin)/eslint lint_extensions="**/*.@(js|jsx)" if [[ -f
"${linter_path}" ]]; then echo "Running ${linter_name} on git staged files: $ {lint_extensions}" ${executable} "${lint_extensions}" -- ${linter_path} else echo "Could not find ${linter_name} at $ {linter_path}. Is it installed?" echo "" echo "Try running:" echo "npm install --save-dev ${linter_name}" fi
None
#!/bin/bash executable=$(npm bin)/staged-files linter_name="stylelint" linter_path=$(npm bin)/stylelint lint_extensions="**/*.@(css|scss|less|styl)" if [[ -f
"${linter_path}" ]]; then echo "Running ${linter_name} on git staged files: $ {lint_extensions}" ${executable} "${lint_extensions}" -- ${linter_path} else echo "Could not find ${linter_name} at $ {linter_path}. Is it installed?" echo "" echo "Try running:" echo "npm install --save-dev ${linter_name}" fi
#!/bin/bash executable=$(npm bin)/staged-files linter_name="flow" linter_path=$(npm bin)/flow lint_extensions="**/*.@(js|jsx)" if [[ -f
"${linter_path}" ]]; then echo "Running ${linter_name} on git staged files: $ {lint_extensions}" ${executable} "${lint_extensions}" -- ${linter_path} else echo "Could not find ${linter_name} at $ {linter_path}. Is it installed?" echo "" echo "Try running:" echo "npm install ${linter_name}-bin" fi
#!/bin/bash executable=$(npm bin)/staged-files linter_name="jscs" linter_path=$(npm bin)/jscs lint_extensions="**/*.@(js|jsx)" if [[ -f
"${linter_path}" ]]; then echo "Running ${linter_name} on git staged files: $ {lint_extensions}" ${executable} "${lint_extensions}" -- ${linter_path} else echo "Could not find ${linter_name} at $ {linter_path}. Is it installed?" echo "" echo "Try running:" echo "npm install --save-dev ${linter_name}" fi
DRY
Present
lint-staged is a tool that • Can run any task
• Easy to install via npm • Easy to distribute across the team (.lintstagedrc) • Easy to use (DX!)
Future?
None
None
None
None
None
None
Open Source = ❤
https://github.com/okonet/lint-staged
Maintainers ❤
None
Recap
None
Please solve real problems!
Thank You!
Andrey Okonetchnikov @okonetchnikov http://okonet.ru https://github.com/okonet